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

je me souviens avoir entendu Joel Spolsky la mention podcast 014 qu'il avait à peine jamais utilisé une clé étrangère (si je me souviens bien). Cependant, pour moi, ils semblent assez essentiels pour éviter la duplication et les problèmes ultérieurs d'intégrité des données dans 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."

237
demandé sur Zolomon 2008-09-17 17:25:54

30 réponses

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 aide L'Optimiseur planifier vos requêtes pour l'exécution la plus efficace, car il est en mesure d'obtenir de meilleures estimations sur Rejoindre la cardinalité.
  • FKS donner un indice assez grand sur ce que les statistiques sont les plus importantes à recueillir sur la base de données, ce qui à son tour conduit à de meilleures performances
  • ils activent toutes sortes de support généré automatiquement -- les ORMs peuvent se générer eux-mêmes, les outils de visualisation seront capables de créer de belles mises en page de schéma pour vous, etc.
  • quelqu'un de nouveau dans le projet entrera dans le flux des choses plus rapidement car autrement les relations implicites sont explicitement documentées

raisons de ne pas use clé étrangère:

  • vous faites le travail supplémentaire DB sur chaque CRUD opération parce qu'il doit vérifier la cohérence FK. Cela peut être un grand coût si vous avez beaucoup de roulement
  • en faisant respecter les relations, FKs spécifie un ordre dans lequel vous devez ajouter/supprimer des choses, ce qui peut conduire à un refus de la part de la DB de faire ce que vous voulez. (Accordé, dans de tels cas, ce que vous essayez de faire est de créer une rangée D'orphelins, et qui est généralement pas une bonne chose). Cela est particulièrement douloureux lorsque vous faites des mises à jour par lots de grande taille, et que vous chargez une table avant une autre, avec la deuxième table créant un état cohérent (mais devriez-vous faire ce genre de chose s'il y a une possibilité que la deuxième charge échoue et que votre base de données est maintenant incohérente?).
  • parfois vous savez à l'avance que vos données vont être sales, vous acceptez cela, et vous voulez que la DB l'accepte
  • vous êtes juste être paresseux :-)

je pense (je n'en suis pas certaine!) que la plupart des bases de données établies fournissent un moyen de spécifier une clé étrangère qui n'est pas appliquée, et est simplement un peu de métadonnées. Étant donné que la non-application élimine toutes les raisons de ne pas utiliser les FK, vous devriez probablement suivre cette voie si l'une des raisons de la deuxième section s'applique.

332
répondu SquareCog 2018-09-18 07:10:29

C'est une question d'éducation. Si, au cours de votre formation ou de votre carrière professionnelle, vous avez passé du temps à alimenter des bases de données et à vous en occuper (ou si vous avez travaillé en étroite collaboration avec des personnes talentueuses qui l'ont fait), alors les principes fondamentaux des entités et des relations sont bien ancrés dans votre processus de réflexion. Parmi ces rudiments se trouve comment/quand/pourquoi spécifier des clés dans votre base de données (primaire, étrangère et peut-être alternative). Il est une seconde nature.

si, cependant, vous n'avez pas eu un tel expérience complète ou positive dans votre passé avec les efforts liés à RDBMS, alors vous n'avez probablement pas été exposés à de telles informations. Ou peut-être que votre passé inclut l'immersion dans un environnement qui était bruyamment anti - base de données (par exemple, "ces Ads sont idiots-nous quelques-uns, nous avons choisi peu de java/C# code slingers va sauver le jour"), dans ce cas, vous pourriez être véhémemment opposé aux babillages obscurs de certains dweeb vous disant que FKs (et les contraintes qu'ils peuvent impliquer) sont vraiment important si vous avez il suffit d'écouter.

la plupart des gens ont appris quand ils étaient enfants que se brosser les dents était important. Pouvez-vous en tirer sans elle? Bien sûr, mais quelque part en bas de la ligne, vous aurez moins de dents disponibles que vous pourriez avoir si vous aviez brossé après chaque repas. Si les mères et les pères étaient assez responsables pour couvrir la conception de la base de données ainsi que l'hygiène orale, nous n'aurions pas cette conversation. :- )

75
répondu Ed Lucas 2008-09-17 16:55:17

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 ce n'est pas la meilleure idée. Vous ne pouvez pas toujours compter sur votre application pour gérer correctement votre base de données, et franchement la gestion de la base de données ne devrait pas être très préoccupante pour votre application.

