===Les Formes normales:=== * Restreignent les dépendances admises dans un schéma relationnel * Permettent d’éviter la duplication de l’information au sein des relations * Définissent une méthode de décomposition d’un schéma relationnel redondant en plusieurs schémas liés entre eux. **Dépendance fonctionnelle élémentaire (DFE) ** * Soit $R$ un schéma relationnel * Soit $X$ un ensemble d’attributs ⊆ $R$ * Soit $A$ un attribut de $R$ * Il existe une DFE entre $X$ et $A$ ssi : * $X \rightarrow A$ * Il n’existe aucun sous-ensemble $Y$ ⊆ $X$ tel que $Y \rightarrow A$ **2ème forme normale (2FN) ** * Un schéma $R$ est en 2FN : * ssi la clé primaire de $R$ est en DFE avec tous les autres attributs. * Donc : il n’y a pas d’attributs qui ne dépendent que d’une partie de la clé. **Exemple :** $$\textbf{Fournisseur}(\underline{\text{nom_f}, \text{composant}}, \text{adresse_f}, \text{prix})$$ $$\text{nom_f} \rightarrow \text{adresse_f}$$ $$\text{nom_f}, \text{composant} \rightarrow \text{prix}$$ ⇒ Pas 2FN!! * Lorsqu’un schéma relationnel n’est pas en deuxième forme normale, __il doit être **normalisé**__: **Normalisation 2FN** : * Pour obtenir un schéma 2FN, * on “//découpe//” la table selon les DFE trouvées. * La normalisation consiste * à créer une nouvelle table * pour chaque DFE de la table initiale. * Soit : $$R (\underline{A_1,...,\color{red}{A_i},...,A_n},B_1,...,\color{red}{B_j},...,B_m)$$ * avec : $$\color{red}{A_i} \stackrel{DFE}{\rightarrow} \color{red}{B_j}$$ $$A_1,...,\color{red}{A_i},...,A_n \stackrel{DFE}{\rightarrow} B_1,...,B_{j-1},B_{j+1}...,B_m$$ * Alors le schéma de table doit être modifié comme suit : $$R_1 (\underline{A_1,...,\color{red}{A_i},...,A_n},B_1,...,B_{j-1},B_{j+1}...,B_m)$$ $$R_2 (\underline{\color{red}{A_i}},\color{red}{B_j})$$ * **Attention, ** * même si aucun attribut ne dépend plus de la clé primaire initiale, * il est important de la conserver dans une table spécifique * (elle sert à “lier” les valeurs dispersées dans les différentes tables). **__Exemple__** * __Avant__: $$\textbf{Fournisseur}(\underline{\text{nom_f,composant}}, \text{adresse_f, prix})$$ $$\text{nom_f} \rightarrow \text{adresse_f}$$ $$\text{nom_f, composant} \rightarrow \text{prix}$$ * __Après__: $$\textbf{Catalogue}(\underline{\text{nom_f,composant}}, \text{prix})$$ $$\textbf{Fournisseur}(\underline{\text{nom_f}}, \text{adresse_f})$$ **Remarque :** le schéma est maintenant constitué de deux tables. * Les tables ont un attribut commun : //nom_f// (clé primaire de la table Fournisseur). * La clé primaire de la table des Fournisseurs est dupliquée dans la table des prix (appelée ici **Catalogue**). * On dit que //nom_f// est une **clé étrangère** de la table des prix (l’attribut fait référence à la clé primaire d’une autre table, en l’occurrence la table des fournisseurs - voir [[]]). __Previous__ : [[public:STD-3:CM1:Aspect logique:2.2.5 Normalisation d'un schéma:Tables mal construites]] __Up__ : [[public:STD-3:CM1:Aspect physique:2.2.5 Normalisation d'un schéma]]