Bonsoir redbox,
Envoyé par
redbox
A une "question" se joint zéro ou plusieurs "sous question", autrement dit une "question" peut ne pas être composée de "sous question". Or dans Access ce type de cardinalité est automatiquement passé à 1/n.
ACCESS ne fait pas de différence entre 0,N et 1,N : en réalité il méconnaît 1,N, sinon il générerait de lui-même le code interdisant 0,N. Je dirais même que la norme SQL elle-même ne permet pas de garantir 1,N en une seule instruction. Ça viendra peut-être un jour, mais pour le moment, seule la théorie relationnelle permet de le faire, grâce à l’affectation multiple (voir par exemple ici).
Cela dit, 0,N n’est pas forcément peccamineux, par exemple un élève ne répond pas forcément à une question, autrement dit dans votre MCD, les cardinalités portées par les pattes connectant l’entité-type ELEVE et les associations COMPOSER et CHOISIR doivent effectivement être porteuses d’une cardinalité 0,N et non pas 1,N. De la même façon, une question ou une sous-question peut ne pas avoir de réponse de la part des élèves. En revanche, un questionnaire sans question serait évidemment une aberration et dans ce cas-là, 1,N s’impose.
Envoyé par
redbox
J'ai dans mon cahier de cours une définition de la 3FN qui dit ceci:
Une table est en troisième forme normale lorsque tous ses attributs dépendent pleinement et uniquement de la clé primaire.
Je suis un peu embrouillé...j'avais constaté que certains attributs correspondaient seulement en partie à la clé composée, alors j'ai ajouté une clé primaire unique avec un N°ID auto incrémenté afin que la 3FN soit respectée.
Dans la définition qui vous a été donnée, « pleinement » veut probablement dire « de l’ensemble des attributs de la clé et pas que d’un sous-ensemble de ces attributs », ce qui est caractéristique de la 2FN, l’adverbe « uniquement » étant là pour le passage de la 2FN à la 3FN. Peu importe, votre professeur est coupable de vous avoir fourni une définition floue et incomplète, ça n’est pas la seule clé primaire qui peut être suspectée de viol, mais bien chaque clé candidate. Si donc une clé primaire « composée » fait que la FNx est violée, ravaler cette clé au rang de clé alternative et créer de toutes pièces une clé primaire singleton est un expédient qui ne résout strictement rien.
Envoyé par
redbox
Pour ma part j'ai appris (peut être mal compris) que les clés étrangères proviennent des relations direct des table avoisinantes avec une relation 1/1-->1/n, le côté 1/1 recevant la clé étrangère...
D’accord pour la cardinalité 1,1, mais limiter de l’autre côté au cas 1,N est réducteur : ça peut aussi être 0,1 ou 0,N, comme dans l’exemple du règlement des factures :
Si dans l’entreprise la règle est que tout règlement de facture doit être effectué en une fois :
[FACTURE]----0,1----(Régler)----1,1----[REGLEMENT]
Alors au niveau MLD, la table REGLEMENT est porteuse d’une clé étrangère faisant référence à la clé primaire de la table FACTURE. Même principe si la règle change et qu’une facture puisse être réglée en plusieurs fois :
[FACTURE]----0,N----(Régler)----1,1----[REGLEMENT]
Envoyé par
redbox
Dans mon schéma pk=> clé primaire et sk=>clé étrangère.
Soit. Mais quelle notation utilisez-vous quand une clé étrangère est en même temps clé primaire ?
Pour reprendre le cas de l’entreprise pour laquelle la règle est que tout règlement de facture est effectué en une fois (à noter que le montant du règlement est alors celui de la facture) :
Notation à la PowerAMC :
Ou, pour reprendre la règle selon laquelle tout règlement de facture peut être effectué en plusieurs fois :
Dans les deux cas, l’attribut NumeroFacture participe à la clé primaire de la table REGLEMENT ainsi qu’à la clé étrangère faisant référence à la clé primaire de la table FACTURE.
Vous vous étonnez que, dans mon MLD, l’attribut QuestionSqId (appartenant à la clé de la table QUESTION_A_SOUS_QUESTIONS) intègre la clé primaire de la table SQRT_ELEVE_REPONSE : comme je vous l’ai déjà expliqué avec les tables QUESTION_A_REPONSE_TEXTE et QUESTION_A_CHOIX_MULTIPLE, au niveau conceptuel, sémantique, SOUS_QUESTION_A_REPONSE est une entité-type dite faible (weak entity-type) qui n’a aucune existence indépendante : elle ne vit que par l’entité-type QUESTION_A_SOUS_QUESTIONS, elle n’en est qu’une propriété multivaluée. Par le biais de l’identification relative, SOUS_QUESTION_A_REPONSE hérite de l’identifiant {QuestionSqId} de QUESTION_A_SOUS_QUESTIONS. Ensuite, toujours au niveau conceptuel, comme SQRT_ELEVE_REPONSE est sémantiquement une association entre ELEVE et SOUS_QUESTION_A_REPONSE, elle hérite de l’identifiant de ces deux entités-types, et voilà comment, par héritages successifs, au stade MLD SQRT_ELEVE_REPONSE est dotée de l’attribut QuestionSqId. Du strict point de vue du MLD, on pourrait s’en dispenser, mais il est des situations dans lesquelles c’est utile et évite des triggers délicats à programmer au stade SQL, voyez par exemple ici.
Pour mémoire, dans le cas de l’identification relative, la clé de la table SOUS_QUESTION_A_REPONSE est composée de la paire {QuestionSqId, SousQuestionRepId} ; supposons maintenant que l’attribut QuestionSqId vaille 1, alors l’attribut SousQuestionRepId prendra les valeurs 1, 2, 3, ... m, même chose quand l’attribut QuestionSqId vaut 2 : l’attribut SousQuestionRepId prendra les valeurs 1, 2, 3, ... n, etc., c'est-à-dire qu’on recommence la numérotation à 1 pour l'attribut SousQuestionRepId (même principe pour l’attribut NoOrdre dans l’exemple des règlements des factures évoqué ci-dessus).
Considérons maintenant cette partie de votre MCD :
Vous avez une magnifique association ternaire, mais par définition elle dit ceci :
— Par le canal de l’association Lister, chaque question à choix fait référence à au moins une sous-question à choix et à un choix ;
— Chaque sous-question à choix fait référence à au moins une question à choix et à un choix ;
— Chaque choix fait référence à au moins une question à choix et à une sous-question à choix.
Vous remplaceriez les 1,N par des 0,N que ça ne changerait rien à l’affaire : Chaque question à choix participant effectivement à l’association Lister fait référence à au moins une sous-question à choix et à un choix, etc.
Pour vous tirer d’affaire, une bonne scissiparité appliquée à Lister serait la bienvenue, c'est-à-dire de la ternaire faire deux binaires. Quant à votre MLD, il ne reflète pas votre MCD, il est même fort bizarre. Que veut-il exprimer ? (Ça serait bien que vous fournissiez des exemples).
Partager