si vous utilisez une base de données relationnelle alors il semble que vous devriez avoir quelques relationships défini dans elle. Malheureusement cette attitude (vous n'avez pas besoin de clés étrangères) semble être adopté par un grand nombre de développeurs d'applications qui ne préféreraient pas être embêtés avec des choses stupides comme l'intégrité des données (mais ont besoin de parce que leurs entreprises n'ont pas de développeurs de base de données dédiés). Généralement dans des bases de données mises en place par ces types vous avez de la chance juste pour avoir les clés primaires ;)

49
répondu AlexCuse 2018-09-19 08:44:39

les clés étrangères sont essentielles à tout modèle de base de données relationnelles.

38
répondu Galwegian 2008-09-17 15:42:59

je les utilise toujours, mais ensuite je fais 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 d'une base de données financière ne sont pas totalement exactes, alors il n'a vraiment pas d'importance combien d'efforts vous mettez dans votre code/front-end conception. Vous êtes juste de gaspiller votre temps.

Il ya aussi le fait que plusieurs systèmes ont généralement besoin d'interface directement avec la base de données - à partir d'autres systèmes qui viennent de lire les données (Crystal Rapports) aux systèmes qui insèrent des données (pas nécessairement en utilisant une API que j'ai conçue; elle peut être écrite par un gestionnaire borné qui vient de découvrir VBScript et a le mot de passe SA pour la boîte SQL). Si la base de données n'est pas aussi stupide que possible, adieu La base de données.

si vos données sont importantes, alors oui, utilisez des clés étrangères, créez une suite de procédures stockées pour interagir avec les données, et faire le DB le plus difficile que vous pouvez. Si vos données ne sont pas importantes, pourquoi faites-vous une base de données pour commencer?

28
répondu Ant 2008-09-17 13:40:21

les clés étrangères compliquent les tests automatisés

Suppose que tu utilises des clés étrangères. Vous écrivez un test automatisé qui dit "Quand je mets à jour un compte financier, il devrait enregistrer un enregistrement de la transaction."Dans ce test, vous n'êtes concerné que par deux tableaux: accounts et transactions .

cependant, accounts a une clé étrangère à contracts , et contracts a une fk À clients , et clients a une FK À cities , et cities a un fk À states .

maintenant la base de données ne vous permettra pas d'exécuter votre test sans configurer des données dans quatre tables qui ne sont pas liées à votre test .

il y a au moins deux perspectives possibles à ce sujet:

  • " c'est une bonne chose: votre test doit être réaliste, et ces contraintes de données existeront en production."
  • " c'est une mauvaise chose: vous devriez pouvoir assembler des pièces de test du système sans impliquer d'autres pièces. Vous pouvez ajouter des tests d'intégration pour l'ensemble du système."

il peut également être possible de désactiver temporairement les vérifications de clés étrangères pendant les essais. MySQL, au moins, soutient ce .


majuscules : j'utilise toujours des clés étrangères maintenant. Mon réponse à l'objection "ils compliqué testing" est "écrire des tests unitaires, de sorte qu'ils n'ont pas besoin de la base de données. Tous les tests qui utilisent la base de données devraient l'utiliser correctement, et cela inclut les clés étrangères. Si l'installation est douloureux, trouver un moins douloureuse pour faire l'installation."

17
répondu Nathan Long 2017-02-02 22:23:24

@imphasing-c'est exactement le genre d'état d'esprit qui provoque des cauchemars d'entretien.

pourquoi, oh Pourquoi voulez-vous ignorer déclarative de l'intégrité référentielle, où les données peuvent être garanti pour être au moins conformes, en faveur de soi-disant "logiciel d'application", ce qui est un faible mesure préventive, au mieux.

14
répondu Ed Guiness 2008-09-17 13:36:15

" ils peuvent rendre la suppression des enregistrements plus compliquée - vous ne pouvez pas supprimer l'enregistrement "maître" lorsqu'il y a des enregistrements dans d'autres tables où des clés étrangères violeraient cette contrainte."

il est important de se rappeler que la norme SQL définit les actions qui sont prises lorsqu'une clé étrangère est supprimée ou mise à jour. Ceux que je connais sont:

  • ON DELETE RESTRICT - empêche toutes les lignes dans l'autre table qui ont des clés dans cette colonne de en cours de suppression. C'est ce que Ken Ray a décrit ci-dessus.
  • ON DELETE CASCADE - si une ligne de l'autre tableau est supprimée, supprimer les lignes de ce tableau qui s'y rapportent.
  • ON DELETE SET DEFAULT - si une ligne de l'autre tableau est supprimée, définissez toute clé étrangère la renvoyant à la valeur par défaut de la colonne.
  • ON DELETE SET NULL - si une ligne dans l'autre tableau est supprimée, définissez toutes les clés étrangères qui s'y rapportent dans ce tableau à null.
  • ON DELETE NO ACTION - Cette clé étrangère seulement les marques qu'elle est une clé étrangère, à savoir l'utilisation dans OU cartographes.

ces mêmes actions s'appliquent également à ON UPDATE .

la valeur par défaut semble dépendre du serveur que vous utilisez.

14
répondu Powerlord 2018-09-19 15:24:50

il y a une bonne raison de ne pas les utiliser: si vous ne comprenez pas leur rôle ou comment les utiliser.

dans les mauvaises situations, les contraintes de clé étrangère peuvent conduire à la répétition des chutes d'eau des accidents. Si quelqu'un enlève le mauvais disque, le défaire peut devenir une tâche gigantesque.

aussi, à l'inverse, quand vous avez besoin d'enlever quelque chose, si mal conçu, les contraintes peuvent causer toutes sortes de serrures qui empêchent vous.

12
répondu Kent Fredric 2008-09-17 13:34:04

Il n'y a pas bon raisons pas à les utiliser... a moins que les rangs d'orphelins ne soient pas une grosse affaire pour toi, je suppose.

11
répondu Matt Rogish 2008-09-17 13:27:57

plus grande question Est: voulez-vous conduire avec un bandeau sur les yeux? C'est ainsi si vous développez un système sans contraintes référentielles. Gardez à l'esprit que les exigences opérationnelles changent, la conception de l'application change, les hypothèses logiques respectives dans les changements de code, la logique elle-même peut être remaniée, et ainsi de suite. En général, les contraintes dans les bases de données sont mises en place selon des hypothèses logiques contemporaines, apparemment correctes pour un ensemble particulier d'assertions et d'hypothèses logiques.

tout au long du cycle de vie d'une application, les contraintes de référentiel et de vérification des données commandent la collecte de données via l'application, en particulier lorsque de nouvelles exigences entraînent des changements d'application logique.

au sujet de cette inscription - une clé étrangère n'améliore pas en soi la "performance", et ne "dégrade pas la performance" de façon significative du point de vue du système de traitement des transactions en temps réel. Cependant, il y a un coût agrégé pour le contrôle des contraintes dans le système de " lot " à fort volume. Ainsi, voici la différence entre le processus de transaction en temps réel et le processus de transaction par lots; le traitement par lots-où le coût accru, induit par des vérifications de contraintes, d'un lot traité de façon séquentielle pose un problème de performance.

dans un système bien conçu, les vérifications de la cohérence des données seraient effectuées "avant" le traitement d'un lot par (néanmoins, il y a un coût associé ici aussi); par conséquent, les vérifications des contraintes de clé étrangère sont non requis pendant le temps de charge. En fait, toutes les contraintes, y compris la clé étrangère, doivent être temporairement désactivées jusqu'à ce que le lot est traité.

QUERY PERFORMANCE - si les tables sont jointes sur des clés étrangères, être conscient du fait que les colonnes de clés étrangères ne sont pas indexées (bien que la clé primaire respective est indexée par définition). En indexant une clé étrangère, d'ailleurs, en indexant n'importe quelle clé, et en joignant des tables sur indexé aide à mieux les performances, et non pas en se joignant à une clé non indexée avec une contrainte de clé étrangère sur celle-ci.

Changing subjects , si une base de données ne prend en charge que l'affichage du site web/le rendu du contenu/etc et l'enregistrement des clics, alors une base de données avec toutes les contraintes sur toutes les tables est plus que kill pour de telles fins. Pensez à ce sujet. La plupart des sites Web n'utilisent même pas de base de données pour cela. Pour des exigences similaires, lorsque les données sont simplement enregistrées et ne sont pas référencées par exemple, utiliser un base de données en mémoire, qui n'ont pas de contraintes. Cela ne signifie pas qu'il n'y a pas de modèle de données, Oui Modèle logique, mais pas de modèle de données physiques.

5
répondu jasbir L 2009-10-05 06:58:33

raison supplémentaire d'utiliser des clés étrangères: - Permet une plus grande réutilisation d'une base de données

raison supplémentaire de ne pas utiliser de clés étrangères: - Vous essayez de verrouiller un client dans votre outil en réduisant la réutilisation.

3
répondu Dan 2008-09-17 15:17:56

"avant d'ajouter un document, vérifier qu'un document correspondant existe dans un autre tableau" est logique opérationnelle.

voici quelques raisons pour lesquelles vous ne voulez pas cela dans la base de données:

  1. si les règles commerciales changent, vous devez changer la base de données. La base de données devra recréer l'index dans de nombreux cas, ce qui est lent sur les grandes tables. (Les règles changeantes incluent: permettre aux invités de poster des messages ou permettre aux utilisateurs de supprimer leur compte en dépit d'avoir posté des commentaires, etc).

  2. changer la base de données n'est pas aussi facile que de déployer un correctif logiciel en poussant les modifications sur le dépôt de production. Nous voulons éviter de modifier la structure de base de données autant que possible. Plus il y a de logique commerciale dans la base de données, plus vous augmentez les chances de devoir changer les bases de données (et de déclencher une nouvelle indexation).

  3. TDD. Dans tests unitaires vous pouvez remplacer la base de données par des mocks et tester la fonctionnalité. Si vous avez n'importe quelle logique d'affaires dans votre base de données, vous ne faites pas des tests complets et devrait soit tester avec la base de données ou répliquer la logique d'affaires dans le code pour des buts de test, dupliquer la logique et augmenter la vraisemblance de la logique ne fonctionne pas de la même manière.

  4. réutilisez votre logique avec différentes sources de données. Si il n'y a pas de logique dans l' base de données, mon application peut créer des objets à partir de dossiers de la base de données, les créer à partir d'un service web, un fichier json ou toute autre source. J'ai juste besoin d'échanger l'implémentation de data mapper et je peux utiliser toute ma logique d'entreprise avec n'importe quelle source. S'il y a de la logique dans la base de données, ce n'est pas possible et vous devez implémenter la logique à la couche data mapper ou dans la logique d'affaires. Dans tous les cas, vous avez besoin de ces chèques dans votre code. S'il n'y a pas de logique dans la base de données, je peux déployer le application dans des endroits différents en utilisant différentes implémentations de bases de données ou de fichiers plats.

