-
Lien 0,n -- 1,n
Bonjour,
C'est la première fois que ça m'arrive mais je doit faire un lien 0,n -- 1,n.
Petite explication sur le pourquoi de ce lien assez rare finalement :
Pour faire simple, j'avais un lien A -0,n----1,1- B avec la clé de A dans B mais on m'a dit que parfois (rare mais parfois) B pouvait avoir 2 voir 3 A !!! J'ai donc changé mon modèle avec le lien en -0,n----1,n-
Mais ce type de lien se fait avec une table associative exactement comme le lien 0,n -- 0,n alors comment je garanti le 1 ?
Merci
-
Ma réponse donnée en chat à ypelissier :
En toute rigueur, il faudrait créer une procédure pour qu'à l'insertion dans la table issue de l'entité-type située du côté du 1,n, une ligne soit ajoutée "en même temps" dans la table associative.
On doit pouvoir aussi poser une contrainte CHECK ou une ASSERTION sur cette table. Et pour que la contrainte ne fasse pas planter les insertions, on est obligé du coup de passer par la procédure, ce qui sécurise la cohérence des données.
Donc l'idée est de créer une procédure d'insertion d'une ligne en B qui insère en même temps une ligne dans la table associative. Il faut donc fournir à la procédure de quoi remplir la table associative, c'est à dire à minima la valeur de la clé étrangère référençant A.
Et cette procédure peut être un trigger INSTEAD OF INSERTDu coup il faut aussi prévoir une assertion ou un trigger ON DELETE sur la table associative pour ne pas supprimer la dernière ligne référençant un B, sauf en cas de suppression du B (alors c'est le ON DELETE CASCADE de la clé étrangère qui devrait faire le boulot).
Tout ce que je viens d'écrire est théorique parce que je ne l'ai jamais encore fait mais c'est le principe qui me vient à l'esprit.
Je laisse les pros du SQL donner une réponse technique plus complète.
-
Up
Je me permet de remonter ce post...
-
En fait, je pense que personne n'a répondu car il n'y a pas grand chose à ajouter à ce qu'a dit CinePhil
Pour détailler un peu, vous pouvez créer une vue faisant la jointure entre les tables A et B.
Placez ensuite un trigger INSTEAD OF INSERT sur cette vue pour répartir les données entre les table A et B lors de la création d'une (ou plusieurs) ligne(s) dans B
il faudra aussi prévoir un trigger INSTEAD OF DELETE pour gérer les suppressions de A (ne pas supprimer le dernier A rattaché à B comme indiqué par CinePhil)
Interdisez l'insertion directe dans B par un DENY, et la suppression directe dans A
Cela devrait suffire.
Pour aller plus loin, vous pouvez faire en sorte que cette vue gère également les autres manipulations possibles, et ne passer que par cette vue pour tout opérations depuis le programme client.
-
Merci beaucoup, je vais faire cela...