137 votes

Les clés étrangères sont-elles vraiment nécessaires dans la conception d'une base de données ?

Pour autant que je sache, les clés étrangères (FK) sont utilisées pour aider le programmeur à manipuler les données de manière correcte. Supposons qu'un programmeur le fasse déjà de la bonne manière, alors avons-nous vraiment besoin du concept de clés étrangères ?

Y a-t-il d'autres utilisations des clés étrangères ? Est-ce que quelque chose m'échappe ?

3 votes

Ce sujet revient souvent par ici. Je blâme Joel Spolsky :-). Il y a beaucoup de bonnes réponses ici ; plutôt que de retaper la mienne, je vais simplement vous donner un lien : stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys

82 votes

"Supposons qu'un programmeur le fasse déjà de la bonne manière" - je ne peux même pas imaginer un tel scénario.

12 votes

La "clé étrangère" est une idée, pas une technologie. C'est une règle relationnelle. Votre question est en fait de savoir si vous devez essayer d'appliquer la règle dans votre code ou laisser la base de données vous aider. Lorsque la concurrence est impliquée, il est préférable de laisser le moteur de base de données appliquer la règle, car il est au courant de TOUT ce qui se passe dans la base de données, alors que votre code ne peut pas l'être.

111voto

John Topley Points 58789

Les clés étrangères permettent de faire respecter l'intégrité référentielle au niveau des données. Elles améliorent également les performances car elles sont normalement indexées par défaut.

59 votes

Si vous avez besoin d'un index, créez-en un, mais cela ne devrait pas être une raison principale pour les FK. (En fait, dans certaines circonstances (plus d'insertions que de sélections, par exemple), le maintien d'un FK peut être plus lent. )

12 votes

C'est une mauvaise réponse. Les FKs peuvent généralement ajouter des frais supplémentaires sans améliorer les performances.

0 votes

Dans SQL-Server, ils ne sont pas indexés par défaut sur l'arbitre ou le référent. sqlskills.com/blogs/kimberly/

65voto

Greg Hewgill Points 356191

Les clés étrangères peuvent également aider le programmeur à écrire moins de code en utilisant des éléments tels que ON DELETE CASCADE . Cela signifie que si vous avez une table contenant les utilisateurs et une autre contenant les commandes ou autre, la suppression d'un utilisateur pourrait automatiquement supprimer toutes les commandes qui pointent vers cet utilisateur.

5 votes

Greg Hewgill Cela pourrait potentiellement conduire à de nombreux problèmes. Vous devriez être très prudent avec des pensées comme DELETE CASCADE, car dans de nombreux cas, vous voudriez garder les ordres créés par un utilisateur lors de la suppression de l'utilisateur.

11 votes

Bien que cela doive probablement être traité dans la couche logique de l'entreprise. Décider de conserver ou non les enregistrements enfants liés n'est pas tout à fait la même chose que de s'assurer qu'aucune valeur ne viole les relations de clé étrangère.

5 votes

L'autre problème est l'audit. Si l'audit n'est pas effectué au niveau de la base de données, les mises à jour ou les suppressions en cascade invalideront votre piste d'audit.

49voto

Eric Z Beard Points 18473

Je ne peux pas imaginer concevoir une base de données sans clés étrangères. Sans elles, vous risquez de faire une erreur et d'altérer l'intégrité de vos données.

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

Je suis presque certain que FogBugz n'a pas de contraintes de clé étrangère dans la base de données. Je serais intéressé de savoir comment le Fog Creek Software L'équipe structure son code pour garantir qu'elle n'introduira jamais d'incohérence.

50 votes

Joel : "Jusqu'à présent, nous n'avons jamais eu de problème." Jusqu'à présent, je n'ai jamais foncé dans un lampadaire. Mais je pense toujours que c'est une bonne idée de porter une ceinture de sécurité ;-)

2 votes

Il se peut que vous n'ayez jamais VU le problème, mais il est peut-être là... La plupart des bases de données utilisent une convention comme id_xxx qui est exactement la même chose que ixXXX.

2 votes

@Joel : Des conventions de nommage à la place de l'application des règles ? Autant se débarrasser de la typographie tant qu'on y est.

47voto

Guy Points 5465

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. Ne pas passer un peu plus de temps sur les fondamentaux de la conception et l'intégrité des données est un moyen sûr de s'assurer des maux de tête plus tard.

Accepteriez-vous dans votre application un code aussi peu soigné ? Qui accède directement aux objets membres et modifie directement les structures de données.

Pourquoi pensez-vous que cela a été rendu difficile et même inacceptable au sein des langues vivantes ?

4 votes

+1 pour une bonne analogie entre l'encapsulation et les relations FK/PK.

22voto

csmba Points 2440

Oui.

  1. Ils vous permettent de rester honnête
  2. Ils permettent aux nouveaux développeurs de rester honnêtes
  3. Vous pouvez faire ON DELETE CASCADE
  4. Ils vous aident à générer de beaux diagrammes qui expliquent eux-mêmes les liens entre les tables.

2 votes

Qu'entendez-vous par honnêteté ?

3 votes

Honnête avec la conception je suppose. Il vous empêche de tricher avec les données en faisant une programmation rapide et boiteuse.

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