3
répondu Tom B 2018-01-14 08:38:58

je suis d'accord avec les réponses précédentes en ce sens qu'elles sont utiles pour assurer la cohérence des données. Cependant, il y avait un poste intéressant par Jeff Atwood Il ya quelques semaines qui a discuté des avantages et des inconvénients de données normalisées et cohérentes.

en quelques mots, une base de données dénormalisée peut être plus rapide lorsque vous manipulez d'énormes quantités de données; et vous ne vous souciez peut-être pas d'une cohérence précise selon l'application, mais cela vous oblige à être beaucoup plus attention aux données, car le DB ne le sera pas.

2
répondu Santiago Palladino 2008-09-17 13:33:40

de mon expérience il est toujours préférable d'éviter d'utiliser FKs dans les Applications critiques de base de données. Je ne serais pas en désaccord avec les gars ici qui disent que FKs est une bonne pratique, mais ce n'est pas pratique lorsque la base de données est énorme et a d'énormes opérations CRUD/sec. Je peux partager sans nommer ... une des plus grandes banques d'investissement de n'a pas un seul FK dans les bases de données. Ces contraintes sont gérées par les programmeurs tout en créant des applications impliquant DB. La raison de base est quand jamais une nouvelle crotte est fait il doit effectuer des tables multiples et vérifier pour chaque inserts/mises à jour, bien que ce ne sera pas un gros problème pour les requêtes affectant des lignes simples, mais il ne crée une latence énorme lorsque vous traitez du traitement par lots qui n'importe quelle grande banque doit faire comme des tâches quotidiennes.

