© Your Copyright
A partir de l’instance de relation :
R | ||
---|---|---|
X | Y | Z |
x1 | y1 | z1 |
x2 | y1 | z1 |
x2 | y2 | z2 |
x3 | y3 | z2 |
x3 | y2 | z2 |
Quels dépendances fonctionnelles pouvez-vous identifiez ? Justifiez votre réponse!
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Dans cette relation on peut identifier les DF :
- \((X,Y) \rightarrow Z\).
- \(Y \rightarrow Z\).
Puisque à chaque couple de valeurs de \((X,Y)\) ou à chaque valeur de \(Y\) correspond une seule valeur de \(Z\).
\(Y\) est le seul attribut pour lequel à chaque valeur correspond une seule et même valeur de l’attribut \(Z\).
De la même manière :
\(Y \nrightarrow X\):
- \(y1 \rightarrow x1\)
- \(y1 \rightarrow x2\)
\(X \nrightarrow Y\).
- \(x2 \rightarrow y1\)
- \(x2 \rightarrow y2\)
\(X \nrightarrow Z\)
- \(x2 \rightarrow z1\).
- \(x2 \rightarrow z2\).
\(Z \nrightarrow Y\)
- \(z1 \rightarrow x1\)
- \(z1 \rightarrow x2\)
A partir de l’instance de relation :
ventes | ||
---|---|---|
client | produit | prix |
André | poivre | 2.5 |
Maxime | poivre | 2.5 |
Maxime | piment | 3.2 |
Zoé | sel | 3.2 |
Zoé | piment | 3.2 |
Y a t’il une DF ? Si oui, laquelle ? Expliquez !
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Oui, le prix dépend fonctionnellement du produit :
- \(produit \rightarrow prix\).
C’est le seul attribut pour lequel à chaque valeur correspond une seule et même valeur de l’attribut \(prix\).
Par contre \(client \nrightarrow produit\) (connaître un client ne veut pas dire que l’on sait exactement le produit qu’il va acheter)
En effet à une même valeur de \(client (ex: Maxime)\) correspond deux valeurs différentes de \(produit (poivre,piment)\)
De la même manière :
- \(prix \nrightarrow produit\) : le prix ne permet pas de retrouver le produit
- \(prix \nrightarrow client\) : le prix ne détermine pas le client (mais peut le dissuader d’acheter le produit)
- \(produit \nrightarrow client\) : connaître le produit ne veut pas dire qu’on connait le client (quoique …)
- \(client \nrightarrow prix\) : connaître le client ne permet pas de retrouver le prix du produit
A partir de l’instance de relation \(R(A,B,C,D,E)\) suivante :
R | ||||
---|---|---|---|---|
A | B | C | D | E |
a1 | b1 | c1 | d1 | e1 |
a1 | b2 | c2 | d2 | e1 |
a2 | b1 | c3 | d3 | e1 |
a2 | b1 | c4 | d3 | e1 |
a3 | b2 | c5 | d1 | e1 |
Répondre aux questions suivantes sur les DFE.
Expliquer pour quelle raison la DF suivante :
- \(C \rightarrow (A,B,D,E)\)
peut être retenue dans l’ensemble des DFE
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Pour chaque enregistrement la valeur de l’attribut \(C\) est différente. Donc si on connait la valeur de \(C\) on retrouve les valeurs des attributs \((A,B,D,E)\).
- \(C \rightarrow (A,B,D,E)\) représente donc une DF.
En utilisant l’axiome de décomposition on peut décomposer la DF en faisant apparaître un seul attribut cible :
- \(C \rightarrow A\)
- \(C \rightarrow B\)
- \(C \rightarrow D\)
- \(C \rightarrow E\)
Comme il n’y a qu’un seul attribut source, il ne peut donc y avoir de sous-ensemble qui soit une DF sur l’attribut cible.
La DF :
- \(C \rightarrow (A,B,D,E)\)
représente donc 4 DFE.
Expliquer pour quelle raison la DF suivante :
- \((A,B,C) \rightarrow (D,E)\)
ne peut être retenue dans l’ensembles des DFE
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Un sous-ensemble de l’ensemble des attributs \((A,B,C)\) suffit pour déterminer les valeurs des attributs \((D,E)\)
Les DF \((A,B,C) \rightarrow D\) et \((A,B,C) \rightarrow E\) ne peuvent donc pas être retenues dans l’ensemble des DFE.
Trouver les Dépendances Fonctionnelles Elémentaires (DFE) existantes entre les attributs \((A,B,C,D,E)\).
On représentera les DF sous la forme \(X \rightarrow A\).
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Les quatre premières DF s’expliquent du fait qu’il n’y a qu’un seul élément (une seule valeur) dans l’ensemble \(E\) sur tous les enregistrements, l’attribut E dépend donc fonctionnellement de chaque attribut de la relation \((A,B,C,D)\). Ce sont des DFE car il n’y a qu’un attribut cible et, du fait que la source de la DF n’est constitué que d’un seul attribut, il n’existe pas de sous-ensemble des attributs source qui pourraient représenter une DF sur l’attribut \(E\) .
Comme les valeurs de l’attribut \(C\) sont toutes différentes, chacun des autres attributs dépend fonctionnellement de l’ensemble \(C\). En utilisant des axiomes d’additivité et de décomposition on peut donc grouper les DFE en une seule DF \(C \rightarrow (A,B,D,E)\) puis les dégrouper pour obtenir les DFE.
Il ne pourra y avoir de combinaison des attributs \((A,B,C,D)\) en tant qu’attributs source pour déterminer l’attribut cible \(E\) puisqu’avec les DFE précédentes il y aura toujours un sous-ensemble de ces combinaisons qui suffira à déterminer les valeurs de \(E\).
La cinquième DF peut-être retenue en tant que DFE car pour chaque valeur combinée des attributs \((A,B)\), il n’y a qu’une seule valeur associée de l’attribut \(D\). Ce ne sera pas le cas pour les 2 sous-ensembles possibles de ces 2 attributs source. Par contre \((A,B) \rightarrow C\) ne sera pas une DF car il peut correspondre des valeurs différentes de l’attribut cible pour un même combinaison des valeurs des attributs sources \(A,B\).
De même, la sixième DF peut-être retenue en tant que DFE car pour chaque valeur combinée des attributs \((A,D)\), il n’y a qu’une seule valeur associée de l’attribut \(B\). Par contre il n’y a pas une seule valeur correspondante de l’attribut \(C\).
La dernière DF peut aussi être retenue en tant que DFE car pour chaque valeur combinée des attributs \((B,D)\), il n’y a qu’une seule valeur associée de l’attribut \(A\). Par contre il n’y a pas une seule valeur correspondante de l’attribut \(C\).
A partir de l’instance de relation :
R | ||
---|---|---|
X | Y | Z |
x1 | y1 | z1 |
x2 | y1 | z1 |
x2 | y2 | z2 |
x3 | y3 | z2 |
x3 | y2 | z2 |
On défini le schéma relationnel \(R(X,Y,Z)\) avec :
- \(R(X,Y,Z)\)
- \(Y \rightarrow Z\)
Et les décompositions possibles de la realtion \(R(X,Y,Z)\) :
- \(R_1(X,Y),R_2(Y,Z),R_3(X,Z)\)
Sur les trois jointures naturelles possibles :
SELECT X,Y,Z FROM R1 NATURAL JOIN R2;
SELECT X,Y,Z FROM R1 NATURAL JOIN R3;
SELECT X,Y,Z FROM R2 NATURAL JOIN R3;
Laquelle permettra de reconstruire les informations présentes dans la table \(R(X,Y,Z)\) ?
Expliquez pour quelles raisons.
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
SELECT X,Y,Z FROM R1 NATURAL JOIN R2;
C’est la seule décomposition pour laquelle la différence des groupes d’attributs des deux relations \(R_1(X,Y), R_2(Y,Z)\)
- \(Z=\setminus((Y,Z),(X,Y))\)
dépend fonctionnellement de l’intersection de ces mêmes groupes d’attributs :
- \(Y=\cap((Y,Z),(X,Y)))\)
Du fait de la seule DF du schéma relationnel : \(Y \rightarrow Z\)
Alors que pour les relations \(R_2(Y,Z),R_3(X,Z)\)
- \(Y=\setminus((Y,Z),(X,Z))\)
- \(X=\setminus((X,Z),(Y,Z))\)
\(X,Y\) ne dépendent pas fonctionnellement de \(Z\)
- \(Z=\cap((Y,Z),(X,Z))\)
Ainsi que pour les relations \(R_1(X,Y),R_3(X,Z)\)
- \(Y=\setminus((X,Y),(X,Z))\)
- \(Z=\setminus((X,Z),(X,Y))\)
\(Y,Z\) ne dépendent pas fonctionnellement de \(X\)
- \(X=\cap((X,Y),(X,Z))\)
A partir de l’instance de relation :
ventes | ||
---|---|---|
client | produit | prix |
André | poivre | 2.5 |
Maxime | poivre | 2.5 |
Maxime | piment | 3.2 |
Zoé | sel | 3.2 |
Zoé | piment | 3.2 |
Sur les trois décompositions possibles :
produits(produit,prix)
preferences(client,produit)
depenses(client,prix)
Quelle(s) jointure(s) naturelle(s) permet(tent) de retrouver l’instance de la relation d’origine :
SELECT client,produit,prix FROM preferences NATURAL JOIN produits;
SELECT client,produit,prix FROM preferences NATURAL JOIN depenses;
SELECT client,produit,prix FROM produits NATURAL JOIN depenses;
Expliquez pour quelles raisons.
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
SELECT client,produit,prix FROM preferences NATURAL JOIN produits;
C’est la seule décomposition pour laquelle la différence :
- \(prix=\setminus((produit,prix),(client,produit))\)
des groupes d’attributs des deux relations :
- \(preferences(client,produit), produits(produit,prix)\)
dépend fonctionnellement de l’intersection de ces mêmes groupes d’attributs :
- \(produit=\cap((client,produit),(produit,prix))\)
Du fait de la DFE identifiée dans l’instance de la relation d’origine :
- \(produit \rightarrow prix\)
Pour la décomposition :
- \(preferences(client,produit),depenses(client,prix)\) :
La différence (\(produit\) ou \(prix\)):
- \(produit=\setminus((client,produit),(client,prix))\)
- \(prix=\setminus((client,prix),(client,produit))\)
des groupes d’attributs ne dépendent pas fonctionnellement de l’intersection (\(client\)) de ces mêmes groupes d’attributs:
- \(client=\cap((client,prix),(client,produit))\)
Connaître le client ne permet pas de retrouver le produit ou le prix.
De même, pour la décomposition en relations :
- \(produits(produit,prix),depenses(client,prix)\)
La différence (\(produit\) ou \(client\)) :
- \(produit=\setminus((produit,prix),(client,prix))\)
- \(client=\setminus((client,prix),(produit,prix))\)
des groupes d’attributs ne dépendent pas fonctionnellement de l’intersection (\(prix\)) de ces mêmes groupes d’attributs:
- \(prix=\cap((client,prix),(produit,prix))\)
Connaître le prix ne permet pas de retrouver le produit ou le client.
Tests SQL :
Soit la relation \(R(A,B,C)\) avec l’ensemble des Dépendances Fonctionnelles :
- \(F=\{ A \rightarrow B, B \rightarrow C \}\)
En quelle forme normale est cette relation ?
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
On est en 2NF :
- par transitivité (\(A \rightarrow B,B \rightarrow C\)) on trouve la DF : \(A \rightarrow C\)
- donc par additivité on obtient la DF : \(A \rightarrow (B,C)\)
- par conséquent la clé est constitué d’un seul attribut \(A\) ce qui veut dire qu’on est en 2NF car il ne peut y avoir de sous-ensemble de la clé qui détermine les autres attributs.
- Cette relation n’est pas en 3NF du fait de la dépendance transitive \(A \rightarrow B, B \rightarrow C\)
L’instance de relation suivante :
R | ||
---|---|---|
A | B | C |
a1 | b1 | c1 |
a2 | b1 | c2 |
a3 | b1 | c1 |
a4 | b2 | c2 |
peut-elle représenter une instance de la relation \(R(A,B,C)\) si l’ensemble des Dépendances Fonctionnelles identifiées sur cette relation est :
- \(F=\{ A \rightarrow B, B \rightarrow C \}\)
Que faudrait-il ajouter ou enlever à cette instance de relation pour qu’elle satisfasse les Dépendances Fonctionnelles du schéma relationnel ?
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Non car à une même valeur de l’attribut \(B\) correspond deux valeurs différentes de l’attribut \(C\):
- \(b1 \rightarrow c1\)
- \(b1 \rightarrow c2\)
ce qui contredit la dépendance fonctionnelle \(B \rightarrow C\).
Il suffirait d’enlever le deuxième enregistrement \((a2,b1,c2)\) pour que la DF \(B \rightarrow C\) soit respectée.
A partir de l’instance de relation \(R(A,B,C)\) suivante :
R | ||
---|---|---|
A | B | C |
a1 | b1 | c1 |
a2 | b1 | c2 |
a3 | b1 | c1 |
a4 | b2 | c2 |
Quelles sont les DF que l’on peut identifier dans cette instance de table et en quelle forme normale est cette relation ? Justifiez votre réponse.
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
On peut identifier dans cette instance de relation la DF \(A \rightarrow (B,C)\). En effet, à chaque valeur de l’attribut \(A\) correspond une seule valeur de l’attribut \(B\) :
- \(A \rightarrow B\)
A chaque valeur de l’attribut \(A\) correspond une seule valeur de l’attribut \(C\) :
- \(A \rightarrow C\)
L’instance de relation est en 3NF car un seul attribut permet de retrouver les deux autres et il n’y a pas de dépendances transitive entre les attributs.
A partir de l’instance de relation \(R(A,B,C)\) suivante :
R | ||
---|---|---|
A | B | C |
a1 | b1 | c1 |
a2 | b1 | c2 |
a3 | b1 | c1 |
a4 | b2 | c2 |
On identifie la DF \(A \rightarrow (B,C)\).
Parmi les jointures naturelles suivantes :
- \(\Join_{[R_1.A=R_2.A]}(R_1,R_2)\)
- \(\Join_{[R_1.B=R_3.B]}(R_1,R_3)\)
- \(\Join_{[R_2.C=R_3.C]}(R_2,R_3)\)
Laquelle reconstituera la table d’origine ? Justifiez votre réponse sans donner le résultat des requêtes.
Vérifiez en créant instances des relations \(R(A,B,C), R_1(A,B),R_2(A,C),R_3(B,C)\) et exécutant les requêtes correspondantes.
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
La jointure naturelle :
- \(\Join_{[R_1.A=R_2.A]}(R_1,R_2)\)
permettra de reconstituer la table d’origine du fait de la DF \(A \rightarrow (B,C)\) que l’on a sur l’instance de la relation \(R(A,B,C)\).
En effet, d’après le théorème de Heath lors de la décomposition, la différence des ensembles d’attributs devra dépendre fonctionnellement de l’intersection des deux ensembles d’attributs.
Or :
- \(A=\cap((A,B),(A,C))\)
- \(B=\setminus((A,B),(A,C))\)
- \(C=\setminus((A,C),(A,B))\)
Donc :
- \(\cap((A,B),(A,C)) \rightarrow \setminus((A,B),(A,C))\)
- \(\cap((A,B),(A,C)) \rightarrow \setminus(((A,C),A,B))\)
Par conséquent on peut décomposer la table :
- \(R(A,B,C)\)
en deux tables :
- \(R_1(A,B)\)
- \(R_2(A,C)\)
sans perte d’information.
Création de la table \(R(A,B,C)\)
CREATE TABLE R (
A char(2),
B char(2),
C char(2)
);
INSERT INTO R VALUES('a1','b1','c1');
INSERT INTO R VALUES('a2','b1','c2');
INSERT INTO R VALUES('a3','b1','c1');
INSERT INTO R VALUES('a4','b2','c2');
CREATE TABLE R1 (
A char(2),
B char(2)
);
INSERT INTO R1 VALUES('a1','b1');
INSERT INTO R1 VALUES('a2','b1');
INSERT INTO R1 VALUES('a3','b1');
INSERT INTO R1 VALUES('a4','b2');
CREATE TABLE R2 (
A char(2),
C char(2)
);
INSERT INTO R2 VALUES('a1','c1');
INSERT INTO R2 VALUES('a2','c2');
INSERT INTO R2 VALUES('a3','c1');
INSERT INTO R2 VALUES('a4','c2');
CREATE TABLE R3 (
B char(2),
C char(2)
);
INSERT INTO R3 VALUES('b1','c1');
INSERT INTO R3 VALUES('b1','c2');
INSERT INTO R3 VALUES('b2','c2');
-- Vérification des jointures naturelles.
SELECT * FROM R;
SELECT * FROM R1 NATURAL JOIN R2;
SELECT * FROM R1 NATURAL JOIN R3;
SELECT A,B,C FROM R2 NATURAL JOIN R3;
La relation :
- \(employes(\underline{matricule},nom,prenom,age)\)
est-elle en 2NF ?
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
La relation :
- \(commandes(\underline{piece\_id, prod\_id},quantite,producteur\_nom)\)
est-elle en 2NF ?
Si non, quelle décomposition sans perte d’information peut-on faire ?
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Non car un sous-ensemble de la clé (attributs soulignés) permet de retrouver les attributs non-primitifs (attributs cible):
- \(prod\_id \rightarrow producteur\_nom\)
Quelle décomposition sans perte d’information peut-on faire ?
En appliquant le théorème de Heath on peut répartir les informations dans les deux relations suivantes :
- \(pieces(\underline{piece\_id, prod\_id},quantite)\)
- \(producteur(\underline{prod\_id},producteur\_nom)\)
car la différence des groupes d’attributs dépend fonctionnellement de l’intersection des groupes d’attributs
- \(producteur\_nom=\setminus((prod\_id,producteur\_nom),(piece\_id, prod\_id,quantite))\)
- \(prod\_id=\cap((prod\_id,producteur\_nom),(piece\_id, prod\_id,quantite))\)
On obtient ainsi un schéma relationnel en 2NF :
- Il faut connaître l’identifiant de la pièce et du producteur pour connaître la quantite produite
- L’identifiant du producteur suffit pour retrouver son nom.
En quelle forme normale est la relation :
- \(compagnies(vol,avion,pilote)\)
si on a les DFE suivantes entre les attributs :
- \(vol \rightarrow avion\)
- \(avion \rightarrow pilote\)
- \(vol \rightarrow pilote\)
Y aura t’il des anomalies de mises à jour ?
Si oui, que peut-on faire pour éviter ce problème de mises à jour
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
On est en 2NF car la clé ne contient qu’un seul attribut mais la relation n’est pas en 3NF du fait de la dépendance transitive (\(avion \rightarrow pilote\)) entre attributs non-clés.
Il y aura donc des problèmes de mises à jour.
En effet, il ne sera pas possible d’introduire un nouvel avion
sur un nouveau vol
sans préciser un nom de pilote
.
Pour éviter ce problème on pourrait proposer la décomposition suivante de la relation :
- \(vols(\underline{vol},avion)\)
- \(pilotes(\underline{vol},pilote)\)
qui permet de résoudre ce problème de dépendance entre attributs non-clés et de respecter la 3NF mais pas celui de la mise à jour (on perd la DF \(avion \rightarrow pilote\)).
Une décomposition basée sur le théorème de Heath permettra de préserver cette DF :
- \(avions(\underline{avion},pilote)\)
- \(vols(\underline{vol},avion)\)
où la différence des ensembles d’attributs :
- \(pilote=\setminus((avion,pilote),(vol,avion))\)
dépend fonctionnellement de l’intersection :
- \(avion=\cap((avion,pilote),(vol,avion))\)
Avec cette décomposition on évitera les problèmes de mises à jour et on pourra retrouver les informations de la relation initiale par jointure naturelle entre les deux relations.
On considère l’instance de la relation compagnies
suivante :
compagnies | ||
---|---|---|
vol | avion | pilote |
AA 1234 | B 747 | Roger |
AA 5678 | B 747 | Roger |
AF 1234 | A 320 | Alfred |
AF 5678 | A 380 | Alfred |
Créer l’instance de relation correspondant à cette table
CREATE TABLE compagnies (
vol char(7),
avion char(5),
pilote char(20)
);
INSERT INTO compagnies VALUES('AA 1234','B 747','Roger');
INSERT INTO compagnies VALUES('AA 5678','B 747','Roger');
INSERT INTO compagnies VALUES('AF 1234','A 320','Alfred');
INSERT INTO compagnies VALUES('AF 5678','A 380','Alfred');
Quelles dépendances fonctionnelles élémentaires (DFE) pouvez-vous identifier sur cette instance de relation ?
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
On identifie sur cette instance de relation les DFE suivantes :
- \(vol \rightarrow avion\)
- \(avion \rightarrow pilote\)
- \(vol \rightarrow pilote\)
puisqu’à un vol correspond un seul avion, à un avion correspond un seul pilote et (donc) à un vol correspond un seul pilote.
Par contre à un avion peut correspondre plusieurs vols et à un pilote peut correspondre plusieurs avions ou vols.
- \(avion \nrightarrow vol\)
- \(pilote \nrightarrow avion\)
- \(pilote \nrightarrow vol\)
A partir de la table :
- \(compagnies(\underline{vol},avion,pilote)\)
où nous disposons d’une table en 2NF (la clé est constitué d’un seul attribut) la décomposition suivante :
- \(vols(\underline{vol},avion)\)
- \(pilotes(\underline{vol},pilote)\)
permettra d’obtenir un schéma relationnel en 3NF car la DFE :
- \(avion \rightarrow pilote\)
entre les attributs non-clés n’apparaît plus dans les tables résultant de la décomposition.
Créer les instance de tables correpondant à l’instance de la relation d’origine.
Vérifier par jointure que l’on retrouve bien l’instance de la relation d’origine.
CREATE TABLE vols (
vol char(7),
avion char(5)
);
INSERT INTO vols VALUES('AA 1234','B 747');
INSERT INTO vols VALUES('AA 5678','B 747');
INSERT INTO vols VALUES('AF 1234','A 320');
INSERT INTO vols VALUES('AF 5678','A 380');
CREATE TABLE pilotes (
vol char(7),
pilote char(20)
);
INSERT INTO pilotes VALUES('AA 1234','Roger');
INSERT INTO pilotes VALUES('AA 5678','Roger');
INSERT INTO pilotes VALUES('AF 1234','Alfred');
INSERT INTO pilotes VALUES('AF 5678','Alfred');
SELECT * FROM vols NATURAL JOIN pilotes;
En utilisant la décomposition précédente, si on met à jour la table
vols
pour que l’avionA 380
puisse être affecté au volAA 1234
:UPDATE vols SET avion='A 380' WHERE vol='AA 1234';Quel sera le résultat de la jointure naturelle entre les tables
vols,pilotes
?La DFE : \(avion \rightarrow pilote\) est-elle respectée ?
Quelle décomposition aurait-il fallu proposer pour éviter ce problème de mise à jour ?
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
La décomposition de la table compagnies(vol,avion,pilote)
en :
vols(vol,avion)
pilotes(vol,pilote)
permettra par jointure naturelle de retrouver l’instance de table initiale.
Par contre après mise à jour de l’élément :
UPDATE vols SET avion='A 380' WHERE vol='AA 1234';
la jointure naturelle entre les relations vols,pilotes
:
- \(\Join_{[vols.vol=pilotes.vol]}(vols,pilotes)\)
donnera un résultat qui ne respectera pas la dépendance fonctionnelle :
- \(avion \rightarrow pilote\)
puisqu” Alfred
et Roger
pourront tous les deux piloter le boeing A 380
.
vol | avion | pilote |
---|---|---|
AA 1234 | A 380 | Roger |
AA 5678 | B 747 | Roger |
AF 1234 | A 320 | Alfred |
AF 5678 | A 380 | Alfred |
Cette décomposition fait perdre la DFE identifiée dans la relation d’origine :
- \(avion \rightarrow pilote\)
Proposer une décomposition de la relation de départ :
compagnies(vol,avion,pilote)
qui permette de préserver les DFE identifiées :
- \(vol \rightarrow avion\)
- \(avion \rightarrow pilote\)
- \(vol \rightarrow pilote\)
Suite à cette décomposition, créer en SQL les instances de tables correspondant à la table initiale.
Vérifiez que par jointure naturelle entre les tables vous obtenez bien les mêmes informations que celles qui sont présentes dans la table d’origine.
Vérifiez que vous préservez bien ces DFE lors de la mise à jour de l” avion A 380
que l’on affecte au :code:AA 1234`.
C’est à dire qu’il n’y aura qu’un seul avion associé à un vol, un seul avion associé à un pilote et qu’un vol ne concernera qu’un seul pilote.
Clavier | Action |
---|---|
F1 | Afficher une aide technique |
F2 | Afficher une aide pédagogique |
Ctrl-A | Tout sélectionner |
Ctrl-C | Copier la sélection dans le presse-papier |
Ctrl-V | Copier le presse-papier dans la sélection |
Ctrl-X | Couper la sélection et la copier dans le presse-papier |
Ctrl-Z | Annuler la modification |
Maj-Ctrl-Z | Rétablir la modification |
Menu | Action |
---|---|
Ré-initialiser les sorties | |
Faire apparaître le menu d'aide | |
Valider la zone de saisie | |
Initialiser la zone de saisie | |
Charger le contenu d'un fichier dans la zone de saisie | |
Sauvegarder le contenu de la zone de saisie dans un fichier | |
Imprimer le contenu de la zone de saisie |
Si sur la relation :
- \(compagnies(vol,avion,pilote)\)
on a les DFE :
- \(vol \rightarrow avion\)
- \(avion \rightarrow pilote\)
- \(vol \rightarrow pilote\)
On peut faire la décomposition suivante
- \(vols(vol,avion)\)
- \(avions(avion,pilote)\)
qui permettra de préserver la DFE :
- \(vol \rightarrow pilote\)
par l’axiome d’Armstrong de transitivité :
- \(X \rightarrow Y, Y\rightarrow Z \Longrightarrow X \rightarrow Z\)
On peut donc créer les tables suivantes :
CREATE TABLE vols (
vol char(7),
avion char(5)
);
INSERT INTO vols VALUES('AA 1234','B 747');
INSERT INTO vols VALUES('AA 5678','B 747');
INSERT INTO vols VALUES('AF 1234','A 320');
INSERT INTO vols VALUES('AF 5678','A 380');
CREATE TABLE avions (
avion char(5),
pilote char(20)
);
INSERT INTO avions VALUES('B 747','Roger');
INSERT INTO avions VALUES('A 320','Alfred');
INSERT INTO avions VALUES('A 380','Alfred');
A partir desquelles on pourra reconstituer la table d’origine par joiture naturelle :
- \(\Join_{[vols.avion=avions.avion]}(vols,pilotes)\)
SELECT * FROM vols NATURAL JOIN avions;
-- ou
SELECT vol,vols.avion,avions.pilote
FROM vols, avions
WHERE vols.avion=avions.avion;
après la mise à jour (UPDATE
), on vérifie bien que le résultat de la jointure naturelle :
UPDATE vols SET avion='A 380' WHERE vol='AA 1234';
SELECT * FROM vols NATURAL JOIN avions;
préservera la DFE :
- \(avion \rightarrow pilote\)
vol | avion | pilote |
---|---|---|
AA 1234 | A 380 | Alfred |
AA 5678 | B 747 | Roger |
AF 1234 | A 320 | Alfred |
AF 5678 | A 380 | Alfred |