Bonsoir,
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Olive3
Après réflexion, la seule clé est NE.
En effet, cette donnée me donne transitivement le reste des informations.
Qu'en pensez vous?
Commençons par mettre un peu de rigueur dans le vocabulaire. Nous sommes ici dans le contexte du Modèle Relationnel de Données (c'est-à-dire de la théorie relationnelle) et le terme « information » y est impropre. De même, le terme « donnée » n’est pas assez précis. Je rappelle par ailleurs qu’une clé est un ensemble au sens de la théorie des ensembles : NE est seulement un nom d’attribut donc un élément (le seul en l’occurrence) de l’ensemble {NE}. On va donc reformuler ainsi votre proposition :
« Après réflexion, la seule clé est {NE}. En effet pour chaque attribut A de l’en-tête de la relvar TRAVAIL qui ne participe pas à une dépendance fonctionnelle triviale ou directe, {NE} participe à une dépendance fonctionnelle transitive {NE} → {A} ».
Encore faut-il le démontrer rigoureusement, sans se contenter de dire « {NE} détermine transitivement chaque {attribut} ». Exemple :
En vertu de l’axiome de réflexivité, à la liste des dépendances fonctionnelles DF01 à DF09, on peut ajouter la DF suivante :
{NE} → {NE}
En vertu de l’axiome de transitivité, de {NE} → {ND} (DF08) et {ND} → {BUD} (DF10), on infère :
{NE} → {BUD}
Toujours en vertu de l’axiome de transitivité, de {NE} → {ND} (DF08) et {ND} → {NOMD} (DF11), on infère :
{NE} → {NOMD}
De même, de {NE} → {NP} (DF09) et {NP} → {BP} (DF12), on infère :
{NE} → {BP}
De {NE} → {NF} (DF05) et {NF} → {SALMIN} (DF13), on infère :
{NE} → {SALMIN}
De {NE} → {NF} (DF05) et {NF} → {NOMF} (DF14), on infère :
{NE} → {NOMF}
De {NE} → {NB} (DF07) et {NB} → {SURF} (DF16), on infère :
{NE} → {SURF}
Cette fois-ci, {NE} détermine chaque {attribut} de la relvar TRAVAIL. En conséquence {NE} est une clé candidate, mais contrairement à ce que vous dites, on ne peut pas en déduire que c’est la seule clé ! Si on établissait un jour une règle supplémentaire, selon laquelle :
{NOME, TELE} → {NE}
C'est-à-dire que pour un nom d’employé et un numéro de téléphone il n’y ait qu’un employé. En vertu de la règle de transitivité, la paire {NOME, TELE} détermine chaque {attribut} de la relvar TRAVAIL : {NOME, TELE} serait alors clé au même titre que {NE}.
Dans mon message précédent, j’avais écrit :
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
fsmrel
Quand on dispose de la liste des dépendances fonctionnelles, il est d’usage de passer au calcul de la fermeture des ensembles d’attributs à l’aide d'algorithmes tels que l’
algorithme du seau. Suite à cela, on peut passer à la recherche des clés et à la normalisation.
Pour que vous compreniez bien de quoi il s’agit, exerçons-nous au calcul de la fermeture d’un ensemble d’attributs, en l’occurrence le calcul de la fermeture [NE}+ de {NE}. Dans le cadre de votre exercice ce n’est pas une nécessité absolue, car on a montré que {NE} déterminait chaque {attribut} de la relvar TRAVAIL, mais il est des situations plus délicates où l’utilisation de l’algorithme du seau est indispensable.
De la fermeture des ensembles d’attributs
L’attribut NE joue un rôle déterminant (sic !) Il convient donc d’en calculer la fermeture {NE}+.
Pour cela on utilise l’algorithme du seau (dû à Philip Bernstein et son équipe) :
Pour faciliter les explications, réordonnons ainsi la liste LF des DF :
DF01 : {NE} → {NOME}
DF02 : {NE} → {SALAIRE}
DF07 : {NE} → {NB}
DF16 : {NB} → {SURF}
DF08 : {NE} → {ND}
DF10 : {ND} → {BUD}
DF11 : {ND} → {NOMD}
DF05 : {NE} → {NF}
DF13 : {NF} → {SALMIN}
DF14 : {NF} → {NOMF}
DF17 : {NOMF} → {NF}
DF09 : {NE} → {NP}
DF12 : {NP} → {BP}
DF15 : {NP} → {ND}
DF06 : {NE} → {NT}
DF03 : {NE} → {ADRE}
DF04 : {NE} → {TELE}
Dans le cas du calcul de {NE}+, on initialise V à {{NE}}".
1re itération : {NE} → {NOME} et {NE} appartient à V, donc V vaut maintenant V ∪ {NOME}, c'est-à-dire {{NE}, {NOME}}.
2e itération : {NE} → {SALAIRE} et {NE} appartient à V, donc V vaut maintenant V ∪ {SALAIRE}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}}.
3e itération : {NE} → {NB} et {NE} appartient à V, donc V vaut maintenant V ∪ {SALAIRE}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}}.
4e itération : {NB} → {SURF} et {NB} appartient à V, donc V vaut maintenant V ∪ {SURF}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}}.
5e itération : {NE} → {ND} et {NE} appartient à V, donc V vaut maintenant V ∪ {ND}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}}.
6e itération : {ND} → {BUD} et {ND} appartient à V, donc V vaut maintenant V ∪ {BUD}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}}.
7e itération : {ND} → {{NOMD} et {ND} appartient à V, donc V vaut maintenant V ∪ {NOMD}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}}.
8e itération : {NE} → {NF} et {NE} appartient à V, donc V vaut maintenant V ∪ {NF}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}}.
9e itération : {NF} → {SALMIN} et {NF} appartient à V, donc V vaut maintenant V ∪ {SALMIN}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}}.
10e itération : {NF} → {NOMF} et {NF} appartient à V, donc V vaut maintenant V ∪ {NOMF}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}, {NOMF}}.
11e itération : {NOMF} → {NF} et {NF} appartient à V, donc V vaut maintenant V ∪ {NF}, mais {NF} appartient déjà à V qui reste donc inchangé. On repart pour un tour complet.
12e itération : {NE} → {NP} et {NE} appartient à V, donc V vaut maintenant V ∪ {NP}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}, {NOMF}, {NP}}.
13e itération : {NP} → {BP} et {NP} appartient à V, donc V vaut maintenant V ∪ {BP}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}, {NOMF}, {NP}, {BP}}.
14e itération : {NP} → {ND} et {NP} appartient à V, donc V vaut maintenant V ∪ {ND}, mais V reste inchangé car {ND} en est déjà un élément.
15e itération : {NE} → {NT} et {NE} appartient à V, donc V vaut maintenant V ∪ {NT}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}, {NOMF}, {NP}, {BP}, {NT}}.
16e itération : {NE} → {ADRE} et {NE} appartient à V, donc V vaut maintenant V ∪ {ADRE}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}, {NOMF}, {NP}, {BP}, {NT}, {ADRE}}.
17e itération : {NE} → {TELE} et {NE} appartient à V, donc V vaut maintenant V ∪ {TELE}, c'est-à-dire {{NE}, {NOME}, {SALAIRE}, {NB}, {SURF}, {ND}, {BUD}, {NOMD}, {NF}, {SALMIN}, {NOMF}, {NP}, {BP}, {NT}, {ADRE}, {TELE}}.
A ce stade, V c'est-à-dire {NE}+ ne peut plus évoluer car on y trouve l’ensemble des attributs de l’en-tête de la relvar TRAVAIL et l’on a :
{NE} → {NE, NOME, SALAIRE, NB, SURF, ND, BUD, NOMD, NF, SALMIN, NOMF, NP, BP, NT, ADRE, TELE}
Des clés candidates
Considérons donc la DF précédente, dont je rappelle que la partie gauche est appelée déterminant et la partie droite dépendant :
{NE} → {NE, NOME, SALAIRE, NB, SURF, ND, BUD, NOMD, NF, SALMIN, NOMF, NP, BP, NT, ADRE, TELE}
Je rappelle aussi que par définition, une DF est caractérisée par la contrainte d’unicité qui veut que pour une valeur du déterminant on n’a qu’une et une seule valeur du dépendant.
Si le dépendant de cette DF prend deux valeurs distinctes, il en va donc nécessairement de même pour le déterminant {NE}, sinon la contrainte d’unicité de la DF serait violée. Autrement dit, puisque {NE} détermine chaque {attribut} de la relvar, {NE} vérifie les propriétés suivantes des clés candidates :
Unicité ;
Irréductibilité, car le seul sous-ensemble strict de {NE} est l’ensemble vide, lequel ne garantit pas la propriété d’unicité dès lors que TRAVAIL contient deux tuples distincts (n-uplets, lignes en SQL).
Pour la liste de dépendances fonctionnelles LF fournie ci-dessus, il n’existe pas d’autre clé candidate. En effet, {NE} n’y joue jamais le rôle de dépendant dans quelque DF que ce soit : en dehors de {NE}, il ne peut donc exister aucun déterminant D tel que :
D → {NE, NOME, SALAIRE, NB, SURF, ND, BUD, NOMD, NF, SALMIN, NOMF, NP, BP, NT, ADRE, TELE}
Mais, reconnaissez que la raison (transitivité) pour laquelle vous affirmez que {NE} constitue la seule clé ne tient pas debout.
De la normalisation
Considérons votre affirmation :
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Olive3
Nous avons toutes les dépendances fonctionnelles liées à NE.
Cela donne donc :
SALARIE (NE, NOME, SALAIRE, ADRE, TELE, NF, NT, NB, ND, NP)
Une fois de plus cette affirmation manque totalement de rigueur. Je suppose que vous voulez dire :
On dispose de l’ensemble des dépendances fonctionnelles auxquelles participe {NE} en tant que déterminant ou dépendant (sachant qu’en l’occurrence {NE} ne joue jamais le rôle de dépendant).
Je suis désolé, mais vous n’avez mentionné que les seules dépendances fonctionnelles directes, or la 2NF (la moindre des choses serait d’en fournir l’énoncé) exige que l’on examine toutes les DF non triviales, pour vérifier qu’il n’en existe pas au moins une qui soit partielle, ou de façon équivalente que toutes les DF non triviales sont irréductibles (totales, élémentaires selon les auteurs...)
Dans ces conditions, la relvar TRAVAIL respecte-t-elle la deuxième forme normale (2NF) ?
Reprenons la définition qui en a été donnée en 1971 par son inventeur, Ted Codd :
Une relation R est en deuxième forme normale si elle est en première forme normale et si chaque attribut n'appartenant à aucune clé candidate est en dépendance totale de chaque clé candidate de R.
La relvar TRAVAIL respecte la première forme normale car par définition, une relvar ne peut pas la violer, sinon ça n’est pas une relvar.
Une dépendance fonctionnelle n’est pas totale si elle est partielle (réductible), c'est-à-dire si le dépendant ne dépend que d’un sous-ensemble strict du déterminant. La relvar TRAVAIL a pour seule clé candidate {NE}, c'est-à-dire que chaque {attribut} de la relvar est le dépendant d’une DF à laquelle participe {NE} en tant que déterminant. {NE} est singleton donc irréductible : eu égard à la liste LF des dépendances fonctionnelles, la relvar TRAVAIL respecte la 2NF.
=> Votre affirmation est donc hors sujet.
La relvar SALARIE {NE, NOME, SALAIRE, ADRE, TELE, NF, NT, NB, ND, NP} a une tête sympathique, mais elle n’est pas la conséquence du respect de la 2NF puisque déjà la relvar TRAVAIL la respecte. Par ailleurs, il faudrait que vous proposiez un raisonnement étayé sur la base duquel on peut produire cette nouvelle relvar.
La relvar TRAVAIL respecte-t-elle la troisième forme normale (3NF) ?
Reprenons la définition qui en a été donnée en 1971 par son inventeur, Ted Codd :
Une relation R est en troisième forme normale si elle est en deuxième forme normale et si chaque attribut n'appartenant à aucune clé candidate ne dépend directement que des clés candidates de R.
La relvar TRAVAIL respecte la 2NF, mais considérons par exemple la DF :
DF10 : {ND} → {BUD}
{BUD} dépend directement de {ND} qui n’est pas clé candidate de la relvar TRAVAIL : la 3NF est violée. De la même façon, les dépendances fonctionnelles DF11 à DF17 sont peccamineuses eu égard à la 3NF.
La relvar SALARIE {NE, NOME, SALAIRE, ADRE, TELE, NF, NT, NB, ND, NP}que vous proposez respecte-t-elle la 3NF ? Non, car il reste une DF transitive que je vous laisse le soin de mettre en évidence.
Comme dans le cas de la relvar SALARIE, il faudrait enfin que vous proposiez le raisonnement sur lequel vous vous appuyez pour produire les relvars DEPARTEMENT, FONCTION, PROJET, BUREAU qui en l’état sortent d’un chapeau. Je ne vous demande pas d’exposer en détail les conditions dans lesquelles la décomposition d’une relvar préserve les dépendances fonctionnelles, mais il y a tout de même un minimum de références à fournir...
Normalisation en 3NF de la relvar TRAVAIL
Pour normaliser la relvar TRAVAIL en 3NF, il faut se servir du théorème de Heath, tout en tenant compte de la recommandation de Rissanen qui l’accompagne (corollaire de la préservation des dépendances fonctionnelles à laquelle je viens de faire allusion).
Considérons par exemple les DF :
DF13 : {NF} → {SALMIN}
DF14 : {NF} → {NOMF}
De ces deux DF, par application de la règle d’union, on infère la DF :
{NF} → {NOMF, SALMIN}
En vertu du théorème de Heath, la relvar TRAVAIL peut être décomposée par projection selon les deux relvars
FONCTION {NF, NOMF, SALMIN}
T2 {NE, NOME, SALAIRE, NB, SURF, ND, BUD, NOMD, NF, NP, BP, NT, ADRE, TELE}
Telles que TRAVAIL = FONCTION JOIN T2 (préservation du contenu de la base de données). JOIN est l'opérateur de jointure.
Concernant la relvar FONCTION, elle vérifie les DF :
{NF} → {NOMF, SALMIN}
{NOMF} → {NF, SALMIN}
Elle a donc pour clés candidates {NF} et {NOMF} et on montre facilement qu’elle respecte la 3NF (et même la 5NF, en vertu du théorème de Date et Fagin).
T2 n’est pas en 3NF, mais je vous laisse le soin de poursuivre le travail de décomposition permettant de mettre en évidence rationnellement les relvars SALARIE, DEPARTEMENT, PROJET, BUREAU.
MCD
Votre MCD est conforme aux dépendances fonctionnelles DF01 à DF16. Il faudrait ajouter comme ci-dessous un commentaire comme quoi NOMF est identifiant alternatif pour l’entité-type FONCTION (conséquence de la dépendance fonctionnelle DF16). Je ne pense pas qu’AnalyseSI permette de prendre en compte les identifiants alternatifs dans les MCD.
![](http://www.fsmwarden.com/developpez_2/Olive3(Normalisation)MCD_f.png)
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Olive3
Je me pose une question suite au précédent message : NE est elle la seule clé....?
En y regardant de plus près le MCD, NF,NB,NP,ND peuvent être considérés comme clé aussi. Qu'en pensez vous?
J’ai montré ci-dessus (Normalisation en 3NF de la relvar TRAVAIL) que la relvar FONCTION a pour clés {NF} et {NOMF}. J’espère que désormais vous saurez montrer que {ND} est clé de la relvar DEPARTEMENT, etc.
Je n'ai pas le temps relire tout ce que je viens d'écrire : je le ferai ultérieurement...
Partager