il est préférable d'éviter les FKs, mais son risque doit être pris en charge par les programmeurs.

2
répondu Rachit 2014-10-13 10:02:02

Je ne connais que les bases de données Oracle, aucune autre, et je peux dire que les clés étrangères sont essentielles pour maintenir l'intégrité des données. Avant d'insérer des données, il faut établir une structure de données et la corriger. Lorsque c'est fait - et donc toutes les clés primaires ET étrangères sont créés - le travail est fait !

ce qui signifie : les rangs des orphelins ? Aucun. Jamais vu de ma vie. Sauf si un mauvais programmeur a oublié la clé étrangère, ou s'il l'a implémentée à un autre niveau. Les deux sont - dans le contexte D'Oracle - énormes erreurs, ce qui conduira à la duplication de données, données orphelines, et donc : la corruption de données. Je ne peux pas imaginer une base de données sans FK forcé. Ça ressemble au chaos pour moi. C'est un peu comme le système de permission Unix : imaginez que tout le monde est root. Penser le chaos.

les clés étrangères sont essentielles, tout comme les clés primaires. C'est comme dire : et si on enlevait les clés primaires ? Eh bien, un chaos total va se produire. C'est ce que. Vous ne pouvez pas déplacer le responsabilité principale ou clé étrangère au niveau de la programmation, elle doit se situer au niveau des données.

