249 votes

Quel est le problème avec les clés étrangères?

Je me souviens avoir entendu Joel Spolsky mention dans le podcast 014 qu'il avait à peine jamais utilisé une clé étrangère (si je me souviens bien). Cependant, pour moi, ils semblent assez vital pour éviter la duplication et suivantes problèmes d'intégrité des données tout au long de votre base de données.

Les gens ont de solides raisons pour expliquer pourquoi (pour éviter une discussion en lignes, avec un Débordement de Pile principes)?

Edit: "je n'ai pas encore une raison pour créer une clé étrangère, donc cela pourrait être ma première raison de créer un".

343voto

SquareCog Points 12947

Raisons d'utiliser des Clés Étrangères:

  • vous n'obtiendrez pas Orphelins Lignes
  • vous pouvez obtenir de belles "on delete cascade" comportement, automatiquement le nettoyage des tables
  • connaître les relations entre les tables dans la base de données permet à l'Optimiseur de planifier vos requêtes pour la plupart d'exécution efficace, car il est en mesure d'obtenir de meilleures estimations sur rejoindre la cardinalité.
  • FKs donner un assez gros soupçon sur quelles sont les statistiques les plus importantes pour recueillir sur la base de données, qui à son tour conduit à une meilleure performance
  • ils permettent à tous les types de auto-généré de soutien-Orm peuvent générer eux-mêmes, les outils de visualisation sera en mesure de créer une belle schéma de mises en page pour vous, etc
  • quelqu'un de nouveau pour le projet va entrer dans le flux des choses plus vite car sinon implicite relations sont explicitement documentées

Raisons de ne pas utiliser les Clés Étrangères:

  • vous faites de la bd de travail supplémentaire sur chaque opération CRUD, car il s'agit de vérifier FK cohérence. Cela peut être un gros coût si vous avez beaucoup de désabonnement
  • en appliquant les relations, FKs spécifier l'ordre dans lequel vous avez à ajouter/supprimer des choses, ce qui peut entraîner le refus par la DB à faire ce que vous voulez. (Certes, dans de tels cas, ce que vous essayez de faire est de créer un Orphelin Ligne, et ce n'est généralement pas une bonne chose). C'est encore plus douloureux quand vous faites de grandes mises à jour par lot, et de vous charger de l'un tableau avant de l'autre, avec la deuxième table de la création de l'état cohérent (mais devriez-vous faire ce genre de chose, si il ya une possibilité que le deuxième chargement échoue et votre base de données est désormais incompatible?).
  • parfois, vous savez à l'avance vos données vont être sale, vous acceptez que, et que vous voulez la DB à l'accepter
  • vous êtes juste d'être paresseux :-)

Je pense (je ne suis pas certain!) que la plupart des créé des bases de données fournissent un moyen de spécifier une clé étrangère qui n'est pas appliquée, et est tout simplement un peu de métadonnées. Depuis la non-application de la loi efface toutes les raisons de ne pas utiliser FKs, vous devriez probablement aller dans cette voie si l'un des motifs dans la deuxième section s'appliquent.

80voto

Ed Lucas Points 502

C'est une question d'éducation. Si quelque part dans votre éducation ou de carrière professionnelle de vous passé de temps à l'alimentation et les soins pour les bases de données (ou a travaillé en étroite collaboration avec des gens talentueux qui a fait), alors les principes fondamentaux de entités et les relations sont bien ancrées dans votre processus de pensée. Parmi ces rudiments est comment/quand/pourquoi pour spécifier les clés de votre base de données (primaires, étrangères et peut-être d'autres). Il est une seconde nature.

Si, toutefois, vous n'avez pas eu une telle approfondie ou une expérience positive de votre passé avec SGBDR-projets connexes, alors vous avez probablement pas été exposés à de telles informations. Ou peut-être votre dernière comprend l'immersion dans un environnement qui a été largement anti-base de données (par exemple, "ceux Administrateurs de bases de données sont des idiots - nous quelques-uns, nous avons choisi quelques java/c# code frondeurs sauvera le jour"), dans ce cas, vous pourriez être farouchement opposés à l'arcane babblings de quelques faible vous dire que FKs (et les contraintes qu'elles peuvent impliquer) sont vraiment important si vous voulez juste écouter.

La plupart des tout le monde a appris quand ils étaient des enfants que le brossage des dents est important. Pouvez-vous en tirer sans elle? Bien sûr, mais quelque part en bas de la ligne, vous aurez moins de dents que vous pourriez avoir si vous aviez brossé, après chaque repas. Si les mamans et les papas étaient assez responsable pour couvrir conception de base de données ainsi que l'hygiène buccale, nous ne serions pas avoir cette conversation. :-)

52voto

AlexCuse Points 9823

pour citer Joe Celko,

"comme une taille 26 thong, juste parce que vous pouvez ne signifie pas que vous devriez!"

Je suis sûr qu'il ya beaucoup d'applications où vous pouvez sortir avec elle, mais ses pas la meilleure idée. Vous ne pouvez pas toujours compter sur votre demande afin de bien gérer votre base de données, et franchement, la gestion de la base de données ne doit pas être de très grande inquiétude à votre demande.

Si vous utilisez un relationnel de la base de données il semble alors vous devriez avoir quelques relations qui y sont définis. Malheureusement, cette attitude (vous n'avez pas besoin de clé étrangère) semble être embrassé par beaucoup de développeurs d'application qui serait plutôt de ne pas être dérangé par des choses idiotes comme l'intégrité des données (mais besoin parce que leurs entreprises n'ont pas de base de données dédié aux développeurs). Généralement dans les bases de données mis en place par ces types de vous avez de la chance juste pour avoir les clés primaires ;)

41voto

Galwegian Points 29966

Les clés étrangères sont essentiels pour tout modèle de base de données relationnelle.

29voto

Ant Points 3202

J'ai toujours l'utiliser, mais puis-je faire des bases de données pour les systèmes financiers. La base de données est la partie critique de l'application. Si les données dans une base de données financière n'est pas tout à fait exacte, alors il n'a vraiment pas d'importance combien d'effort vous mettez dans votre code avant la fin de la conception. Vous êtes juste de gaspiller votre temps.

Il y a aussi le fait que plusieurs systèmes ont généralement besoin d'une interface directe avec la base de données à partir d'autres systèmes que juste lire des données (Crystal Reports) pour les systèmes insérer des données (pas nécessairement à l'aide d'une API, j'ai conçu; il peut être écrit par un mat d'esprit gestionnaire qui vient de découvrir le VBScript et a le mot de passe pour SQL encadré). Si la base de données n'est pas aussi idiot-proof comme il peut éventuellement être, bien - bye bye base de données.

Si vos données sont importantes, alors oui, l'utilisation des clés étrangères, de créer une suite de procédures stockées pour interagir avec les données, et de les rendre les plus difficiles DB vous pouvez. Si vos données n'est pas important, pourquoi faites-vous une base de données pour commencer?

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