© 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 :math:`Z\).
Comme \(Y\) suffit à déterminer \(Z\) on peut
En effet, \(Y\) est le seul attribut pour lequel à chaque valeur correspond une seule et même valeur de l’attribut \(Z\).
Par contre :
\(Z \nrightarrow Y\) (à une valeur de \(Z\) correspond 2 valeurs différentes de \(Y\))
- \(z2 \rightarrow y2\)
- \(z2 \rightarrow y3\)
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 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 à 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\)
Créer les instances des tables
- \(vols(vol,avion)\)
- \(pilotes(vol,pilote)\)
issues de la décomposition de la table initiale
En utilisant les relations issues de la décomposition, peut-on retrouver par jointure naturelle la table initiale
compagnies(vol,avion,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 |
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');
Par jointure naturelle :
SELECT * FROM vols NATURAL JOIN pilotes;
entre les instances de relations vols,pilotes
on pourra reconstituer
l’instance de la relation d’origine compagnies
.
Il faut cependant vérifier sur d’autres instances de la relation d’origine que la jointure donne toujours le même résultat.
En utilisant la décomposition précédente, si on met à jour la table
vols
pour que l’avionavion='A 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 ?
Qu’aurait-il fallu prendre en compte lors de la décomposition ?
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 entre les relations 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 |
Il aurait fallu respecter le théorème de décomposition sans perte de Heath afin de préserver la DF \(avion \rightarrow pilote\).
Trouvez, en appliquant le théorème de Heath, une décomposition qui préservera les DFE identifiées sur l’instance de la relation compagnies
.
Texte : inputlines1048.txtZone de saisie de texte
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
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.
Mettre à jour la table vols
pour que l’avion avion='A 380'
puisse être affecté au vol AA 1234
.
Refaire la jointure naturelle entre les tables.
Les DFE sont-elles toujours respectées ? Argumentez votre réponse en fonction du résultat obtenu.
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, en appliquant le théorème de Heath,
- \(avions(avion,pilote)\)
- \(vols(vol,avion)\)
car 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))\)
On créera la table vols(vol,avion)
en y insérant les éléments suivants :
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');
et la table avions(avion,pilote)
en y insérant les éléments suivants :
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');
Comme précédemment, en faisant la jointure naturelle :
SELECT * FROM vols NATURAL JOIN avions;
on peut vérifier que l’on obtient les mêmes informations que dans la table d’origine.
compagnies | ||
---|---|---|
vol | avion | pilote |
AA 1234 | B 747 | Roger |
AA 5678 | B 747 | Roger |
AF 1234 | A 320 | Alfred |
AF 5678 | A 380 | Alfred |
En mettant à jour l’élément :
UPDATE vols SET avion='A 380' WHERE vol='AA 1234';
et en faisant la jointure naturelle :
- \(\Join_{[vols.vol=pilotes.vol]}(vols,pilotes)\)
On vérifie bien que cette jointure respecte la dépendance fonctionnelle :
- \(avion \rightarrow pilote\)
puisque le résultat de la jointure :
vol | avion | pilote |
---|---|---|
AA 5678 | B 747 | Roger |
AF 1234 | A 320 | Alfred |
AA 1234 | A 380 | Alfred |
AF 5678 | A 380 | Alfred |
montre qu’il n’y a toujours qu’un seul pilote affecté à un avion