inconvénients ? Oui, absolument ! Parce que lors de l'insertion, beaucoup plus de contrôles vont arriver. Mais si l'intégrité des données est plus importante que la performance, c'est évident. Le problème avec la performance sur Oracle est plus lié aux index, qui viennent avec PK et FK.

2
répondu tvCa 2014-11-23 14:01:56

ils peuvent rendre la suppression des enregistrements plus compliquée - vous ne pouvez pas supprimer l'enregistrement" maître " lorsqu'il y a des enregistrements dans d'autres tables où des clés étrangères violeraient cette contrainte. Vous pouvez utiliser des déclencheurs d'avoir les suppressions en cascade.

si vous avez choisi votre clé primaire sans le vouloir, changer cette valeur devient encore plus complexe. Par exemple, si j'ai le PK de ma table "clients" comme nom de la personne, et faire de cette clé un FK dans la table" commandes", si le client veut changer son nom, alors il est une douleur royale... mais c'est juste une conception de base de données de mauvaise qualité.

je crois que les avantages de l'utilisation des touches fireign surpassent tous les désavantages supposés.

1
répondu Ken Ray 2008-09-17 13:31:08

vérifier les contraintes de clé étrangère prend un certain temps CPU, donc certaines personnes omettent les clés étrangères pour obtenir des performances supplémentaires.

1
répondu remonedo 2008-09-17 13:34:15

la base de données Clarify est un exemple de base de données commerciale qui n'a pas de clés primaires ou étrangères.

http://www.geekinterview.com/question_details/18869

le plus drôle, c'est que la documentation technique va très loin pour expliquer comment les tables sont reliées, quelles colonnes utiliser pour les rejoindre, etc.

en d'autres termes, ils auraient pu avoir rejoint les tableaux avec déclarations explicites (DRI) mais ils ont choisi de ne pas .

par conséquent, la base de données Clarify est pleine d'incohérences et sous-performante.

mais je suppose que cela a rendu le travail des développeurs plus facile, ne pas avoir à écrire du code pour traiter l'intégrité référentielle tels que la vérification des lignes connexes avant de supprimer, ajoutant.

et que, je pense, est le principal avantage de ne pas avoir des contraintes de clé étrangère dans un base de données relationnelle. Cela facilite son développement, du moins du point de vue du diable.

1
répondu Ed Guiness 2008-09-17 13:34:29

j'ai aussi entendu cet argument - de la part de gens qui ont oublié de mettre un index sur leurs clés étrangères et qui se sont ensuite plaints que certaines opérations étaient lentes (parce que la vérification des contraintes pouvait profiter de n'importe quel index). En résumé: il n'y a pas de bonne raison de ne pas utiliser les clés étrangères. Toutes les bases de données modernes prennent en charge les suppressions en cascade, donc...

1
répondu Arno 2008-09-17 13:38:46

l'argument que j'ai entendu est que le front-end devrait avoir ces règles d'affaires. Les clés étrangères "ajoutent inutile overhead" quand vous ne devriez pas permettre des insertions qui cassent vos contraintes en premier lieu. Dois-je d'accord avec cela? Non, mais c'est ce que j'ai toujours entendu.

EDIT: je crois qu'il faisait référence à les contraintes de clé étrangère , pas les clés étrangères en tant que concept.

