60 votes

Pourquoi devrais-je éviter les boucles lorsque je conçois des relations pour une base de données ?

Quelqu'un m'a dit que c'était une mauvaise conception que d'avoir des boucles dans le modèle de données. J'ai déjà entendu cela à plusieurs reprises, mais je n'y ai pas prêté attention. Par exemple, vous avez des entités Utilisateur, Projet, Activité. Un projet est détenu par un utilisateur, nous avons donc une relation de type un à plusieurs entre l'utilisateur et le projet. Une activité peut être assignée à un seul utilisateur, une autre relation de type "one-to-many" de l'utilisateur à l'activité. Bien sûr, un projet est défini par un ensemble d'activités, une autre relation de type "one-to-many" du projet à l'activité. Une boucle est ainsi formée.

J'ai demandé à ce type pourquoi le design était mauvais, mais il m'a répondu qu'il ne savait pas non plus, qu'on le lui avait dit aussi, l'apprentissage du singe à son meilleur.

J'ai essayé de faire des recherches mais je suppose que je n'ai pas utilisé les bons mots, cependant cela me semble être quelque chose de fondamental pour quelqu'un qui essaie de concevoir un DB.

Alors, quelqu'un peut-il m'indiquer des informations utiles sur les boucles/cycles dans les diagrammes er/db, faut-il les éviter ?

61voto

sfinnie Points 5861

Il y a un très bon traitement des boucles de relation dans le chapitre 3 de cet article ( archive.org ).

En général, cependant, le problème le plus courant avec les boucles est la cohérence des informations redondantes.

Considérons le cas (tiré du document) où un parent a de nombreux enfants ; chaque enfant fréquente une école. Il existe une troisième relation entre le parent et l'école ('le parent a un enfant à l'école'). Cependant, il n'est pas nécessaire de modéliser explicitement la troisième relation ; elle peut être complètement dérivée des deux autres. Si vous la capturez explicitement, vous devrez vous assurer que la boucle est toujours cohérente.

Dans ce cas, il faut donc éviter la boucle. Cependant, les boucles ne sont pas universellement mauvaises. Reprenons l'exemple ci-dessus et modélisons le cas où un parent est gouverneur d'une école. Cela créerait également une boucle. Mais dans ce cas, elle est valable : il n'est pas possible de dériver la relation "parent est gouverneur de l'école" à partir des deux autres relations.

En résumé, ne modélisez pas de boucles lorsqu'une relation est entièrement dérivable des autres combinées. Mais il est possible de créer des boucles lorsqu'elles ne sont pas dérivables.

Je recommande néanmoins l'article ; il donne une bien meilleure description que celle que je peux donner ici.

0 votes

C'est une bonne question et votre réponse est très sensée. Donc, si je devais extrapoler à l'exemple de l'OP, vous pourriez dire que vous n'avez généralement pas besoin de lier l'utilisateur à un projet, car cette relation pourrait être dérivée sur la base du fait qu'ils sont affectés à des tâches qui sont à leur tour affectées à un projet, donc vous pouvez dériver cette relation. Cependant, si votre entité projet possède un chef de projet, il s'agirait d'une relation valide à associer aux utilisateurs, car vous ne pouvez pas dériver cette relation.

0 votes

Stephen : oui, c'est ça. L'article présente également d'autres scénarios, mais, pour l'essentiel, il s'agit soit de gérer la cohérence des informations redondantes, soit de les supprimer par dérivation.

1 votes

L'article semble être beaucoup de bruit pour rien. Non, les "boucles" (de ce type) ne sont pas "à éviter". Ce qu'il vaut mieux éviter, c'est la redondance (en général, et pas seulement dans le cas des relations). Les informations qui peuvent être dérivées d'autres informations déjà présentes sont à éviter, sauf si vous avez de très bonnes raisons de ne pas le faire. Pourquoi faut-il x-types de pages pour dire cela ?

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