Sont des clés étrangères vraiment nécessaire, dans une conception de base de données?

StackOverflow https://stackoverflow.com/questions/18717

  •  09-06-2019
  •  | 
  •  

Question

Autant que je sache, les clés étrangères (FK) sont utilisés pour de l'aide le programmeur de manipuler les données de manière correcte.Supposons qu'un programmeur est en train de faire de la bonne manière déjà, alors avons-nous vraiment besoin de la notion de clés étrangères?

Existe-il d'autres utilisations pour les clés étrangères?Suis-je manqué quelque chose?

Était-ce utile?

La solution

Les clés étrangères aider à appliquer l'intégrité référentielle au niveau des données.Ils améliorent également les performances car ils sont généralement indexés par défaut.

Autres conseils

Les clés étrangères peuvent aussi aider le programmeur d'écrire moins de code à l'aide des choses comme ON DELETE CASCADE.Cela signifie que si vous avez un tableau contenant les utilisateurs et l'autre contenant les commandes ou quelque chose, puis la suppression d'un utilisateur peut supprimer automatiquement toutes les commandes de ce point de l'utilisateur.

Je ne peux pas imaginer la conception d'une base de données sans les clés étrangères.Sans eux, finalement, vous êtes tenu de faire une erreur et de corrompre l'intégrité de vos données.

Ils ne sont pas requis, à proprement parler, mais les avantages sont énormes.

Je suis assez certain que FogBugz ne pas avoir de contraintes de clés étrangères dans la base de données.Je serais intéressé de savoir comment le Fog Creek Software l'équipe de structures leur code afin de garantir qu'ils ne seront jamais à introduire une incohérence.

Un schéma de base de données sans contraintes FK, c'est comme conduire sans ceinture de sécurité.

Un jour, vous le regretterez.Pas de dépenses que peu de temps supplémentaire sur la conception fondamentaux et de l'intégrité des données est un sûr moyen d'assurer des maux de tête plus tard.

Acceptez-vous de code dans votre application qui a été bâclée?Directement accessible à la membre des objets et modifié les structures de données directement.

Pourquoi pensez-vous que cela a été dur et même inacceptable dans les langues modernes?

Oui.

  1. Ils vous garder honnête
  2. Ils gardent les nouveaux développeurs honnêtes
  3. Vous pouvez le faire ON DELETE CASCADE
  4. Ils vous aider à générer des diagrammes de nice que l'auto expliquer les liens entre les tables

Personnellement, je suis en faveur de clés étrangères, parce qu'il formalise la relation entre les tables.Je me rends compte que votre question présuppose que le programmeur n'est pas l'introduction de données qui serait en violation de l'intégrité référentielle, mais j'ai vu beaucoup trop de cas où les données de l'intégrité référentielle n'est pas respectée, malgré les meilleures intentions!

Pré-contraintes de clé étrangère (aka l'intégrité référentielle déclarative ou DRI) beaucoup de temps a été passé à la mise en œuvre de ces relations à l'aide de déclencheurs.Le fait que l'on peut formaliser la relation par une contrainte déclarative est très puissant.

@Jean - d'Autres bases de données peut automatiquement créer des index pour les clés étrangères, mais SQL Server ne prend pas.Dans SQL Server, les relations de clé étrangère ne sont que des contraintes.Vous devez défini votre index sur les clés étrangères séparément (ce qui peut être un avantage.)

Edit:Je tiens à ajouter que, l'OMI, l'utilisation de clés étrangères, à l'appui de SUR SUPPRIMER ou SUR la mise à JOUR en CASCADE n'est pas nécessairement une bonne chose.Dans la pratique, j'ai constaté que la cascade on delete devrait être soigneusement examinée sur la base de la relation des données (par exemple,avez-vous un naturel parent-enfant où cela peut être OK ou est la table liée à un ensemble de valeurs de recherche.À l'aide de mises à jour en cascade implique, vous permettant à la clé primaire d'une table pour être modifié.Dans ce cas, j'ai un général philosophiques désaccord en ce que la clé primaire d'une table ne doit pas changer.Les clés doivent être intrinsèquement constante.

Supposons qu'un programmeur est en train de faire de la bonne manière déjà

Faire une telle supposition me semble être une très mauvaise idée;en général, le logiciel est extrêmement buggé.

Et c'est le point, vraiment.Les développeurs ne peuvent pas faire les choses, afin de garantir que la base de données ne peut pas être rempli avec les données de mauvaise qualité est une Bonne Chose.

Bien que dans un monde idéal, les jointures naturelles serait d'utiliser les relations (c'est à direContraintes FK) plutôt que de correspondance des noms de colonne.Ce serait FKs encore plus utile.

