Décompositions, Pertes de DF, Pertes d’informations, Décompositions FN3, Décompositions FNBC.
2025-12-08
Dans un système de BDD relationnelles, les données sont représentées par des tuples qui décrivent des relations. Lorsqu’on définit des tables dans une base de données, on décompose ces relations en plusieurs relations \(R_1\), \(R_2\), \(\dots\), les tables de la BDD.
Mais on ne peut pas décomposer arbitrairement. Toutes les décompositions ne sont pas pertinentes.
Conditions pour une décomposition pertinente :
Décomposition sans perte de dépendance fonctionnelle.
Décomposition sans perte d’information.
Décomposition qui minimise les redondances : notions de Forme Normale.
Définition
Soit \(\mathcal{A}\) un schéma de relation, on dit que \(\left\{\mathcal{A}_1,\dots ,\mathcal{A}_k\right\}\) est une décomposition de \(\mathcal{A}\) si et seulement si,
Note
Une décomposition n’est pas une partition. On n’impose pas que les \(\mathcal{A}_i\) soient deux à deux disjoints. Comme nous le verrons, ils ne doivent pas l’être, sinon, il n’y a plus de jointure possible.
est une décomposition de la relation
Définition
Soient \(\mathcal{A}\) et \(\mathcal{A}_1\) deux shémas tels que \(\mathcal{A}_1 \subset \mathcal{A}\), et \(\Sigma\) un ensemble de dépendances.
On appelle projection de \(\Sigma\) sur \(\mathcal{A}_1\) et on note \(\pi_{\mathcal{A}_1}(\Sigma)\) l’ensemble
\[\pi_{\mathcal{A}_1}(\Sigma)=\left\{ X\to Y \mid \Sigma\models X\to Y \text{ et } X,Y\subset \mathcal{A}_1\right\}\]
Autrement dit, \(\pi_{\mathcal{A}_1}(\Sigma)\) est l’ensemble des dépendances impliquées par \(\Sigma\) qui sont locales à \(\mathcal{A}_1\).
\({\mathcal{A}}=\left\{A,B,C\right\}\) et \(\Sigma=\left\{A\to B, B\to C, C\to A\right\}\)
\(\pi^{}_{\left\{A,B\right\}}(\Sigma)\) est équivalent à \(\left\{A\to B, B\to A\right\}\)
Propriété immédiate
Si \(X\) et \(Y\) sont des parties de \({\mathcal{A}}_1\), on a l’équivalence \[X\to Y \in \pi_{{\mathcal{A}}_1}(\Sigma) \iff Y\subset\left\{X\right\}^+\]
C’est une traduction de la définition.
Cet algorithme utilise la propriété précédente pour calculer un ensemble de DF équivalent à \(\pi_{\mathcal{A}_1}(\Sigma)\)
fonction projection(A1, Σ) P := ∅ for X ⊂ A1, X ≠ ∅, X ≠ A1 # Y = {attributs de A1 déterminés par X} Y := X⁺ ∩ A1 if Y ⊄ X # si X → Y n'est pas triviale # ajout de la DF X → Y\X P := P ⋃ { X → Y\X } return P
Très coûteux !
\({\mathcal{A}}=\left\{A,B,C,D,E\right\}\) et \(\Sigma=\left\{A\to C, BC\to D, AD\to E\right\}\)
\({\mathcal{A}}=\left\{A,B,C,D,E\right\}\) et \(\Sigma=\left\{A\to C, BC\to D, AD\to E\right\}\)
Définition
Soient \(\mathcal{A}\) un schéma, \(\Sigma\) un ensemble de DF sur \(\mathcal{A}\) et \(\left\{ \mathcal{A}_1,\dots, \mathcal{A}_k\right\}\) une décomposition de \(\mathcal{A}\).
La décomposition \(\left\{\mathcal{A}_1,\dots, \mathcal{A}_k\right\}\) préserve \(\Sigma \quad \quad\) ssi \(\quad \quad{\displaystyle \bigcup_{i=1}^k \pi_{\mathcal{A}_i}(\Sigma)}\) est équivalent à \(\Sigma\).
On dit que la décomposition est sans perte de dépendance (SPD).
Propriété immédiate
Si \(\Sigma\) est équivalent à un ensemble de dépendances fonctionnelles locales, la décomposition est SPD.
Propriété
\(X\to Y\) est préservée ssi la fermeture de \(X\) par rapport à \({\displaystyle \bigcup_{i=1}^k \pi_{\mathcal{A}_i}(\Sigma)}\) contient \(Y\).
Notations
Dans la suite du cours, on note :
L’algorithme retourne \(X^+_{\mathcal{A}_1,...,\mathcal{A}_k}\)
fonction fermeture_decomposition({A1,...,Ak}, Σ, X) Z := X go := True while go W := Z for i ∈ {1, ..., k} # pour chaque Ai, ajout des attributs de Ai déterminés par W ∩ Ai W := W ⋃ ((W ∩ Ai)⁺ ∩ Ai) # si W a augmenté, m.a.j. de Z et on reboucle, sinon arrêt if W ≠ Z Z := W else go := False return Z
Avertissement
Si au cours du calcul, on obtient que \(Y\subset Z\), on peut conclure immédiatement que \(X\to Y\) est préservée.
L’intérêt de cet algorithme est qu’il n’est pas nécessaire de calculer les DF locales (qui est un calcul très coûteux).
Propriété
Une décomposition \(\left\{\mathcal{A}_1,\dots ,\mathcal{A}_k\right\}\) est sans perte de DF (SPD) si
\(\mathcal{A}=\left\{A,B,C,D\right\}\),
\(\mathcal{A}_1=\left\{A,B\right\}\), \(\mathcal{A}_2=\left\{B,C\right\}\), \(\mathcal{A}_3=\left\{C,D\right\}\)
\(\Sigma=\left\{A\to B, B\to C, C\to D, D\to A\right\}\)
Est-ce que la décomposition \(\left\{\mathcal{A}_1,\mathcal{A}_2,\mathcal{A}_3\right\}\) préserve \(\Sigma\) ?
Les DF locales \(A\to B\), \(B\to C\), \(C\to D\) sont locales donc conservées.
Est-ce que les DF locales impliquent \(D\to A\) ?
Vérification en appliquant l’algorithme de calcul de \(\{D\}^+_{\mathcal{A}_1,\mathcal{A}_2,\mathcal{A}_3}\).
Initialisation \(Z := \{D\}\)
\((\{D\}\cap\{CD\})^+ \cap \{CD\}=\{D\}^+ \cap\{CD\}=\{DABC\} \cap \{CD\}=\{CD\}\), \(Z := \{CD\}\)
\((\{DC\}\cap \{BC\})^+ \cap \{BC\}=\{C\}^+ \cap \{BC\}=\{CDAB\}\cap \{BC\}=\{BC\}\), \(Z := \{BCD\}\)
\((\{DCB\}\cap \{AB\})^+ \cap \{AB\}=\{B\}^+ \cap \{AB\}=\{BCDA\} \cap \{AB\}\), \(Z := \{ABCD\}\)
\(\{DCBA\}\) contient \(A\) donc \(D\to A\) est préservée.
On pouvait voir aussi que
\(\Sigma=\left\{A\to B, B\to C, C\to D, D\to A\right\}\) est équivalent à l’ensemble de DF \(\Sigma' =\left\{A\to B, B\to A, B\to C, C\to B, C\to D, D\to C\right\}\) car la fermeture de toute partie non vide de \(\mathcal{A}\) par \(\Sigma'\) est \(\mathcal{A}\) comme pour \(\Sigma\) (chaque attribut est une clé).
les DF de \(\Sigma'\) sont locales donc préservées, la décomposition préserve \(\Sigma'\) donc \(\Sigma\).
\(\mathcal{A}= \{\verb!Ville, CP, Rue, Numero!\}\)
\(\Sigma= \{\verb!CP → Ville ; Ville Rue Numero → CP!\}\)
\(\mathcal{A}_1=\{\verb!Ville, CP!\}\) et \(\mathcal{A}_2=\{\verb!Rue, Numero, CP!\}\)
Est-ce que la décomposition \(\{\mathcal{A}_1, \mathcal{A}_2 \}\) préserve \(\Sigma\) ?
on calcule la fermeture \(\{\verb!Ville, Rue, Numero!\}^+_{\mathcal{A}_1,\mathcal{A}_2}\).
\(\verb!Z! := \{\verb!Ville, Rue, Numero!\}\)
\((\verb!Z !\cap \{\verb!Ville, CP!\})^+ \cap \{\verb!Ville, CP!\} = \{\verb!Ville!\}\), rien à ajouter.
\(\verb!(Z !\cap \{\verb!Rue, Numero, CP!\})^+ \cap \{\verb!Rue, Numero, CP!\} = \{\verb!Rue, Numero!\}\), rien à ajouter.
\(\{\verb!Ville, Rue, Numero!\}^+_{\mathcal{A}_1,\mathcal{A}_2}= \{\verb!Ville, Rue, Numero!\}\quad\) donc \(\verb!Ville Rue Numero → CP!\) n’est pas préservée.
Idée : Si on remplace le schéma
par les trois schémas
alors au lieu de stocker une relation R(V#, Vnom, Vville, P#, Pnom, Pprix, Qte), on stockera ses projections:
\[\pi_{\texttt{V\#,Vnom,Vville}}(\texttt{R}) \qquad \pi_{\texttt{P\#,Pnom,Pprix}}(\texttt{R}) \qquad \pi_{\texttt{V\#,P\#,Qte}}(\texttt{R})\]
Peut-on retrouver R par jointure à partir de ces trois projections ?
Définition : décomposition SPI
Soit \(\mathcal{A}\) un schéma de relation et \(\Sigma\) un ensemble de DF sur \(\mathcal{A}\).
Une décomposition \(\mathcal{D} = \{\mathcal{A}_1,..., \mathcal{A}_n\}\) est sans perte d’information par rapport à \(\Sigma\) si pour toute relation \(R\) de schéma \(\mathcal{A}\) satisfaisant \(\Sigma\),
Note
La jointure est l’opération inverse de la décomposition, on recompose l’information par jointure.
La décomposition doit garantir que pour toute relation R, ses projections contiennent la même information que R au sens que l’on doit pouvoir reconstruire R par jointure à partir de ses projections.
La propriété d’être sans perte d’information est liée à l’ensemble de DF considéré
On décompose une relation \(\verb!R!(\texttt{V\#, Vnom, Vville, P\#, Pnom, Pprix, Qte})\) vérifiant
\(\Sigma = \{\texttt{V\#} \to \texttt{Vnom Vville}\ , \ \texttt{P\#} \to \texttt{Pnom Pprix}\ , \ \texttt{V\# P\#} \to \texttt{Qte} \}\) en 3 relations
Peut-on affirmer que
\[\verb!R! = \verb!Vendeur! \bowtie \verb!Livraison! \bowtie \verb!Produit! \quad ?\]
On a envie de dire mais pourquoi et comment le prouver ?
\(\mathcal{A}=\{A,B,C\} \quad \Sigma=\{AB\rightarrow C\}\)
Décomposition \(\mathcal{A}_1=\{A,B\} \quad \mathcal{A}_2=\{B,C\}\)
Soit \(R\) la relation
| A | B | C |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 2 | 5 |
\(\pi_{AB}(R)=\)
| A | B |
|---|---|
| 1 | 2 |
| 4 | 2 |
\(\pi_{BC}(R)=\)
| B | C |
|---|---|
| 2 | 3 |
| 2 | 5 |
\(\pi_{AB}(R) \bowtie \pi_{BC}(R)=\)
| A | B | C |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 2 | 5 |
| 1 | 2 | 5 |
| 4 | 2 | 3 |
Le risque d’une mauvaise décomposition est que les jointures créent des tuples qui n’éxistaient pas dans la relation initiale (voir l’exemple précédent de décomposition avec perte d’information).
Pour le savoir, un algorithme simple existe appelé algorithme de poursuite
On décompose une relation \(\verb!R!(\texttt{V\#, Vnom, Vville, P\#, Pnom, Pprix, Qte})\) vérifiant \(\Sigma = \{\texttt{V\#} \to \texttt{Vnom Vville}\ , \ \texttt{P\#} \to \texttt{Pnom Pprix}\ , \ \texttt{V\# P\#} \to \texttt{Qte} \}\)
en trois relations :
Par définition des projections et des jointures, on sait que : \(\texttt{R} \subset \verb!Vendeur! \bowtie \verb!Livraison! \bowtie \verb!Produit!\)
On veut prouver que : \(\verb!Vendeur! \bowtie \verb!Livraison! \bowtie \verb!Produit! \subset \texttt{R}\)
Soit \(t\) un tuple dans la jointure
| V# | Vnom | Vville | P# | Pnom | Pprix | Qte |
|---|---|---|---|---|---|---|
| \(a\) | \(b\) | \(c\) | \(d\) | \(e\) | \(f\) | \(g\) |
On veut prouver que \(t \in R\).
Par définition des projections :
\((a, b, c)\in \texttt{Vendeur}\) donc il existe \(e_1, f_1, g_1\) tels que \((a, b, c, d_1, e_1, f_1, g_1) \in \texttt{R}\)
\((d,e,f) \in \texttt{Produit}\) donc il existe \(a_2, b_2, c_2, g_2\) tels que \((a_2, b_2, c_2, d, e, f, g_2)\in \texttt{R}\)
\((a,d,g)\in \texttt{Livraison}\) donc il existe \(b_3,c_3,e_3,f_3\) tels que \((a,b_3,c_3,d,e_3,f_3,g)\in \texttt{R}\)
On peut le représenter comme ceci :
V# |
Vnom |
Vville |
P# |
Pnom |
Pprix |
Qte |
|
|---|---|---|---|---|---|---|---|
| Vendeur | \(a\) | \(b\) | \(c\) | \(d_1\) | \(e_1\) | \(f_1\) | \(g_1\) |
| Produit | \(a_2\) | \(b_2\) | \(c_2\) | \(d\) | \(e\) | \(f\) | \(g_2\) |
| Livraison | \(a\) | \(b_3\) | \(c_3\) | \(d\) | \(e_3\) | \(f_3\) | \(g\) |
V# |
Vnom |
Vville |
P# |
Pnom |
Pprix |
Qte |
|
|---|---|---|---|---|---|---|---|
| Vendeur | \(a\) | \(b\) | \(c\) | \(d_1\) | \(e_1\) | \(f_1\) | \(g_1\) |
| Produit | \(a_2\) | \(b_2\) | \(c_2\) | \(d\) | \(e\) | \(f\) | \(g_2\) |
| Livraison | \(a\) | \(b_3\) | \(c_3\) | \(d\) | \(e_3\) | \(f_3\) | \(g\) |
V# → Vnom, Vville donc \(b_3=b\) et \(c_3=c\)
V# |
Vnom |
Vville |
P# |
Pnom |
Pprix |
Qte |
|
|---|---|---|---|---|---|---|---|
| Vendeur | \(a\) | \(b\) | \(c\) | \(d_1\) | \(e_1\) | \(f_1\) | \(g_1\) |
| Produit | \(a_2\) | \(b_2\) | \(c_2\) | \(d\) | \(e\) | \(f\) | \(g_2\) |
| Livraison | \(a\) | \(b\) | \(c\) | \(d\) | \(e_3\) | \(f_3\) | \(g\) |
P#→ Pnom, Pprix donc \(e_3=e\) et \(f_3=f\)
V# |
Vnom |
Vville |
P# |
Pnom |
Pprix |
Qte |
|
|---|---|---|---|---|---|---|---|
| Vendeur | \(a\) | \(b\) | \(c\) | \(d_1\) | \(e_1\) | \(f_1\) | \(g_1\) |
| Produit | \(a_2\) | \(b_2\) | \(c_2\) | \(d\) | \(e\) | \(f\) | \(g_2\) |
| Livraison | \(a\) | \(b\) | \(c\) | \(d\) | \(e\) | \(f\) | \(g\) |
On a obtenu une ligne égale au tuple \(t=(a,b,c,d,e,f,g)\) donc \(t\in \texttt{R}\) (tous les tuples qui se projettent sur \(a,f,g\) coïncident avec \(t\) du fait des clés des trois relations).
On en déduit que la décomposition est Sans Perte d’Information (SPI).
Entrée : un schéma \(\mathcal{A}\), une décomposition \(\{\mathcal{A}_1,...,\mathcal{A}_k\}\) et un ensemble \(\Sigma\) de DF
Pour chaque attribut de \(\mathcal{A}\), choisir un symbole (par exemple \(a\), \(b\), \(c\),…). La correspondance doit être injective.
Construire un tableau dont les colonnes sont les attributs de \(\mathcal{A}\)
Le tableau a une ligne pour chaque \(\mathcal{A}_i\)
Sur la ligne associée à \(\mathcal{A}_i\), les positions correspondant à \(\mathcal{A}_i\) sont remplies avec les symboles choisis.
Les autres positions sont remplies avec les symboles indicés par \(i\)
Répéter tant que possible : s’il existe une DF \(X\rightarrow Y\) dans \(\Sigma\) et deux lignes du tableau en accord sur \(X\), égaliser ces deux lignes sur \(Y\)
Sortie : Si on obtient une ligne sans valeur indicée, la décomposition est sans perte d’information, sinon il y a perte d’information
Considérons l’exemple : \(\mathcal{A}=\{A,B,C,D\}\) avec \(\mathcal{A}_1=\{A,B\}\), \(\mathcal{A}_2=\{B,C\}\) et \(\mathcal{A}_3=\{C,D\}\)
Soit \(\Sigma=\{{C}\rightarrow{D}; {B}\rightarrow{A}\}\).
Soit \(t=(a,b,c,d)\). Soit \(t_1,t_2,t_3\) les tuples de \(R\) suivants:
| A | B | C | D | |
|---|---|---|---|---|
| \(t_1\) | a |
b |
\(c_1\) | \(d_1\) |
| \(t_2\) | \(a_2\) | b |
c |
\(d_2\) |
| \(t_3\) | \(a_3\) | \(b_3\) | c |
d |
On a pris \(c_1,d_1, a_2,d_2, a_3,b_3\) comme valeurs variables et a,b,c,d comme constantes
| A | B | C | D | |
|---|---|---|---|---|
| \(t_1\) | a |
b |
\(c_1\) | \(d_1\) |
| \(t_2\) | \(a_2\) | b |
c |
\(d_2\) |
| \(t_3\) | \(a_3\) | \(b_3\) | c |
d |
Par la dépendance \({B}\rightarrow{A}\), il vient :
| A | B | C | D | |
|---|---|---|---|---|
| \(t_1\) | a |
b |
\(c_1\) | \(d_1\) |
| \(t_2\) | a |
b |
c |
\(d_2\) |
| \(t_3\) | \(a_3\) | \(b_3\) | c |
d |
Par la dépendance \({C}\rightarrow{D}\), il vient :
| A | B | C | D | |
|---|---|---|---|---|
| \(t_1\) | a |
b |
\(c_1\) | \(d_1\) |
| \(t_2\) | a |
b |
c |
d |
| \(t_3\) | \(a_3\) | \(b_3\) | c |
d |
On a bien fait apparaître \(t\) qui appartient donc à \(R\).
Considérons toujours l’exemple : \(\mathcal{A}=\{A,B,C,D\}\) avec
\(\mathcal{A}_1=\{A,B\}\), \(\mathcal{A}_2=\{B,C\}\) et \(\mathcal{A}_3=\{C,D\}\)
Mais avec \(\Sigma=\{{B}\rightarrow{AD}\}\).
| A | B | C | D |
|---|---|---|---|
a |
b |
\(c_1\) | \(d_1\) |
| \(a_2\) | b |
c |
\(d_2\) |
| \(a_3\) | \(b_3\) | c |
d |
Dans ce cas, en utilisant la seule DF \({B}\rightarrow{AD}\), on obtient \(a_2=a\) et \(d_1=d_2\) :
| A | B | C | D |
|---|---|---|---|
a |
b |
\(c_1\) | \(d_1\) |
a |
b |
c |
\(d_1\) |
| \(a_3\) | \(b_3\) | c |
d |
On ne peut pas aller plus loin, la décomposition est avec perte d’information.
Note
Construire une décomposition :
Définition : forme normale 1 (FN1)
Un schéma relationnel \(\mathcal{A}\) est en forme normale 1 (FN1) si tous les attributs ont des valeurs atomiques (pas de liste de valeurs).
Proposition
D’après la théorie de l’algèbre relationnel, toute relation est en FN1.
Idée
Un schéma relationnel est en deuxième forme normale (FN2) si tout attribut non identifiant (extérieur à une clé) ne dépend pas d’une partie d’une clé mais de toute la clé.
La FN2 assure seulement une non-redondance partielle de l’information.
Définition : forme normale 2 (FN2)
Un schéma relationnel \(\mathcal{A}\) est en forme normale 2 (FN2) relativement à un ensemble de DF \(\Sigma\) ssi
Méthode pour vérifier la FN2
Pour toute clé \(X\), vérifier que la fermeture de tout sous-ensemble strict de \(X\) est inclus dans \(X\).
Schéma Employé=(#projet, #employé, nom_employé, fonction)
On suppose qu’on a les dépendances :
#projet, #employé → fonction#employé → nom_employéLe schéma est-il en FN2 ?
Le schéma Employé n’est pas en FN2 à cause de la DF #employé → nom_employé.
On peut illustrer le problème de redondance par ces exemples de tuples :
#projet |
#employé |
nom_employé |
fonction |
|---|---|---|---|
| p1 | e1 | n1 | f1 |
| p2 | e1 | n1 | f2 |
| p3 | e1 | n1 | f3 |
On constate bien une redondance pour la projection sur (#employé, nom_employé).
Idée
Un schéma relationnel est en troisième forme normale (FN3) si il est en FN2 et si tous les attributs non identifiants (extérieur à une clé) dépendent directement d’une clé et pas par transitivité via des attributs qui ne sont pas dans une clé , autrement dit il est en FN3 s’il n’existe pas de dépendance fonctionnelle entre deux attributs non clés.
La FN3 assure une non-redondance partielle acceptable de l’information.
Définition : forme normale 3 (FN3)
Un schéma relationnel \(\mathcal{A}\) est en forme normale 3 (FN3) relativement à un ensemble de DF \(\Sigma\) ssi pour toute dépendance non triviale \(X \to Y\) de \(\Sigma\), on a
\(\mathcal{A_1}=(\texttt{V\#, Vnom, Vville}) \quad \mathcal{A_2}=(\texttt{P\#, Pnom, Pprix}) \quad \mathcal{A_3}=(\texttt{V\#, P\#, Qte})\)
\(\Sigma = \{\texttt{V\#} \to \texttt{Vnom Vville}\ , \ \texttt{P\#} \to \texttt{Pnom Pprix}\ , \ \texttt{V\# P\#} \to \texttt{Qte} \}\)
La décomposition est-elle
Schéma Employé=(#employé, nom_employé, #service, nom_service)
On suppose qu’on a les dépendances :
#employé → nom_employé, #service#service → nom_serviceLe schéma est-il en FN2, FN3 ?
Le schéma Employé a pour clé #employé qui est réduite à un attribut. Il est donc en FN2.
Il n’est pas en FN3 à cause de la DF #service → nom_service.
On peut illustrer les redondances par ces exemples de tuples :
#employé |
nom_employé |
#service |
nom_service |
|---|---|---|---|
| e1 | n1 | s1 | ns1 |
| e2 | n2 | s1 | ns1 |
| e3 | n3 | s1 | ns1 |
On constate bien une redondance pour la projection sur (#service, nom_service).
\(\mathcal{A}= (\verb!A, B, C, D, E!)\) et \(\Sigma=\{\verb!A → C ; BC → D ; AD → E!\}\)
fonction decomposition_FN3(A, Σ) D := ∅ # initialisation de la décomposition D Σ' := min_cover(Σ) # calcul d'une couverture irredondante de Σ for each distinct left member X of a DF in Σ' # Y = {attributs à droite d'une DF de Σ' ayant X comme déterminant} Y := {y | X → y ∈ Σ'} D := D ⋃ {X ⋃ Y} # ajouter le schéma X ⋃ Y de clé X # la décomposition doit comprendre tous les attributs B := {attributes in A that do not occur in D} D := D ⋃ {B} # ajouter le schéma B à D # dernière partie pour assurer une décomposition SPI If no schemas includes a key of A, add a schema with a key of A return D
Note
Dernière partie de l’algorithme : pour avoir une décomposition SPI, il faut s’assurer qu’il y a au-moins une clé de \(\mathcal{A}\) dans une des relations de décomposition. Si ce n’est pas le cas, il faut ajouter une relation contenant une clé de \(\mathcal{A}\).
Proposition
L’algorithme termine en un nombre fini d’itérations.
La décomposition produite par l’algorithme est :
en FN3,
sans perte d’informations,
sans perte de dépendances fonctionnelles.
Schéma \(\verb! Employé!=(\verb!#projet, #employé, nom_employé, fonction!)\)
\(\Sigma = \{\verb! #projet #employé → fonction ; #employé → nom_employé! \}\)
Le schéma \(\verb!Employé!\) n’est pas en FN2 à cause de la DF \(\verb!#employé → nom_employé!\).
Appliquons l’algorithme de construction d’une décomposition FN3.
\(\Sigma\) est irredondante.
Pour le déterminant \(\verb! #employé!\) : \(\ Y = \{\verb!nom_employé!\}\), \(\ \mathcal{A_1}= (\verb!#employé!) \cup Y = (\verb!#employé!, \verb!nom_employé!)\),
Pour le déterminant \(\verb! #projet!, \verb!#employé!\) : \(\ Y = \{\verb!fonction!\}\), \(\ \mathcal{A_2}= (\verb!#projet!, \verb!#employé!) \cup Y = (\verb!#projet!, \verb!#employé!, \verb!fonction!)\),
\(\ D=\left\{\mathcal{A_1}, \mathcal{A_2}\right\}\), tous les attributs initiaux sont présents dans la décomposition. \(B = \emptyset\). On n’ajoute rien.
Le schéma initial a pour clé \((\verb!#projet!, \verb!#employé!)\) qui est présente dans \(\mathcal{A_2}\) donc on n’ajoute rien à la décomposition.
\(\left\{\mathcal{A_1}, \mathcal{A_2}\right\}\) est une décomposition de \(\verb!Employé!\) en FN3 SPI et SPD.
Schéma \(\verb! Employé!=(\verb!#employé, nom_employé, #service, nom_service!)\)
\(\Sigma = \{ \verb!#employé → nom_employé ; #employé → #service ; #service → nom_service! \}\)
Le schéma \(\verb!Employé!\) a pour clé \(\verb!#employé!\), il est donc en FN2 mais pas en FN3 à cause de la DF \(\verb!#service → nom_service!\).
Appliquons l’algorithme de construction d’une décomposition FN3.
\(\Sigma\) est irredondante.
Pour le déterminant \(\verb! #employé!\) : \(\ Y = \{\verb!nom_employé, #service!\}\), \(\ \mathcal{A_1}= (\verb!#employé!) \cup Y = (\verb!#employé, nom_employé, #service!)\).
Pour le déterminant \(\verb! #service!\) : \(\ Y = \{\verb!nom_service!\}\), \(\ \mathcal{A_2}= (\verb!#service!) \cup Y = (\verb!#service!, \verb!nom_service!)\).
\(D=\left\{\mathcal{A_1}, \mathcal{A_2}\right\}\). Tous les attributs initiaux sont présents dans la décomposition. \(B = \emptyset\). On n’ajoute rien.
Le schéma initial a pour clé \((\verb!#employé!)\) qui est présente dans \(\mathcal{A_1}\) donc on n’ajoute rien à la décomposition.
\(\left\{\mathcal{A_1}, \mathcal{A_2}\right\}\) est une décomposition de \(\verb!Employé!\) en FN3 SPI et SPD.
\(\mathcal{A}=(\texttt{V\#, Vnom, Vville, P\#, Pnom, Pprix, Qte})\)
\(\Sigma = \{\texttt{V\#} \to \texttt{Vnom Vville}\ , \ \texttt{P\#} \to \texttt{Pnom Pprix}\ , \ \texttt{V\# P\#} \to \texttt{Qte} \}\)
Appliquer l’algorithme de décomposition à ce schéma relativement à \(\Sigma\).
\(\Sigma\) a pour couverture irredondante \(\Sigma' = \{\texttt{V\#} \to \texttt{Vnom}, \ \texttt{V\#} \to \texttt{Vville},\ \texttt{P\#} \to \texttt{Pnom}, \ \texttt{P\#} \to \texttt{Pprix},\ \texttt{V\# P\#} \to \texttt{Qte} \}\)
Pour le déterminant \(\texttt{V\#}\) : \(\quad Y = \{\texttt{Vnom, Vville}\}\), \(\quad \mathcal{A_1}= (\texttt{V\#}) \cup Y = (\texttt{V\#, Vnom, Vville})\),
Pour le déterminant \(\texttt{P\#}\) : \(\quad Y = \{\texttt{Pnom, Pprix}\}\), \(\quad \mathcal{A_2}= (\texttt{P\#}) \cup Y = (\texttt{P\#, Pnom, Pprix})\),
Pour le déterminant \(\texttt{V\# P\#}\) : \(\quad Y = \{\texttt{Qte}\}\). \(\quad \mathcal{A_3}= (\texttt{V\# P\#}) \cup Y = (\texttt{V\# P\#, Qte})\),
\(D=\left\{\mathcal{A_1}, \mathcal{A_2}, \mathcal{A_3}\right\}\). Tous les attributs initiaux sont présents dans la décomposition. \(B = \emptyset\). On n’ajoute rien.
Le schéma initial a une clé unique \(\verb!V# P#!\). Elle est déjà incluse dans un des schémas présents donc on n’ajoute rien à la décomposition.
On obtient la même décomposition que celle déjà étudiée. \(\mathcal{A_1}=(\texttt{V\#, Vnom, Vville}), \quad \mathcal{A_2}=(\texttt{P\#, Pnom, Pprix}), \quad \mathcal{A_3}=(\texttt{V\#, P\#, Qte})\)
\(\mathcal{A}= (\verb!A, B, C, D, E!)\) et \(\Sigma =\{\verb!A → C ; BC → D ; AD → E!\}\)
Appliquer l’algorithme de décomposition à ce schéma relativement à \(\Sigma\).
En utilisant l’algorithme de calcul d’une couverture irredondante :
Pour le déterminant \(\texttt{A}\) : \(\quad Y = \{\texttt{C}\}\), \(\quad \mathcal{A_1}= (\texttt{A,C})\),
Pour le déterminant \(\texttt{BC}\) : \(\quad Y = \{\texttt{D}\}\), \(\quad \mathcal{A_2}= (\texttt{B,C,D})\),
Pour le déterminant \(\texttt{AD}\) : \(\quad Y = \{\texttt{E}\}\), \(\quad \mathcal{A_3}= (\texttt{A,D,E})\),
\(D=\left\{\mathcal{A_1}, \mathcal{A_2}, \mathcal{A_3}\right\}\). Tous les attributs initiaux sont présents dans la décomposition. On n’ajoute rien.
On a vu précédemment que le schéma initial a une clé unique \(\verb!AB!\). Elle n’est incluse dans aucun des schémas présents donc on ajoute le schéma \(\mathcal{A_4}=(\texttt{A,B})\) à la décomposition pour assurer une décomposition SPI.
On obtient la décomposition \(\{(\texttt{A,C}), (\texttt{A,B,C,D}), (\texttt{A,D,E}), (\texttt{A,B})\}\).
Définition
Un schéma \(\mathcal{A}\) est en FNBC par rapport à un ensemble de dépendances fonctionnelles \(\Sigma\) sur \(\mathcal{A}\) ssi
Proposition
Soit \(\Sigma'\) un ensemble de DF équivalent à \(\Sigma\).
\((\mathcal{A},\Sigma)\) est en FNBC si et seulement si pour toute DF non triviale de \(\Sigma'\), le membre de gauche est une sur-clé (super-clef).
Méthode
Il suffit de vérifier la règle FNBC pour un ensemble de DF équivalent à \(\Sigma\).
\(\mathcal{A}=(\texttt{V\#, Vnom, Vville, P\#, Pnom, Pprix, Qte})\)
\(\Sigma = \{\texttt{V\#} \to \texttt{Vnom Vville}\ , \ \texttt{P\#} \to \texttt{Pnom Pprix}\ , \ \texttt{V\# P\#} \to \texttt{Qte} \}\)
\(\mathcal{A}\) n’est pas en FNBC par rapport \(\Sigma\). En effet ni \(\texttt{V\#}\) ni \(\texttt{P\#}\) ne sont des sur-clés.
Mais la décomposition \(\mathcal{A_1}=(\texttt{V\#, Vnom, Vville}) \quad \mathcal{A_2}=(\texttt{P\#, Pnom, Pprix}) \quad \mathcal{A_3}=(\texttt{V\#, P\#, Qte})\) est en FNBC.
Schéma \(\verb!Projet! = (\verb!#projet, #employé, localisation, fonction!)\)
\(\Sigma = \{\verb! #projet #employé! \to \verb!localisation fonction ! ; \verb! localisation! \to \verb!#projet ! \}\)
Le schéma \(\verb!Projet!\) est en FN3 mais n’est pas en FNBC.
D’après les DF, il subsiste des redondances que l’on peut illustrer par les tuples :
| #projet | #employé | localisation | fonction |
|---|---|---|---|
| p1 | e1 | l1 | f1 |
| p1 | e2 | l1 | f2 |
| p1 | e3 | l1 | f3 |
Proposition
Si un schéma \(\mathcal{A}\) est en forme normale Boyce-Codd (FNBC) relativement à un ensemble de DF \(\Sigma\), alors \(\mathcal{A}\) est en forme normale 3 (FN3) relativement à \(\Sigma\).
Note
Les formes normales correspondent à des niveaux d’élimination des redondances.
La FNBC élimine toutes les redondances dues aux DF mais toutes les contraintes d’une relation ne se modélisent pas par des DF !
Méthode
Soit un schéma relationnel \(\mathcal{A}\) respectant les DF \(\Sigma\).
D est initialisée à {A},B une relation de D qui n’est pas FNBC à cause d’une DF non triviale X → a telle que X n’est pas clé de B.
Y comme l’ensemble des attributs de B\X déterminés par X.B en :
B1 contenant les attributs de X et de Y (clé X).B2 contenant tous les attributs de B sauf ceux de Y (clé(s) inchangée(s)).SPI
Chaque étape est SPI car on laisse la clé X de B1 dans B2.
fonction decomposition_FNBC(A,Σ) #Initialisation de la décomposition D := {A} while (∃ B ∈ D, B not BCNF because of Σ ⊨ X → a) # Y = {attributs de B\X déterminés par X} Y := X⁺ ⋂ (B\X) # X → a non triviale donc Y non vide # remplacer le schéma B par les schémas X⋃Y et B\Y D := (D\{B}) ⋃ { X⋃Y, B\Y } return D
Proposition
L’algorithme termine,
Les éléments de la décomposition finale sont en FNBC,
La décomposition est Sans Perte d’Information (SPI).
Preuves
La terminaison est triviale : à chaque itération le nombre de parties de \(\mathcal{A}\) dans \(D\) augmente de \(1\) et ce nombre ne peut dépasser \(\# \mathcal{A}\)
La seconde propriété est triviale aussi
La propriété SPI se vérifie avec l’algorithme de poursuite (et son analyse): chaque itération de la boucle While est SPI.
\(\mathcal{A}=(\verb!V#, Vnom, Vville, P#, Pnom, Pprix, Qte!)\)
\(\Sigma = \{\texttt{V\#} \to \texttt{Vnom Vville}\ , \ \texttt{P\#} \to \texttt{Pnom Pprix}\ , \ \texttt{V\# P\#} \to \texttt{Qte} \}\)
\(\texttt{V\#} \to \texttt{Vnom Vville}\) ne respecte pas la FNBC car \(\texttt{V\#}\) n’est pas une sur-clé.
On a calculé une décomposition FN3 et on a vu qu’elle était FNBC. Que donne l’algorithme de décomposition FNBC ?
On a obtenue la même décomposition que celle déjà connue. On sait qu’elle est SPI et SPD.
Schéma \(\verb!Projet! = (\verb!#projet, #employé, localisation, fonction!)\)
\(\Sigma = \{\verb! #projet #employé! \to \verb!localisation fonction ! , \verb! localisation! \to \verb!#projet! \}\)
Le schéma \(\verb!Projet!\) est en FN3 mais n’est pas en FNBC. Que donne l’algorithme de décomposition FNBC ?
On peut vérifier que la décomposition est SPI avec l’algorithme de poursuite. Mais elle n’est pas SPD.
La dépendance \(\verb! #projet #employé! \to \verb!localisation fonction !\) est perdue car l’algorithme de calcul de la fermeture par rapport aux DF projetées donne : \(\{\verb!#projet, #employé!\}^+_{\mathcal{A_1},\mathcal{A_2}} = \{\verb!#projet, #employé!\}\).
\(\mathcal{A}= (\verb!A, B, C, D, E!)\) et \(\Sigma=\{\verb!A → C ; BC → D ; AD → E!\}\)
On a précédemment déterminer que l’unique clé est \(\verb!AB!\). Aucune des DF ne respecte la FNBC.
On a calculé aussi une décomposition FN3 SPI et SPD :
\[\{(\texttt{A,C}), (\texttt{B,C,D}), (\texttt{A,D,E}), (\texttt{AB})\}\]
Est-elle FNBC ?
Oui elle est FNBC car
Comparons avec la décomposition obtenue par l’algorithme de décomposition FNBC.
Le schéma initial \(\mathcal{A}= (\verb!A, B, C, D, E!)\) de clé \(\verb!AB!\), et \(\Sigma=\{\verb!A → C ; BC → D ; AD → E!\}\)
Nous n’obtenons pas la même décomposition qu’avec l’algorithme de décomposition FN3.
On peut vérifier que la décomposition est SPI (exercice ?) mais elle n’est pas SPD.
La DF \(\verb!AD → E!\) n’est pas préservée ! On le montre par le calcul de la fermeture de \(\verb!{A,D}!\) par rapport au DF projetées, on obtient \(\verb!{A,D}!^+_{\mathcal{A_1},\mathcal{A_2},\mathcal{A_3}} = \verb!{A,D}!\)
Note
Il existe des couples schéma/Ensemble de DFs (\(\mathcal{A}, \Sigma\)) pour lesquels toute décomposition FNBC entraine une perte de dépendances fonctionnelles
\(\mathcal{A} =\) {Ville, Rue, Numéro, #Bureau_vote}
Σ = { Ville, Nom, Rue → #Bureau_vote, #Bureau_vote → Ville }
Deux clés Ville, Nom, Rue et #Bureau_vote, Nom, Rue
#Bureau_vote → Ville ne satisfait pas le critère FNBC
L’algorithme de décomposition en FNBC conduit à la décomposition {#Bureau_vote,Ville} et {#Bureau_vote, Nom, Rue}
La DF Ville, Nom, Rue → #Bureau_vote n’est pas préservée
La décomposition préserve l’information (SPI) mais pas les dépendances fonctionnelles.
À noter
Pour cet exemple, on peut vérifier qu’aucune décomposition FNBC de \(\mathcal{A}\) ne préserve toutes les dépendances fonctionnelles.
Décompositions, Pertes de DF, Pertes d’informations, Décompositions FN3, Décompositions FNBC.

MA15E045 – Bases de Données – L3 MIASHS – UParis Cité