1
répondu lordscarlet 2008-09-17 13:39:16

pour moi, si vous voulez passer par les normes ACID , il est essentiel d'avoir des clés étrangères pour assurer l'intégrité référentielle.

1
répondu CodeRot 2008-09-17 14:13:02

je dois la deuxième plupart des commentaires ici, les clés étrangères sont des éléments nécessaires pour assurer que vous avez des données avec intégrité. Les différentes options pour ON DELETE et ON UPDATE vous permettront de contourner certaines des "chutes" que les gens mentionnent ici concernant leur utilisation.

je trouve que dans 99% de tous mes projets, je vais avoir FK pour faire respecter l'intégrité des données, cependant, il ya ces rares occasions où j'ai des clients qui doivent garder leurs anciennes données, indépendamment de la façon dont il est mauvais....mais ensuite, je passe beaucoup de temps à écrire du code qui va seulement pour obtenir les données valides de toute façon, donc il devient inutile.

1
répondu Mitchel Sellers 2008-09-17 14:17:50

Qu'en est-il de la maintenabilité et de la constance à travers les cycles de vie des applications? La plupart des données ont une durée de vie plus longue que les applications qui les utilisent. Les relations et l'intégrité des données sont bien trop importantes pour laisser l'espoir que la prochaine équipe de développement l'obtienne correctement dans le code app. Si vous n'avez pas travaillé sur un db avec des données sales qui ne respectent pas les relations naturelles, vous le ferez. L'importance de l'intégrité des données devient alors très clair.

1
répondu 2008-09-17 16:08:21

je pense aussi que les clés étrangères sont une nécessité dans la plupart des bases de données. Le seul inconvénient (outre le hit de performance qui vient avec avoir la consistance forcée) est que d'avoir une clé étrangère permet aux gens d'écrire du code qui suppose qu'il y a une clé étrangère fonctionnelle. Qui ne devrait jamais être autorisé.

par exemple, j'ai vu des gens écrire du code qui insère dans la table référencée et puis tente inserts dans la table référencée sans vérifier la première insert a été couronnée de succès. Si la clé étrangère est retirée ultérieurement, la base de données est incohérente.

vous n'avez pas non plus l'option d'assumer un comportement spécifique lors de la mise à jour ou de la suppression. Vous devez toujours écrire votre code pour faire ce que vous voulez qu'il y est une clé étrangère qui présente. Si vous assumez les suppressions sont en cascade quand ils ne sont pas vos suppressions échouera. Si vous supposez que les mises à jour des colonnes référencées sont proposées au référencement les lignes quand elles ne le sont pas, vos mises à jour échoueront. Pour les besoins de l'écriture de code, vous pourriez aussi bien ne pas avoir ces caractéristiques.

si ces fonctionnalités sont activées, alors votre code les émulera de toute façon et vous perdrez un peu de performance.

Donc, le résumé.... Les clés étrangères sont essentielles si vous avez besoin d'une base de données cohérente. Les clés étrangères ne devraient jamais être considérées comme présentes ou fonctionnelles dans le code que vous écrivez.

1
répondu Eric 2008-09-17 16:23:39

je me fais l'écho de la réponse de Dmitriy-très bien dit.

pour ceux qui s'inquiètent de la performance overhead FK souvent apporter, Il ya un moyen (dans Oracle), vous pouvez obtenir l'optimiseur de requête avantage de la contrainte FK sans frais généraux de la validation de la contrainte lors de l'insertion, supprimer ou mettre à jour. C'est-à-dire créer la contrainte FK avec les attributs fiables désactiver NOVALIDATE. Cela signifie que l'optimiseur de requête suppose que la contrainte a été appliquée lorsque construire des requêtes, sans que la base de données n'impose réellement la contrainte. Vous devez être très prudent ici pour prendre la responsabilité quand vous peuplez une table avec une contrainte FK comme ceci pour s'assurer absolument que vous n'avez pas de données dans votre colonne FK qui violent la contrainte, comme si vous le faites pour que vous puissiez obtenir des résultats peu fiables à partir de requêtes qui impliquent la table sur laquelle cette contrainte FK est.

j'utilise habituellement cette stratégie sur certaines tables dans mon schéma data mart, mais pas dans mon schéma de mise en scène intégrée. Je m'assure que les tables dont je copie les données ont déjà la même contrainte imposée, ou que la routine ETL impose la contrainte.

