Pourquoi sont-clés étrangères plus utilisé dans la théorie que dans la pratique?
Après l'étude de la théorie relationnelle des clés étrangères sont, bien entendu, obligatoire. Mais dans la pratique, dans chaque endroit où je travaille, le tableau des produits et des jointures sont toujours fait en spécifiant les touches explicitement dans la requête, au lieu de s'appuyer sur des clés étrangères dans le SGBD.
De cette façon, vous pouvez bien entendu joindre deux tables de champs qui ne sont pas destinés à être des clés étrangères, d'avoir des résultats inattendus.
Pourquoi pensez-vous que c'est? Ne devrait pas Sgbd assurer que les Jointures et des Produits être effectuées uniquement par les clés étrangères?
EDIT: Merci pour toutes les réponses. Il est clair pour moi maintenant que la principale raison pour FKs est la référence de l'intégrité. Mais si vous avez la conception de la base de données, toutes les relations dans le modèle (I. E. les flèches dans la disquette de réparation d'urgence) deviennent des clés Étrangères, au moins en théorie, si oui ou non vous définir comme tels dans votre SGBD, ils sont sémantiquement FKs. Je ne peux pas imaginer la nécessité de joindre des tables de champs qui ne sont pas FKs. Quelqu'un peut-il donner un exemple qui fait sens?
PS: je suis conscient du fait que N:M les relations deviennent des tables séparées et pas les clés étrangères, juste omis pour des raisons de simplicité.
- Règles d'intégrité référentielle sont pas 1 pour 1 relation avec ce que devrait être autorisée pour les jointures. Les pommes et les oranges.
- Vous ne comprenez pas ce que les clés étrangères sont destinés. Rejoindre sur la non-colonnes de clé est très utile dans le monde réel.
- wiki de la communauté cette place!
- Tables de bases (& les résultats de la requête) représentent des relations/associations. FKs sont (ubiquitaire) appelle à tort "relations". FKs & autres contraintes ne sont pas nécessaires à la requête. Ils sont faits re chaque situation de l'entreprise & son DB état. Ils s'arrêtent quelques invalide mises à jour & permettre à certaines optimisations. Une requête renvoie de manière appropriée les lignes associées indépendamment de la cardinalités de certains binaires associés relations. Propriétaire de JOINTURE NATURELLE de l'Animal retourne (o,a,n) lignes où o est le propriétaire d'un & animal a un nom n si oui ou non Propriétaire ou de l'Animal est de 1 M ou M:1 ou 1:1, ou tous les animaux sont détenus ou des personnes que des animaux etc.
- Quelqu'un sait comment je peut pas notifié à propos de cette question plus? cela fait maintenant près de 10 ans.
Vous devez vous connecter pour publier un commentaire.
La raison de contraintes de clés étrangères existe, est de garantir que les lignes référencées existent.
"La clé étrangère identifie une colonne ou un ensemble de colonnes dans une table qui fait référence à une colonne ou un ensemble de colonnes d'une autre table. Les valeurs d'une ligne de référence colonnes doivent avoir lieu dans une seule ligne dans la table référencée.
Ainsi, une ligne dans la table de référence ne peut pas contenir de valeurs qui n'existent pas dans la table référencée (sauf éventuellement NULLE). De cette façon, les références peuvent être faites à la liaison d'informations et il est une partie essentielle de normalisation de base de données." (Wikipédia)
RE: Votre question: "je ne peux pas imaginer la nécessité de joindre des tables de champs qui ne sont pas FKs":
Lors de la définition d'une contrainte de Clé Étrangère, la colonne(s) dans la table de référence doit être la clé primaire de la table référencée, ou au moins une clé candidate.
Quand vous faites des jointures, il n'y a pas besoin de se joindre avec des clés primaires ou candidat clés.
Ce qui suit est un exemple qui pourrait faire sens:
Et puis la requête comme suit:
Un autre cas où ces jointures sens est dans la base de données géospatiales de fonctionnalités, comme SQL Server 2008 ou Postgres avec PostGIS. Vous serez en mesure de faire des requêtes comme celles-ci:
Source: ConceptDev - SQL Server 2008 Géographie: STIntersects, STArea
Vous pouvez en voir un autre similaire géospatiales exemple dans la accepté de répondre à ce poste "Sql 2008 requête problème qui LatLong du existe dans une géographie polygone?":
Ce sont toutes valides jointures SQL qui n'ont rien à voir avec les clés étrangères et candidat clés, et peut encore être utile dans la pratique.
client_country
est une clé étrangère (pour les pays de table), ce n'est certainement pas une clé étrangère à lasupplier_country
.Clés étrangères ont moins à voir avec des jointures qu'avec le maintien de l'intégrité de la base. La preuve en est que vous pouvez joindre des tables de quelque façon que vous voulez, même dans les moyens qui ne font pas nécessairement de sens.
SELECT * FROM book INNER JOIN person ON book.ISBN = person.Phone
?select * from book as b inner join disc as d on b.num_sold = d.num_sold
- une jointure sans les clés étrangères.FOREIGN KEY
s ne peut être utilisé pour appliquer l'intégrité référentielle si la relation entre les entités de laER
modèle se manifeste avec une équi-jointure entre deux relations dans le modèle relationnel.Ce n'est pas toujours vrai.
Voici un exemple tiré de l'article de mon blog que j'ai écrit il y a quelques temps:
Ce modèle décrit les produits et les gammes de prix:
Et voici le relationnel de la mise en œuvre du modèle:
Comme vous pouvez le voir, le
PriceRange
tableau n'a qu'un seul prix d'attributs,Price
, mais le modèle a deux attributs:StartPrice
etEndPrice
.C'est parce que le modèle relationnel permet de transformer les décors et l'entité
PriceRange
peut facilement être reconstruits à l'aide deSQL
opérations.Nous ne disposons que la limite inférieure de chaque plage. La limite supérieure peut être facilement déduite.
Voici la requête pour trouver les bonus pour chaque bien:
Nous voyons que ces modèle relationnel met en œuvre le ER modèle assez bien, mais pas de clé étrangère peut être déclarée entre ces relations, depuis l'opération permet de lier entre eux n'est pas une équi-jointure.
Pas, l'application est inutile; il serait d'interdire à certaines des fonctionnalités utiles, telles que l'éventuelle surcharge de colonnes. Même si ce type d'utilisation n'est pas idéal, il EST utile dans certaines situations du monde réel.
L'utilisation appropriée pour les contraintes de clé Étrangère est juste comme ça; une contrainte sur les valeurs ajoutées d'une colonne donnée, qui assure que leurs lignes référencées existent.
Il convient de noter qu'un important manque de contraintes de clé étrangère sur un schéma donné est une mauvaise "odeur", et peut indiquer certains de graves problèmes de conception.
Vous pouvez vous joindre à n'importe quelle expression. Si vous définissez les clés étrangères dans votre base de données ou pas est sans importance. Les clés étrangères contraindre INSERT/UPDATE/DELETE, SÉLECTIONNEZ pas.
Alors pourquoi faire beaucoup de projets de sauter la définition des clés étrangères? Il y a plusieurs raisons:
Le modèle de données est conçue de façon médiocre et nécessite des références incorrectes (exemples: polymorphe associations, VAE).
Les codeurs ont peut-être entendu que "les clés étrangères sont lents", de sorte qu'ils tombent d'eux. En fait, le travail supplémentaire que vous avez à faire pour garantir la cohérence des données lorsque vous ne pouvez pas compter sur les clés étrangères rend votre application beaucoup moins efficace. L'optimisation prématurée, sans réellement mesurer le profit est un problème commun.
Contraintes obtenir de la manière de certaines données des tâches de nettoyage. Parfois, vous avez besoin pour briser les références temporairement comme vous refactoriser de données. De nombreux SGBDR permettre à des contraintes pour les handicapés, mais parfois, les programmeurs de décider qu'il est plus facile de laisser handicapé. Si il y a un besoin fréquent pour désactiver les contraintes, cela indique probablement un brisé conception de base de données.
@Bill Karwin
: En fait,FOREING KEY
s sont lents dansOracle
à moins que de10g
(en raison de l'enregistrement de base de façon à leur mise en œuvre). Si vous utilisez une procédure stockée comme un point d'entrée unique pour vos tables et de faire toutes les vérifications de base de jeu avant de délivrerDML
opérations, c'est beaucoup plus rapide dansOracle
.SQL Server
, d'autre part, d'optimiserFOREING KEY
-impliciteDML
.@Cade Roux
: pas dansOracle
. Mais dansSQL Server
, certainement, oui. Voir ici: explainextended.com/2009/10/15/...Clés étrangères utilisé de la manière que vous décrivez n'est pas la façon dont ils sont destinés à être utilisés. Ils sont destinés à s'assurer que, si un enregistrement dépend logiquement un enregistrement correspondant exister quelque part d'autre, que l'enregistrement correspondant est en effet là.
Je crois que si les développeurs/administrateurs de bases de données temps à un (Une) développeur bon les noms des tables et des champs, ou (B) définissent l'étendue des contraintes de clés étrangères, option Un est le choix le plus simple. J'ai travaillé dans les deux situations. Où de nombreuses contraintes ont été invoqués pour maintenir l'ordre et empêcher les gens de vissage des choses peut vraiment devenir un gâchis.
Il faut beaucoup d'efforts pour garder tous vos contraintes de clé étrangère à jour au cours du développement, le temps où vous pourriez être dépenses sur d'autres de grande valeur tâches que vous avez à peine le temps pour. En revanche, dans les situations où vous avez de bonnes conventions de nommage, les clés étrangères sont clairement le coup. Les développeurs n'ont pas à chercher les clés étrangères, ou essayez une requête pour voir si elle fonctionne; il suffit de voir les relations.
Je pense que les contraintes de clé étrangère rapidement devenir utile que le nombre de différentes équipes de croître à l'aide d'une base de données augmente. Il devient difficile de faire valoir nom cohérentes; la connaissance de la DB est fragmenté; il est facile de db actions ont des conséquences imprévues pour une autre équipe.
Parce que, dans la pratique, la théorie n'est pas assez 😉
Sérieusement, dans mon expérience est principalement parce que la théorie n'est pas assez souple pour envisager toutes les possibilités que vous avez à gérer dans le monde réel. Seulement avec un très étrange affaire que vous avez à stocker dans votre base de données (ou quelque chose de plus commun, comme la surcharge des colonnes de), vous devez sortir de la FK et de mettre en œuvre dans le DAL.
Peut-être vous pouvez développer une solution qui peut être archivé dans un cadre totalement normalisé (par exemple), mais dans de nombreux cas, les travaux nécessaires et/ou les résultats de la finale de valeur n'est pas suffisante.
Mes deux cents.
SGBD sont construits pour permettre au plus grand nombre de solutions tout en travaillant selon ses règles de base.
Jointures restrictives pour définir les clés étrangères pourrait limiter la fonctionnalité énormément, surtout que la plupart du développement ne se produit pas avec un DBA ou un examen de SQL ou des procédures stockées.
Après avoir dit que, en fonction de votre Couche d'Accès aux Données, vous pouvez être amené à configurer des clés étrangères, à l'utilisation de la fonctionnalité. Par exemple Linq to SQL.
Les clés étrangères ne sont pas utilisés aussi souvent que la théorie relationnelle suggère parce que DB/type relationnel gens ne sont pas d'écrire beaucoup de code ou même concevoir les tables. Les programmeurs écrivent du code/design tables ou avoir beaucoup d'influence sur la façon dont les tables sont conçues.
Ce genre d'applications de base de données travaillez-vous? La théorie que vous consultez fréquemment est sur l'utilisation de la base de données brutes, auquel cas les contraintes peuvent être très utiles. Dans la pratique, les bases de données sont souvent utilisés comme l'extrémité arrière de plus d'applications. Dans de nombreux cas, ces applications ont pour valider les transactions elles-mêmes, et il serait un gaspillage d'efforts, de le répéter dans la base de données.
Envisager une application de gestion des ventes, par exemple. Quand quelqu'un est saisie d'une commande, il sera peut-être chercher le client dans la base de données, pour obtenir l'adresse ou les informations de carte de crédit. Quand il ne trouve pas de client, il sera programmé pour faire quelque chose de raisonnable. Si elle a attendu jusqu'à ce qu'il a essayé d'insérer une ligne dans le tableau de commande pour découvrir il n'y a pas de client, il obtiendrait plus lent et moins de pratique de la rétroaction.
Quelque chose de a à maintenir l'intégrité de la base de données, mais le faire à l'intérieur du SGBD lui-même n'est pas toujours la meilleure.
Les clés étrangères sont extrêmement importants, en particulier dans les bases de données manuel de requêtes exécutées sur eux, ou avoir un logiciel développé pour eux. Tous les non testé requête est exécutée sur la base de données a la possibilité de contenir une erreur. Des contraintes telles que les clés étrangères servent à mettre en évidence ces erreurs avant d'incohérence est introduit dans les données.
Ces contraintes sont appliquées par le concepteur du schéma, et ils s'assurer que les données restent dans le modèle (s)qu'il a envisagées. Si les contraintes ne sont pas là, alors tôt ou tard, une requête d'introduire une certaine incohérence. Incohérence va conduire à des résultats imprévisibles à partir de requêtes, et est très difficile à inverser.
J'ai été à la programmation depuis quelques décennies, depuis bien avant les bases de données relationnelles est devenu la norme. Quand j'ai commencé à travailler avec MySQL, quand j'ai appris le PHP, j'ai vu la Clé Étrangère de l'option et la première pensée a été: "Wow! C'est retardée." La raison n'être qu'un imbécile croit que le laboratoire dicte la réalité. Il était évident immédiatement, à moins que vous ont été codage d'une application qui ne serait jamais, jamais, être changé, vous êtes d'emballage de votre application dans un acier de fonte où la seule option est de construire plus de tables ou de trouver des solutions créatives.
Cette évaluation initiale avait été née dans chaque situation de production réelle de l'application, j'ai trouvé. Non seulement la contrainte de ralentir sensiblement toute modification, ils rendent presque impossible la croissance de la demande, quelque chose qui est nécessaire pour une entreprise.
La seule raison pour laquelle je n'ai jamais trouvé de contraintes sur la table est paresseux codeurs. Ne voulant pas écrire de code propre à vérifier l'intégrité des données.
Michael
Bonne question. Je me suis toujours demandé pourquoi SQL n'a pas une syntaxe comme
où FK_tbl1_tbl2 est certaine contrainte de clé étrangère entre les tables. Ce serait incroyablement beaucoup plus utile que la JOINTURE NATURELLE ou d'Oracle à l'AIDE de colonnes(col1, col2).
La raison principale est qu'il n'ya aucun moyen de les mettre en place sans une requête dans la plupart MySQL GUI tools (Navicat, MySQL, etc.)
Semble stupide, mais je suis coupable de cela aussi, puisque je n'ai pas la syntaxe mémorisé :/
Partie pour moi, c'est que (et oui, c'est une piètre excuse) de l'INTERFACE utilisateur de MS SQL Server Management studio pour l'ajout de clés étrangères est terrible.
Une clé étrangère est une contrainte qui "n'importe quelle valeur dans la colonne x sur la table un doit apparaître dans la colonne de y sur la table b", mais l'INTERFACE utilisateur pour le précisant dans SSMS ne pas indiquer clairement quelle table vous êtes de jouer avec, ce qui est le parent de la table, qui est l'enfant de la table, et ainsi de suite.
Chaque fois que j'ai eu à créer une clé étrangère, il a été d'essai et d'erreur jusqu'à ce qu'il semblait fonctionner.
Je ne suis pas au courant d'un dialecte SQL qui rejoint automatiquement toutes les clés étrangères des tables implicitement. J'ai vu la génération de code et le dictionnaire des données des outils de reporting en déduire, mais le SQL est toujours explicite.
C'est pourquoi vous voyez que, dans la pratique, en SQL, TOUS les jointures explicites.
Dans la pratique, les bases de données sans contraintes FK ont tendance à avoir des problèmes d'intégrité, car il n'y a pas de contrainte d'exiger la clé d'exister. Donc c'est certainement plus pratique d'avoir autant de contraintes que possible - il protège l'intégrité et permet à l'optimiseur et les autres utilisateurs. Comme avec toutes les meilleures pratiques, de savoir quand (si jamais) pour briser la règle est également important.
Pourquoi vous pouvez faire une jointure qui ne correspond pas à une contrainte de clé étrangère entre ces tables, il y a de multiples exemples. Particulièrement dans le cas des composites clés partielles sur les jointures, je trouve que c'est souvent nécessaire. Nous avons souvent jointure sur les tables à l'aide des versions partielles de leurs clés primaires dans un entrepôt de données.
Vous pourriez également être intéressé par cet article sur clé étrangère rejoindre l'élimination par l'optimiseur.
Clé étrangère est couplage. Dans la programmation, le couplage est rarement bon.