---
title: "Base de données avancées : Les formes normales"
date: 2022-01-18
tags: ["schema", "relation"]
categories: ["Base de données avancées", "Cours"]
mathjax: true
---

Les formes normales représentent différentes formes de normalisation de la
relation universelle afin d'obtenir un schéma de base de données sans
redondance, perte de donnée, perte de dépendance fonctionnelle et anomalies de
mise à jour. On en dénombre 7 mais nous n'en verrons que 3 (plus celle de FNBC),
les autres ayant surtout un interet théorique.

## La première forme normale (1FN)

Une relation est en première forme normale si chaque domaine de ses attributs
est constitué de **valeurs atomique** : ne pouvant être décomposé. Attention,
une coordonnée GPS, **même si elle est composée de deux nombres flottant** est
considére comme atomique car elle supprime l'un des deux conduirait à la **perte
du sens initial**.

Les tableaux, les listes violent la première forme normale car composés de
valeurs sémantiquement indépendante.

## La seconde forme normale (2FN)

Une relation en seconde forme normale est forcément en première forme normale.

Une relation en 2FN ne supporte pas les dépendance de clé partielle. Pour être
plus simple, un attribut ne peut dépendre une partie de la clé. Dans ce cas il
est opportun de décomposer la relation

### exemple

 1. prenons la relation \\(R(\underline{A,B},C,D)\\) avec \\(B \to D\\)
 2. nous pouvons la décomposer en \\(R'(\underline{A,B},C)\\) et
    \\(R''(\underline{B},D)\\)

## La troisième forme normale (3FN)

Une relation en troisième forme normale est forcement en seconde forme normale.

Chaque attribut non clé est pleinement et directement dependant des clé. tout
attribut n'appartenant pas à une clé ne depend pas d'un attribut non clé.

Prenons l'exemple de la relations suivante:

\\( R(\underline{A,B},C,D)\\) avec \\( C \to D\\). Cette relation n'est pas en 3FN,
pour cela nous allons la décomposer en deux relations :

\\(R^{'}(\underline{A,B},C) \\\ R^{''}(\underline{C},D)\\)

## La forme normale de Boyce-Codd

Un schéma est en FNBC si et seulement si il est en 3FN et si aucun attribut ne
dépend transitivement d'une clé. Pour faire plus simple, la partie gauche d'une
dépendance fonctionnelle est forcément une clé (être une super clé).

Prenons un exemple concret avec la relation suivante:
\\(\text{adresse}(\text{ville}, \text{CP}, \text{rue})\\). on observe les
dépendances suivantes:

\\(\begin{array}{l}
\text{ville},\text{rue} \to \text{CP}  \\\
\text{CP} \to \text{ville}
\end{array}\\)

Cette relation n'est pas en FNBC car \\(\text{CP} \to \text{Ville}\\) et
\\(\text(CP)\\) n'est pas une clé et \\(ville\\) depend transitivement de la
clé.

## Décomposition en 3FN et FNBC

À partie d'une relation\\(r\\), l'objectif de ces décompositions est
l'obtention d'un schéma de base de données minimisant le nombre de schéma de
relations \\(r_{i}\\ dans perte (dependances fonctinnelles et données) et
maximisant leurs formes normales.

À partir des relations \\(r_{i}\\) nous devons pouvoir reconstituer \\(r\\) (via
des jointures).

Notons qu'il est toujours possible de décomposer en #FM sans perte de données et
de dépendances fonctinnelle. Il est cependant toujours possible de décomposer en
FNBC sans perte de données (mais avec parfois perte de dependances
fonctionnelles).

### Décomposition sans perte

La décomposition d'une relation \\(R<\text{U},F>\\) en un ensemble de schema de
relation \\(\{R_{1}, R_{2},...R_{n}\}\\) obtenus par projection et dites sans
pertes si et seulement si quelque soit la réalisation cd \\(r\\) de \\(R\\):

 * la jointure naturelle de \\(r_{i}\\) donne exactement \\(r\\).
 * pas de perte de dependances : \\((F_{1} \cup F_{2}, ... \cup F_{n})^{+} =
     F^{+}\\)

#### Théorème de Heath

Soit une relation \\(R(X,Y,Z)\\) avec la dépendance fonctionnelle vérifiée \\(X
\to Y\\). \\(R\\) peut être décomposée en \\(R_{1}(X,Y)\\) et
\\(R_{2})(X,Z)\\).\\(R\\) est égal à la jointure de ses projections sur
\\(R_{1}\\) et \\(R_{2}\\).

#### Théorème de Rissanen

Soit une relation \\(R(X,Y,Z)\\) avec les dépendances fonctionnelle vérifiées 
\\(X \to Y\\) et \\(Y \to Y\\).\\(R\\) peut alors être décomposée en 
\\(R_{1}(X,Y)\\) et \\(R_{2}(Y,Z)\\).

#### Théorème (mais sans nom celui-là)

Soit un schéma de base de données \\(S = (S^{'}, S^{''}\\) et \\(F\\) l'ensemble
de dépendances fonctionnelles associé. \\(S\\) est sans pertes par rapport à
\\(F\\) si et seulement si \\((R^{'} \cap R^{''}) \to (R^{'} - R^{''})  
\in F^{+}\\)

### Décomposition en FNBC

La décomposition en *forme normale de Boyce-Codd* s'obtient par décomposition
successive sans garantie de conversation de toutes les dépendances
fonctionnelles.

#### exemple

Soit \\(R(C, P, H, S, E, N )\\) avec
 * C : Cours
 * P : Professeur
 * H : Heure
 * S : Salle
 * E : Etudiant
 * N : Niveau

Avec une seule clé : \\((H, E, C)\\) et les dependances fonctionnelles 
suivantes:

\\(
F= \left \\{ \begin{array}{l}
C \to P  \\\ 
CE \to N \\\ 
HS \to C \\\
HE \to S \\\
HP \to S  \\
\end{array}
\right \\}
\\)

 1. Considérons \\(CE \to N \implies R_{1}(C,E,N\\) qui est en FNBC  et 
      \\(R_{2}(C,P,H,S,E)\\) qui ne l'est pas.
 2. Dans \\(R_{2}\\) on a \\(C \to P\\ \implies R_{3}(C,P)\\) en FNBC et
      \\(R_{4}(C,H,S,E)\\) qui le l'est pas.
 3. Dans \\(R_{4}\\) on a \\(HC \to S \implies R_{5}(H,C,S) \text{ et }
      R_{6}(C,H,E)\\) toutes les deux en FNBC.

Résultat : \\(R_{1}, R_{3}, R_{5} \text{ et } R_{6}\\) représente les relations
en FNBC mais nous avons perdu la dependances fonctionnelles \\(HP \to S\\).

### Décomposition en 3FN

À partir de l'ensemble des dépendances fonctionnelles fournies et en utilisant
leurs propriétés, on peut directement obtenir une décomposition sans perte

#### Principe

Soit \\(R(A,B,C,D,E) \text{ et } f\{AB \to C; C \to B; A \to D\} \\)

**Calculer la couverture minimale** :
    
\\( F_{\text{min}} \\{ AB \to C; C \to A; A \to D \\} \\)

**Condenser les dépendances fonctionnelles** ayant la même partie gauche : 

\\( R_{1}(\underline{A,B},C); R_{2}(\underline{C},B); R_{3}(\underline{A},D) \\)

Chaque dépendance fonctionnelle est une relation possible dont la partie gauche
est clé.

**Détecter les équivalences entre dependances fonctionnelles** par le
regroupement des relations et vérifier que la clé \\(R\\) est présente dans un
des schemas de relation obtenu.

\\( R_{1}(\underline{A,B},C); R_{2}(\underline{C},B); R_{3}(\underline{A},D) \\)

Ici \\(R_{1}\\) et \\(R_{2}\\) se réferencent mutuellement, nous pouvons les
regrouper en \\(R_{\text{1+2}}(\underline{A,B},C)\\).

La relation \\(R\\) a donc deux clés candidates: \\(\\{A,B,E\\}\\) et 
\\(\\{A,C,E\\}\\). Pour ne pas perdre \\(E\\), il faut ajouter une relation
composée de la clé \\(R\\), par exemple \\(R_{4}(\underline{A,B,E})\\).

**La décomposition est donc** :

\\(R_{1+2}(\underline{A,B},C)\\)

\\(R_{3}(\underline{A},D)\\)

\\(R_{4}(\underline{A,B,E})\\)