Sans une clé étrangère comment pouvez-vous dire que les deux enregistrements dans des tables différentes sont liés?

Je pense que vous faites allusion à l'est de l'intégrité référentielle, où l'enfant enregistrement n'est pas autorisé à être créé sans enregistrement parent etc.Ce sont souvent connus comme les contraintes de clé étrangère - mais ne sont pas à confondre avec l'existence de clés étrangères dans la première place.

Est-il un avantage à ne pas avoir les clés étrangères?Sauf si vous utilisez une base de données de merde, FKs ne sont pas si dur à mettre en place.Alors, pourquoi auriez-vous une politique de les éviter?C'est une chose d'avoir une convention de nommage qui dit que la colonne fait référence à un autre, c'est une autre de savoir la base de données est en fait la vérification de la relation pour vous.

Je suppose que vous parlez les contraintes de clés étrangères appliquées par la base de données.Vous avez probablement déjà à l'aide de clés étrangères, vous ne vous êtes pas dit que la base de données à ce sujet.

Supposons qu'un programmeur est en train de faire de la bonne manière déjà, alors avons-nous vraiment besoin de la notion de les clés étrangères?

Théoriquement, aucun.Cependant, il n'y a jamais été un morceau de logiciel sans bugs.

Des Bugs dans le code de l'application ne sont généralement pas dangereuses - vous identifier le bug et le corriger, et après que l'application fonctionne à nouveau correctement.Mais si un bug permet currupt de données pour entrer dans la base de données, puis vous êtes coincé avec elle!Il est très difficile de le récupérer à partir de corrompre les données dans la base de données.

Considère que si un bug subtil dans FogBugz permis à une corruption de la clé étrangère d'être écrite dans la base de données.Il pourrait être facile de corriger le bug et rapidement pousser les fixer à des clients dans une version de correction.Cependant, comment la corruption des données dans des dizaines de bases de données fixe? Correct ce code peut maintenant se briser parce que les hypothèses sur l'intégrité des clés étrangères ne tient plus.

Dans les applications web que vous habituellement seulement avoir un programme en parlant de la base de données, donc il n'y a qu'un seul endroit où les insectes peuvent endommager les données.Dans une application d'entreprise il pourrait y avoir plusieurs applications indépendantes de parler de la même base de données (pour ne pas mentionner les personnes travaillant directement avec la base de données shell).Il n'y a aucun moyen d'être sûr que toutes les applications suivent les mêmes hypothèses sans les bugs, toujours et à jamais.

Si les contraintes sont encodées dans la base de données, le pire qui peut arriver avec des bugs, c'est que l'utilisateur est montré un vilain message d'erreur à propos de certains SQL contrainte n'est pas satisfaite.C'est beaucoup prefereable à laisser currupt des données dans votre base de données d'entreprise, où il sera à son tour briser toutes vos applications, ou tout simplement conduire à toutes sortes de faux ou trompeurs de sortie.

Oh, et les contraintes de clé étrangère améliore également les performances, car ils sont indexés par défaut.Je ne peux pas penser à une raison quelconque pas pour utiliser les contraintes de clé étrangère.

FKs sont très importantes et doivent toujours exister dans votre schéma, sauf si vous êtes eBay.

Je pense quelque chose à un certain point doit être responsable de s'assurer des relations valides.

Par exemple, Ruby on Rails ne pas utiliser de clés étrangères, mais il valide toutes les relations de lui-même.Si vous ne jamais accéder à votre base de données à partir que Ruby on Rails application, c'est très bien.

Toutefois, si vous avez d'autres clients qui sont de l'écriture à la base de données, puis sans les clés étrangères dont ils ont besoin pour mettre en œuvre leur propre validation.Vous avez donc deux copies de la validation de code qui sont les plus susceptibles de différent, qui tout programmeur doit être en mesure de dire est un péché cardinal.

À ce stade, les clés étrangères sont vraiment nécessaires, car ils vous permettent de déplacer la responsabilité à un seul point de nouveau.

Les clés étrangères de permettre à quelqu'un qui n'a pas vu votre base de données avant de déterminer la relation entre les tables.

Tout ce qui peut être bon maintenant, mais pensez à ce qui va se passer lors de votre programmeur feuilles et quelqu'un d'autre doit prendre le relais.