1
répondu Mike McAllister 2008-09-17 16:58:36

beaucoup de ceux qui répondent ici sont trop accrochés à l'importance de l'intégrité référentielle mise en œuvre par le biais de contraintes référentielles. Travail sur de grandes bases de données avec intégrité référentielle juste ne pas effectuer. Oracle semble particulièrement mauvais à la cascade deletes. Ma règle de base est que les applications ne doivent jamais mettre à jour la base de données directement et doivent être via une procédure stockée. Cela maintient la base de code à l'intérieur de la base de données, et signifie que la base de données maintient son intégrité.

lorsque de nombreuses applications peuvent accéder à la base de données, des problèmes surviennent en raison de contraintes d'intégrité référentielle, mais il s'agit d'un contrôle.

il y a aussi un problème plus vaste en ce sens que les développeurs d'applications peuvent avoir des exigences très différentes que les développeurs de bases de données ne connaissent pas nécessairement.

1
répondu Zak 2013-03-26 17:55:27

si vous êtes absolument sûr que le seul système de base de données sous-jacent ne changera pas à l'avenir, j'utiliserais des clés étrangères pour assurer l'intégrité des données.

Mais voici une autre très bonne raison réelle de ne pas utiliser de clés étrangères du tout:

vous développez un produit, qui devrait prendre en charge différents systèmes de base de données.

si vous travaillez avec le framework Entity, qui est capable de connectez - vous à de nombreux systèmes de base de données différents, vous pouvez également vouloir prendre en charge les bases de données "open-source-free-of-charge" serverless. Toutes ces bases de données ne peuvent pas supporter vos règles de clé étrangère (mise à jour, suppression de lignes)...).

cela peut conduire à différents problèmes:

1.) Il se peut que vous rencontriez des erreurs lorsque la structure de la base de données est créée ou mise à jour. Peut-être qu'il n'y aura que des erreurs silencieuses, parce que vos clés étrangères sont simplement ignorées par le système de base de données.

2. Si vous comptez sur des clés étrangères, vous effectuerez probablement moins ou même aucun contrôle d'intégrité des données dans votre logique d'entreprise. Maintenant, si le nouveau système de base de données ne supporte pas ces règles de clé étrangère ou se comporte simplement d'une manière différente, vous devez réécrire votre logique d'affaires.

vous pouvez vous demander: qui a besoin de différents systèmes de bases de données? Eh bien, tout le monde ne peut pas se permettre ou veut un serveur SQL complet sur sa machine. C'est un logiciel, qui doit être maintenu. D'autres ont déjà investi du temps et de l'argent dans certains autres régimes. Base de données Serverless sont grands pour les petits clients sur une seule machine.

personne ne sait, comment tous ces systèmes DB se comportent, mais votre logique d'affaires, avec des contrôles d'intégrité, reste toujours la même.

1
répondu Michael 2015-09-14 13:16:57

j'ai toujours pensé que c'était paresseux de ne pas les utiliser. J'ai appris cela devrait toujours être fait. Mais je n'ai pas écouté la discussion de Joel. Il avait peut-être une bonne raison, Je ne sais pas.

0
répondu Kilhoffer 2008-09-17 13:29:58

une fois où un FK pourrait vous causer un problème est quand vous avez des données historiques qui font référence à la clé (dans une table de recherche) même si vous ne voulez plus la clé disponible.

Évidemment la solution est de mieux concevoir les choses à l'avance, mais je pense à des situations réelles ici où vous n'avez pas toujours le contrôle de la solution complète.

Par exemple: peut-être avez-vous une table de recherche customer_type qui liste différents types de clients-disons que vous devez supprimer un certain type de client, mais (en raison de contraintes commerciales) ne sont pas en mesure de mettre à jour le logiciel client, et personne n'a caché cette situation lors du développement du logiciel, le fait qu'il s'agit d'une clé étrangère dans une autre table peut vous empêcher de supprimer la rangée, même si vous connaissez les données historiques que les références, il est hors de propos.

Après avoir été brûlé avec ceci quelques fois vous vous penchez probablement loin de l'application de la db relation.

(Je ne dis pas que c'est une bonne chose - juste donner une raison pour laquelle vous pouvez décider d'éviter les FKS et les contraints db en général)

0
répondu hamishmcn 2008-09-17 13:55:18