Envoyé par
stupidgrin
je pense qu'il faudrait pas le mettre dans la réponse vu que c'est moins optimal
Sous réserve d’une définition précise qui vous aurait été donnée de ce qualificatif, il n’y a pas lieu de s’intéresser au caractère plus ou moins « optimal » des clés candidates !
Donc dans la réponse il faut faire figurer la paire {J, P} en tant que clé candidate. D’autant plus que la 3NF et la BCNF ne sont vérifiables que si l’on examine l’implication de chaque clé candidate en relation avec chaque dépendance fonctionnelle.
Par ailleurs la paire {J, D} est aussi clé candidate. En effet, en utilisant les axiomes d’Armstrong :
La dépendance fonctionnelle {J} -> {S} est donnée, et si on lui applique l’axiome d’augmentation, alors {J, D} -> {S, D} ;
Dans la foulée, la dépendance fonctionnelle {S, D} -> {P} est donnée, et par transitivité {J, D} -> {P} ;
Par augmentation : {J, D} -> {J, P} ;
A son tour par transitivité {J, D} détermine chaque attribut de l’en-tête de la variable relationnelle CONTRAT, {J, D} est donc clé candidate.
A propos de la 3NF : on ne sait pas quelle définition vous en a été donnée. En tout cas celle de Zaniolo est excellente :
Soit R une relvar, X un sous-ensemble d'attributs de l'en-tête de R et A un attribut de cet en-tête. R est en troisième forme normale (3NF) si et seulement si, pour chaque dépendance fonctionnelle X ➔ {A} qui doit être vérifiée par R, au moins une des conditions suivantes est satisfaite :
1. A est un élément de X (cette dépendance fonctionnelle est donc triviale).
2. X est une surclé de R.
3. A appartient à une clé candidate de R.
Dans votre cas, la dépendance fonctionnelle {J} -> {S} ne satisfait à aucune de ces 3 conditions : la 3NF est donc violée.
La définition de la BCNF est celle de la 3NF débarrassée de la condition 3 : elle est violée elle aussi.
Pour normaliser en BCNF sans perte d’information, il faut appliquer le théorème de Heath.
En l’espèce, la relvar CONTRAT est à décomposer ainsi, histoire de la débarrasser de la dépendance fonctionnelle gênante {J} -> {S} :
R11 = {J, S}
R12 = {C, J, D, P, Q, V}
Avec CONTRAT = R11 JOIN R12
Il s’agit maintenant de vérifier que R11 et R12 sont en BCNF, et à défaut les décomposer à leur tour. Vous pourrez vous rendre compte que la BCNF est bien respectée tant pour l’une que pour l’autre, inutile de chercher à décomposer R12. En contrepartie, comme dans bien des traitements curatifs, on se rend compte qu’il y a des effets secondaires.
En l’occurrence on a perdu la dépendance fonctionnelle, {J, P} -> {C}, c’est-à-dire une règle de gestion, ce qui peut être redoutable... Dans la réalité du terrain, on pourra préférer ne pas décomposer CONTRAT, et mettre en oeuvre une contrainte garantissant la dépendance fonctionnelle {J} -> {S}.
A l’opposé, si on préfère décomposer CONTRAT, il faudra là aussi mettre en oeuvre une contrainte garantissant {J, P} -> {C}.
A titre de curiosité, par application du théorème de Heath, vous pouvez par exemple décomposer CONTRAT ainsi :
R21 = {J, P} -> {C}
R22 = {S, J, D, P, Q, V}
Mais je vous laisse réfléchir à la façon de pallier la perte des dépendances fonctionnelles initiales...
Partager