Les clés étrangères, leur permettant de comprendre la structure de base de données sans le chalutage par le biais de milliers de lignes de code.

Autant que je sache, les clés étrangères sont utilisés pour aider le programmeur de manipuler les données de manière correcte.

FKs permettre à l'administrateur de la base pour protéger l'intégrité des données de la maladresse des utilisateurs lorsque le programmeur échoue pour ce faire, et parfois, pour se protéger contre la maladresse des programmeurs.

Supposons qu'un programmeur est en train de faire de la bonne manière déjà, alors avons-nous vraiment besoin de la notion de clés étrangères?

Les programmeurs sont mortels et faillible.FKs sont déclarative qui les rend plus difficiles à visser.

Existe-il d'autres utilisations pour les clés étrangères?Suis-je manqué quelque chose?

Bien que ce n'est pas pourquoi ils ont été créés, FKs fournir fiable faisant allusion à des outils de création de diagrammes et d'interroger les constructeurs.C'est répercuté sur les utilisateurs finaux, qui ont désespérément besoin d'fiable de conseils.

Ils ne sont pas strictement nécessaires, dans la façon dont les ceintures de sécurité ne sont pas strictement nécessaires.Mais ils peuvent vraiment vous sauver de faire quelque chose de stupide qui bousille votre base de données.

C'est tellement plus agréable pour déboguer un FK erreur de contrainte que d'avoir à reconstruire une suppression qui a éclaté à votre demande.

Ils sont importants parce que votre application n'est pas la seule façon dont les données peuvent être manipulées dans la base de données.Votre application peut gérer l'intégrité référentielle que honnêtement comme il veut, mais il suffit d'un bozo, avec les privilèges appropriés pour l'accompagner et le problème de l'insertion, la suppression ou mise à jour de commande au niveau base de données, et tous vos application de l'intégrité référentielle application de la loi est contournée.Mettre FK contraintes au niveau base de données signifie que, en l'absence de cette bozo le choix de désactiver le FK contrainte avant d'émettre leur commande, le FK contrainte sera la cause d'une mauvaise insert/update/delete échec avec une violation de l'intégrité référentielle.

J'y pense en termes de coût/bénéfice...Dans MySQL, l'ajout d'une contrainte est une seule ligne supplémentaire de DDL.C'est juste une poignée de mots clés et un couple de secondes de la pensée.C'est le seul "coût" à mon avis...

Les outils de l'amour des clés étrangères.Les clés étrangères d'éviter les mauvaises données (orphelins lignes) qui ne peut pas affecter une logique d'entreprise ou à la fonctionnalité et à cet effet, passer inaperçu, et de construire.Elle empêche également les développeurs qui ne sont pas familiers avec le schéma de mise en œuvre de toute morceaux de travailler sans se rendre compte qu'il manque une relation.Peut-être que tout est grand dans le cadre de votre application en cours, mais si vous avez manqué quelque chose, et, un jour, quelque chose d'inattendu est ajouté (pensez fantaisie reporting), vous pourriez être dans un endroit où vous devez nettoyer à la main les mauvaises données accumulées depuis la création du schéma sans une base de données appliquées vérifier.

Le peu de temps qu'il faut pour codifier ce qui est déjà dans votre tête quand vous êtes à mettre ensemble des choses pourrait vous éviter de vous ou de quelqu'un d'autre un tas de chagrin des mois ou des années en bas de la route.

La question:

Existe-il d'autres utilisations pour étrangers les touches?Suis-je manqué quelque chose?

Il est un peu chargé.Insérer des commentaires, indentation ou l'appellation variable à la place de "clés étrangères"...Si vous avez déjà comprendre la chose en question parfaitement, c'est "rien" pour vous.

Diminution d'entropie.De réduire le risque de chaotique scénarios à se produire dans la base de données.Nous avons un moment difficile car c'est compte tenu de tous les possiblilites donc, à mon avis, diminution d'entropie est la clé de la maintenance de tout système.

Lorsque nous faisons une hypothèse par exemple:chaque commande a un client que l'hypothèse doit être exécutée par quelque chose.Dans les bases de données que ce "quelque chose" est de clés étrangères.

