Voici quelques éléments de réflexion pour meubler les moments de pause à l’occasion de votre formation...


Envoyé par
Kropernic
En MLD (ou MPD ?) je vois plus ou moins comment procéder. En partant du MCD que j'ai posté, l'association entre rayon et marque donnera un table intermédiaire dont la clef primaire sera composée des clefs primaires des tables rayon et marque qui servira de clef étrangère pour la table code démo.
[...]
Ce qui revient exactement à la solution que j'ai expliquée dans mon commentaire précédent

.
Hum... Utilisons par exemple PowerAMC (Why not?
). Pour reprendre votre MCD :
Voici le MLD produit par PowerAMC :
Pour PowerAMC, la clé de la table DETERMINER est le triplet {CodeDemoId, RayonId, MarqueId}, ce qui prouve en passant que le géniteur de l’AGL a oublié que la cardinalité maximale portée par la patte connectant l’entité-type CODE_DEMO et l’association DETERMINER n’est pas N mais 1. Il aurait dû prendre en compte les dépendances fonctionnelles qui sont les conséquences logiques de cette cardinalité maximale 1 :
{CodeDemoId} -> {RayonId},
{CodeDemoId} -> {MarqueId}.
D’où le MLD corrigé manuellement :
Mais de toute façon, ce MLD n’est pas satisfaisant, une fois ! En effet la paire {RayonId, MarqueId} de la table DETERMINER doit faire référence à la paire {RayonId, MarqueId} de la table ETRE_ASSOCIE, sinon la contrainte CK1 dont j’ai fait mention dans mon message précédent n’est pas garantie. Je rappelle que pour que la contrainte soit respectée, le MLD doit être le suivant (où RM est synonyme de ETRE_ASSOCIE) :
Je ne sais pas ce que JMerise vous produira comme MLD, mais de toute façon, la présence simultanée des deux tables DETERMINER et ETRE_ASSOCIE sans que la 1re fasse référence à la 2e fera que la contrainte CK1 ne pourra pas être garantie, même si, comme vous le conjecturez, la clé primaire de la table DETERMINER était la paire {RayonId, MarqueId}.
Pour le fun 
La solution que je propose n’est pas forcément optimale même si elle garantit la contrainte CK1. En effet, conformément à votre MCD, j’ai bien respecté la cardinalité minimale 1 qui est portée par la patte connectant l’entité-type CODE_DEMO et l’association DETERMINER, mais quid si cette cardinalité minimale est 0 ? Pas de panique : la solution n’est pas bien compliquée, vous l’avez déjà mise en œuvre par le passé. Par exemple, on utilise la spécialisation (pour éviter une intervention manuelle dans le MLD, du moins avec PowerAMC) :
MLD :
Au stade SQL, il faudra quand même prévoir une assertion (un trigger à défaut) pour garantir la contrainte d’exclusion : un code démo ne peut pas être à la fois en rayon et pas en rayon...
Bon stage et à bientôt
Partager