35 votes

Pourquoi les migrations Rails définissent-elles des clés étrangères dans l'application mais pas dans la base de données?

Si je définis Customer et Order modèle dans lequel un Customer "a beaucoup de" Orders et de la Order "appartient à" l' Customer, dans les Rails, nous parlons Order d'avoir une clé étrangère à l' Customer par customer_id mais nous ne voulons pas dire que c'est exécutée dans la base de données.

Parce que les Rails ne définit pas ce qu'une base de données-niveau de contrainte, il y a un risque de votre intégrité des données violé, peut-être en dehors de l'application (ou à l'intérieur si vous recevez des demandes simultanées?), à moins que vous appliquer la contrainte dans la base de données manuellement.

Pourquoi ne Rails de ne pas définir la clé étrangère au niveau base de données ou est-il un moyen d'obtenir des Rails pour ce faire?

class Customer < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
    belongs_to :customer
end

ActiveRecord::Schema.define(:version => 1) do

  create_table "customers", :force => true do |t|
    t.string   "name"
  end

  create_table "orders", :force => true do |t|
    t.string   "item_name"
    t.integer  "customer_id"
  end

end

22voto

Bill Karwin Points 204877

Rails détient certaines conventions que le respect de l'intégrité des données doit être effectué à la demande, et non pas dans la base de données.

Par exemple, les Rails prend même en charge certaines conceptions de base de données qui ne peuvent pas utiliser les clés étrangères, comme Polymorphe Associations.

Fondamentalement, les Rails conventions ont traité de la base de données statique périphérique de stockage de données, pas un actif SGBDR. Rails 2.0 est enfin le soutien de certains plus réaliste dispose de bases de données SQL. Il n'est pas surprenant que le résultat sera que le développement avec des Rails va devenir plus complexe qu'elle ne l'était dans la version 1.0.

13voto

Ian Terrell Points 6551

Après avoir travaillé avec ce problème pendant un certain temps, je ne pense pas que c'est une partie de la base Rails de la philosophie, que les clés étrangères ne doit pas être imposé par la base de données.

Le niveau d'application des validations et des vérifications sont là pour fournir facile, rapide, lisible par l'homme (pensez messages d'erreur) vérifie que le travail dans 99,99% du temps. Si votre application nécessite plus de cela, vous devez utiliser la base de données des contraintes de niveau.

Je pense que cette "philosophie" ont évolué en raison de l'analyse initiale des cadres utilisés: les clés étrangères seulement s'est avéré être un gigantesque tracas lors de l'utilisation de luminaires. C'est comme lors d'un "bug" devient une "fonctionnalité" parce que personne ne la corrige. (Si je suis misremembering de l'histoire, quelqu'un me corrige.)

Au minimum, il y a un mouvement de plus en plus au sein de la communauté Rails pour faire respecter l'intégrité de la base de données. Consultez cet article de blog du mois dernier. Elle a même des liens vers des plugins qui permettent d'offrir un soutien pour la gestion des erreurs (et un autre billet de blog que des liens vers d'autres plugins). Faire un peu plus de recherches avec Google; j'ai vu d'autres plugins qui ajoutent des migrations pour créer des clés étrangères, trop.

Maintenant, quelle est la partie de la base Rails philosophie est la suivante: Ne vous inquiétez pas sur les choses, sauf si vous avez réellement besoin. Pour beaucoup d'applications web, il est probablement ok si un de petite taille (minuscule) pourcentage d'enregistrements contenant des données non valides. Les Pages qui pourraient être affectées peuvent que très rarement être consultées, ou l'erreur peut être traitée correctement déjà. Ou peut-être que c'est moins cher (comme dans, l'argent comptant dur froid) afin de résoudre les problèmes par la main pour les 6 prochains mois alors que la demande croît que c'est de dépenser de l'élaboration de la planification des ressources pour toutes les éventualités maintenant. En fait, si votre cas d'utilisation ne pas le faire paraître tout important, et il peut vraiment être causée par une condition de concurrence qui peut arriver 1/10000000 demandes... eh bien, est-il utile?

Donc ma prédiction est que les outils de printemps pour gérer l'ensemble de la situation par défaut, et finalement ces obtiendrez fusionné dans Rails 3. En attendant, si votre application a vraiment besoin, ajoutez-les. Il va provoquer une légère tests de maux de tête, mais rien que vous ne pouvez pas obtenir avec des simulacres et des talons. Et si votre application n'a pas vraiment besoin... eh bien, vous êtes tous bien déjà. :)

6voto

Dave Taylor Points 31

Après de nombreuses décennies dans l'industrie, je crois fermement qu'une bonne conception de base de données permettra d'économiser une application à partir de nombreux problèmes, en particulier lorsqu'il subit des améliorations. Si il est connu qu'une contrainte de garder l'intégrité de base de données, même après une programmation de glissement (je suis sûr que je ne suis pas le seul à le faire), puis par tous les moyens doivent être appliquées à la base de données si possible. Je voudrais donc encourager les gens à utiliser les clés étrangères dans la mesure du possible. Je voudrais également envisager d'utiliser des tests pour assurer l'intégrité des données. Pour nous le savons tous sur la loi de murphy.

2voto

mipadi Points 135410

Cela crée une colonne customer_id (évidemment). Toutefois, dans la plupart des cas, Rails croit en l’application de contraintes et de validations au niveau de l’ application plutôt qu’au niveau de la base de données; c'est pourquoi les colonnes, par défaut, dans Rails peuvent contenir des valeurs NULL , même si vous avez validates_presence_of ou quelque chose du genre. Les développeurs de Rails considèrent que de telles contraintes doivent être gérées par l'application, et non par la base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X