Je pense que cela vaut la peine de la différence dans la vitesse de développement.Bien sûr, vous pouvez coder plus rapidement avec eux et c'est probablement la raison pour laquelle certaines personnes ne les utilisent pas.Personnellement, j'ai tué un certain nombre d'heures avec NHibernate et certains contrainte de clé étrangère qui se met en colère quand j'ai effectuer une certaine opération.CEPENDANT, je sais quel est le problème si c'est moins un problème.Je suis une utilisation normale des outils et des ressources pour m'aider à contourner ce problème, peut-être même des gens pour vous aider!

L'alternative est de permettre à un bug à s'infiltrer dans le système (et donné assez de temps, ça viendra) où une clé étrangère n'est pas défini et vos données devient incohérent.Ensuite, vous obtenez une inhabituelle rapport de bug, d'enquêter et de "OH".La base de données est vissé.Maintenant combien de temps est-ce que cela va prendre pour résoudre ce problème?

Vous pouvez afficher les clés étrangères comme une contrainte qui,

  • Aider à maintenir l'intégrité des données
  • Montrer comment les données sont liées les unes aux autres (ce qui peut les aider dans l'application de la logique métier et les règles)
  • Si utilisé correctement, peut aider à augmenter l'efficacité avec laquelle les données sont lues à partir des tables.

Nous n'avons pas actuellement l'utilisation des clés étrangères.Et pour la plupart, nous ne le regrette pas.

Que dit - nous avons plus de chances de commencer à les utiliser beaucoup plus dans un avenir proche, pour plusieurs raisons, à la fois pour des raisons similaires:

  1. Création de diagrammes.C'est tellement plus facile de produire un schéma d'une base de données si il y a des relations de clé étrangère sont correctement utilisés.

  2. Le support de l'outil.C'est beaucoup plus facile de construire des modèles de données à l'aide de Visual Studio 2008 qui peut être utilisé pour LINQ to SQL si il y a de bonne relations de clé étrangère.

Donc je suppose que mon point est que nous avons constaté que si nous faisons beaucoup de manuel SQL travaux (construction de requêtes, exécuter la requête, blahblahblah) les clés étrangères ne sont pas nécessairement des essentielles.Une fois que vous commencez à obtenir en utilisant des outils, cependant, ils deviennent beaucoup plus utile.

La meilleure chose à propos des contraintes de clés étrangères (et contraintes en général, vraiment) que vous pouvez compter sur eux lors de l'écriture des requêtes.Beaucoup de requêtes peut devenir beaucoup plus compliqué si vous ne pouvez pas compter sur le modèle de données holding "vrai".

Dans le code, nous allons généralement juste obtenez une exception quelque part - mais dans SQL, nous allons généralement viens d'obtenir la "mauvaise" réponse.

En théorie, SQL Server pourrait utiliser les contraintes dans le cadre d'un plan de requête - mais à l'exception de la vérification des contraintes pour le partitionnement, je ne peux pas dire que je n'ai jamais réellement vu que.

Les clés étrangères n'avait jamais été explicite (CLÉ ÉTRANGÈRE de la table de RÉFÉRENCES(colonne)) déclarés dans les projets (applications d'entreprise et les sites web de réseautage social), qui je travaillais.

Mais il y avait toujours une sorte de convention de nommage des colonnes qui ont été les clés étrangères.

C'est comme avec normalisation de base de données -- vous devez savoir ce que vous faites et ce que sont la conséquence de cette (principalement de la performance).

Je suis conscient des avantages de clés étrangères (intégrité des données, l'indice de colonne de clé étrangère, les outils de connaissance de schéma de base de données), mais aussi j'ai peur d'utiliser des clés étrangères en tant que règle générale.

Aussi différents moteurs de base de données pourrait servir de clés étrangères d'une manière différente, ce qui pourrait conduire à des bogues lors de la migration.

Suppression de toutes les commandes et les factures du client supprimé avec on DELETE CASCADE est le parfait exemple d'agréable à regarder, mais mal conçu, schéma de base de données.

Oui.La clause on DELETE [RESTRICT|CASCADE] permet aux développeurs de données d'échouages, en gardant les données propres.Récemment, j'ai rejoint une équipe de développeurs web qui ne se concentre pas sur la base de données des contraintes telles que les clés étrangères.

Heureusement, j'ai trouvé ceux-ci: http://www.redhillonrails.org/foreign_key_associations.html -- RedHill sur Ruby on Rails plugins générer des clés étrangères à l'aide de la convention over configuration style.Une migration avec product_id permettra de créer une clé étrangère à la id dans le produits table.

Découvrez les autres plugins à RedHill, y compris les migrations enveloppé dans les transactions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top