© Your Copyright
La décomposition d’une relation permettra d’éviter les redondances et les anomalies de mises à jours qui en découlent.
Cependant il faudra être à même de retrouver les informations qui existaient initialement dans la relation en réalisant une jointure naturelle entre les tables resultant de la décomposition.
Une décomposition de relation sans perte d’information (SPI) mettra en application un théorème de décomposition (théorème de Heath) à partir des dépendances fonctionnelles.
La décomposition de la relation \(R(A,B,C,D)\) :
R | |||
---|---|---|---|
A | B | C | D |
a1 | b1 | c1 | d1 |
a2 | b1 | c2 | d2 |
a3 | b1 | c1 | d1 |
En deux relations \(R_1(A,B)\) et \(R_2(B,C,D)\) :
R1 | |
---|---|
A | B |
a1 | b1 |
a2 | b1 |
a3 | b1 |
R2 | ||
---|---|---|
B | C | D |
b1 | c1 | d1 |
b1 | c2 | d2 |
ne sera pas sans perte d’informations du fait que la jointure naturelle entre les deux relations
- \(\Join_{[R_1.B=R_2.B]}(R_1, R_2)\) :
ne permet pas de reconstituer la relation de départ.
En effet, l’attribut de jointure (B
) ne permet pas de reconstituer la table d’origine
puisqu’une valeur de cet attribut ne permet pas de déterminer une seule valeur pour les attributs (C,D
)
Avant d’éxécuter la requête de jointure naturelle ci-dessous, combien d’éléments pensez-vous qu’elle donnera comme résultat ?
Par contre la décomposition en deux relations \(R_1(A,B,C)\) et \(R_2(A,D)\) :
- \(\Join_{[R_1.A=R_2.A]}(R_1, R_2)\) :
R1 | ||
---|---|---|
A | B | C |
a1 | b1 | c1 |
a2 | b1 | c2 |
a3 | b1 | c1 |
R2 | |
---|---|
A | D |
a1 | d1 |
a2 | d2 |
a3 | d1 |
permettra de reconstituer la relation de départ par jointure naturelle puisque à chaque valeur de l’attribut A
correspond une seule valeur des attributs B,C
et de l’attribut D
.
Autrement dit :
- \(A \rightarrow (B,C)\)
- \(A \rightarrow D\)
Dans la relation \(R(A,B,C,D)\) :
R | |||
---|---|---|---|
A | B | C | D |
a1 | b1 | c1 | d1 |
a2 | b1 | c2 | d2 |
a3 | b1 | c1 | d1 |
Où l’on identifie les dépendances fonctionnelles :
- \(A \rightarrow (B,C)\)
- \(C \rightarrow D\)
- \(D \rightarrow B\)
La décomposition précédente en deux relations \(R_1(A,B,C)\) et \(R_2(A,D)\) :
R1 | ||
---|---|---|
A | B | C |
a1 | b1 | c1 |
a2 | b1 | c2 |
a3 | b1 | c1 |
R2 | |
---|---|
A | D |
a1 | d1 |
a2 | d2 |
a3 | d1 |
ne préservera pas correctement les dépendances entre les informations.
Par contre la décomposition suivante en trois relations :
- \(R_1(A,B,C)\)
- \(R_2(C,D)\)
- \(R_3(D,B)\)
permettra de préserver les dépendances fonctionnelles du schéma relationnel (les attributs de chaque relation est constitué de l’ensemble des attributs des DF).
Dans la création du modèle de données en SQL, les attributs « source » des DF constitueront la clé primaire de la relation et certains attributs de jointure qui apparaissent comme clé primaire dans une autre table pourront être définies comme clé étrangère référençant la clé primaire de la table en question.
Dans le cas précédent on pourra représenter notre modèle de données de la manière suivante :
- \(R_1(\underline{A},B,\#C)\)
- \(R_2(\underline{C},\#D)\)
- \(R_3(\underline{D},B)\)
Où, par convention les clés primaires de tables sont représentés par des attributs soulignés et les clés étrangères sont préfixés par un “hashtag” (#).
Avant d’éxécuter les requêtes suivantes, laquelle d’après vous ne permettra pas de retrouver les informations de la table d’origine \(R(A,B,C,D)\) :
SELECT A,B,C,D FROM R1 NATURAL JOIN R2;
SELECT A,B,C,D FROM R1 NATURAL JOIN R3;
A votre avis pour quelle raison ?
Un schéma relationnel \(R(U,F)\) constitué :
- d’un ensemble d’attributs : \(U=(X,Y,Z)\)
- d’un ensemble de DF : \(F=\{X \rightarrow Y \}\)
pourra être décomposé sans perte d’informations (SPI) en deux relations :
- \(R_1(X,Y),R_2(X,Z)\)
en appliquant le théorème de Heath ou théorème de décomposition SPI.
Alors la décomposition en deux relations :
- \(R_1(X,Y),R_2(X,Z)\)
où la différence entre les ensembles d’attributs des deux relations :
- \(Y=\setminus((X,Y),(X,Z))\)
ou :
- \(Z=\setminus((X,Z),(X,Y))\)
dépend fonctionnellement de l’intersection de ces ensembles d’attributs :
- \(X=\cap((X,Y),(X,Z))\)
est sans perte d’information (SPI).
Autrement dit :
- \(\cap((X,Y),(X,Z)) \rightarrow \setminus((X,Y),(X,Z))\)
ou :
- \(\cap((X,Y),(X,Z)) \rightarrow \setminus((X,Z),(X,Y))\)
Dans le contexte du schéma relationnel ci-dessus la décomposition en deux relations :
- \(R_1(X,Y),R_2(X,Z)\)
permettra par jointure naturelle sur le groupe d’attributs \(X\) de retrouver les informations de la table d’origine \(R(X,Y,Z)\)
- \(R(X,Y,Z)= \Join_{[R_1.X=R_2.X]}(R_1(X,Y),R_2(X,Z))\)
puisque l’intersection des groupes d’attributs des deux relations \(R_1,R_2\) :
- \(X=\cap((X,Y),(X,Z))\)
est le groupe d’attributs source de la dépendance fonctionnelle (\(X \rightarrow Y\))
et la différence des groupes d’attributs des deux relations \(R_1,R_2\) :
- \(Y=\setminus((X,Y),(X,Z))\)
représente le groupe d’attributs cible de la dépendance fonctionnelle (\(X \rightarrow Y\))
Par contre les décompositions suivantes :
- \(R_1(X,Y),R_2(Y,Z)\)
- \(R_1(X,Z),R_2(Y,Z)\)
ne permettront pas de :
- satisfaire le théorème de décomposition sans perte
- préserver la DF : \(X \rightarrow Y\)
- retrouver les informations de la relation initiale \(R\) en effectuant une jointure entre les tables \(R_1,R_2\).
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 ne peut identifier qu’une seule DF :
- \(Y \rightarrow Z\).
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\)
Créer en SQL l’instance de relation :
R | ||
---|---|---|
X | Y | Z |
x1 | y1 | z1 |
x2 | y1 | z1 |
x2 | y2 | z2 |
x3 | y3 | z2 |
x3 | y2 | z2 |
Puis créer les tables correspondant à la décomposition de la relation \(R(X,Y,Z)\)
- \(R_1(X,Y),R_2(Y,Z),R_3(X,Z)\)
en y ajoutant les éléments correspondant de la relation \(R(X,Y,Z)\)
Table \(R(X,Y,Z)\)
CREATE TABLE R (
X char(2),
Y char(2),
Z char(2)
);
INSERT INTO R VALUES('x1','y1','z1');
INSERT INTO R VALUES('x2','y1','z1');
INSERT INTO R VALUES('x2','y2','z2');
INSERT INTO R VALUES('x3','y3','z2');
INSERT INTO R VALUES('x3','y2','z2');
Table \(R_1(X,Y)\)
CREATE TABLE R1 (
X char(2),
Y char(2)
);
INSERT INTO R1 VALUES('x1','y1');
INSERT INTO R1 VALUES('x2','y1');
INSERT INTO R1 VALUES('x2','y2');
INSERT INTO R1 VALUES('x3','y3');
INSERT INTO R1 VALUES('x3','y2');
Table \(R_2(Y,Z)\)
CREATE TABLE R2 (
Y char(2),
Z char(2)
);
INSERT INTO R2 VALUES('y1','z1');
INSERT INTO R2 VALUES('y2','z2');
INSERT INTO R2 VALUES('y3','z2');
Table \(R_3(X,Z)\)
CREATE TABLE R3 (
X char(2),
Z char(2)
);
INSERT INTO R3 VALUES('x1','z1');
INSERT INTO R3 VALUES('x2','z1');
INSERT INTO R3 VALUES('x2','z2');
INSERT INTO R3 VALUES('x3','z2');
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))\)