Normalisation et Dependance Fonctionnelle
1. Dépendances fonctionnelles
Avant d’aborder les formes normales, il est crucial de comprendre la notion de dépendance fonctionnelle.
- On dit qu’un attribut (ou un groupe d’attributs) B dépend fonctionnellement d’un autre (ou groupe) A si la valeur de A détermine de manière unique la valeur de B.
- Notation : ( A \rightarrow B ).
Exemple simple :
- Dans une table
Client(ID_Client, Nom, Adresse), on peut dire :
( ID_Client ) → ( Nom )
( ID_Client ) → ( Adresse )
Autrement dit, chaque client a un ID_Client unique qui détermine son nom et son adresse.
2. Première forme normale (1NF)
2.1 Définition
Une table est en 1ère forme normale (1NF) si :
- Toutes les valeurs des attributs sont atomiques (pas de champs multivalués ou de listes dans une seule colonne).
- Il n’y a pas de groupes d’attributs répétitifs (ex. Téléphone1, Téléphone2…).
2.2 Exemple de violation
Supposons une table CLIENTS :
| ID_Client | Nom | Téléphone | Adresse |
|---|---|---|---|
| 101 | Dupont | 0601020304, 0670809090 | 10, Rue A, Paris |
| 102 | Martin | 0612345678 | 5, Boulevard B, Lyon |
Ici, la colonne Téléphone contient parfois plusieurs numéros séparés par une virgule. C’est un champ non atomique.
2.3 Mise en 1NF
Pour satisfaire la 1NF, on crée souvent une table séparée pour les téléphones ou on sépare en plusieurs colonnes si c’est justifié. Par exemple :
Option 1 : une table séparée pour gérer plusieurs téléphones
Table CLIENT
| ID_Client | Nom | Adresse |
|---|---|---|
| 101 | Dupont | 10, Rue A, Paris |
| 102 | Martin | 5, Boulevard B, Lyon |
Table CLIENT_TELEPHONE
| ID_Client | Téléphone |
|---|---|
| 101 | 0601020304 |
| 101 | 0670809090 |
| 102 | 0612345678 |
Chaque enregistrement dans CLIENT_TELEPHONE est atomique et correspond à un seul numéro de téléphone pour un client.
3. Deuxième forme normale (2NF)
3.1 Définition
Une table est en 2ème forme normale (2NF) si :
- Elle est déjà en 1NF.
- Tout attribut non clé dépend de la totalité de la clé primaire (pas de dépendance partielle).
Remarque : La 2NF ne concerne que les tables qui ont une clé primaire composite (c’est-à -dire plusieurs colonnes pour la clé).
3.2 Exemple de violation
Prenons une table DETAIL_COMMANDES, avec une clé primaire composite (ID_Commande, ID_Produit), et un attribut Adresse_Client qui dépend seulement de ID_Commande :
| ID_Commande | ID_Produit | Quantité | Adresse_Client |
|---|---|---|---|
| 2001 | A12 | 3 | 10, Rue A, Paris |
| 2001 | B08 | 5 | 10, Rue A, Paris |
| 2002 | A12 | 2 | 5, Boulevard B, Lyon |
- La clé primaire est
(ID_Commande, ID_Produit). - L’attribut
Adresse_Clientdépend uniquement deID_Commande(et pas deID_Produit). - On a donc une dépendance partielle : ( ID_Commande \rightarrow Adresse_Client ).
3.3 Mise en 2NF
Pour corriger cela, on décompose la table pour que chaque attribut dépende de la clé entière :
- On déplace
Adresse_Clientdans une table qui a pour clé uniquementID_Commande(par exemple, la tableCOMMANDE). - La table
DETAIL_COMMANDESne contiendra alors que des attributs qui dépendent de(ID_Commande, ID_Produit).
Table COMMANDE (exemple simplifié)
| ID_Commande | Date_Commande | Adresse_Client |
|---|---|---|
| 2001 | 01/01/2025 | 10, Rue A, Paris |
| 2002 | 02/01/2025 | 5, Boulevard B, Lyon |
Table DETAIL_COMMANDES
| ID_Commande | ID_Produit | Quantité |
|---|---|---|
| 2001 | A12 | 3 |
| 2001 | B08 | 5 |
| 2002 | A12 | 2 |
Ainsi, DETAIL_COMMANDES est en 2NF car chaque attribut (ici Quantité) dépend de l’ensemble de la clé (ID_Commande, ID_Produit).
4. Troisième forme normale (3NF)
4.1 Définition
Une table est en 3ème forme normale (3NF) si :
- Elle est déjà en 2NF.
- Tous les attributs non clés dépendent directement de la clé primaire, c’est-à -dire qu’il n’existe pas de dépendance transitive (un attribut non clé dépendant d’un autre attribut non clé, lui-même dépendant de la clé).
4.2 Exemple de violation (dépendance transitive)
Supposons la table PRODUIT :
| ID_Produit | Nom_Produit | Catégorie | Nom_Catégorie |
|---|---|---|---|
| A12 | Clavier | 001 | Informatique |
| B08 | Souris | 001 | Informatique |
| C03 | Chaise | 002 | Mobilier |
- Clé primaire :
ID_Produit. - Attributs non clés :
Nom_Produit,Catégorie,Nom_Catégorie.
Ici, on peut voir :
- ( ID_Produit \rightarrow Catégorie ) (direct)
- ( Catégorie \rightarrow Nom_Catégorie ) (un code catégorie détermine le nom de cette catégorie)
- Du coup, ( ID_Produit \rightarrow Nom_Catégorie ) transitivement via
Catégorie.
4.3 Mise en 3NF
Pour éliminer la dépendance transitive, on crée une table dédiée pour les catégories :
Table CATEGORIE
| Catégorie (PK) | Nom_Catégorie |
|---|---|
| 001 | Informatique |
| 002 | Mobilier |
Table PRODUIT (révisée)
| ID_Produit (PK) | Nom_Produit | Catégorie (FK) |
|---|---|---|
| A12 | Clavier | 001 |
| B08 | Souris | 001 |
| C03 | Chaise | 002 |
- Désormais,
PRODUITest en 3NF car il n’y a plus de dépendance transitive : chaque attribut dépend uniquement deID_Produit. - Le
Nom_Catégoriedépend deCatégorie, mais ce dernier est désormais une clé primaire dans la tableCATEGORIE.
5. Forme Normale de Boyce-Codd (BCNF)
La BCNF (Boyce-Codd Normal Form) est une version plus stricte de la 3NF.
- En BCNF, pour toute dépendance fonctionnelle ( X \rightarrow Y ) dans une table, X doit être une clé candidate de la table.
En pratique, la plupart des schémas en 3NF sont déjà proches de la BCNF. Les cas où la BCNF est nécessaire sont plus rares (ils surviennent lorsqu’il existe plusieurs clés candidates et qu’une dépendance n’est pas respectée).
6. Résumé rapide des formes normales
- 1NF : absence de groupes d’attributs répétitifs, valeurs atomiques.
- 2NF : 1NF + aucun attribut non clé ne dépend d’une partie seulement de la clé primaire (pas de dépendance partielle).
- 3NF : 2NF + tous les attributs non clés dépendent directement de la clé (pas de dépendance transitive).
- BCNF : Toute dépendance fonctionnelle a pour déterminant une clé candidate.
7. Pourquoi normaliser ?
- Éviter les anomalies :
- Anomalie d’insertion : difficulté à insérer une donnée car d’autres attributs sont requis inutilement.
- Anomalie de mise à jour : risque d’incohérence lorsqu’une information doit être mise à jour dans plusieurs lignes redondantes.
- Anomalie de suppression : perte d’informations annexes lorsqu’on supprime un tuple qui contient plusieurs types de données.
- Réduire la redondance et donc gagner en espace de stockage.
- Améliorer la cohérence et la maintenabilité de la base (moins de duplication, plus facile à faire évoluer).
8. Conclusion et conseils de pratique
- Les formes normales (1NF, 2NF, 3NF, BCNF…) forment une suite logique. Lors de la conception, on va progressivement affiner le modèle pour éliminer les redondances et anomalies.
- Dans la pratique, la plupart des BD sont correctement conçues en 3NF, parfois BCNF si nécessaire.
- Attention : une normalisation excessive peut parfois avoir un impact sur les performances (notamment si on multiplie les tables). Il faut donc trouver un compromis entre normalisation et performance (d’où la dénormalisation partielle dans certains contextes).
- Il est important de maîtriser les dépendances fonctionnelles pour identifier les bonnes décompositions de tables.
En résumé, la normalisation est un processus clé pour obtenir une base de données cohérente, sans redondance, et facilitant la maintenance. Les exemples ci-dessus illustrent les corrections typiques pour passer de 1NF à 3NF.