Aller au contenu
M06 · A. Concevoir une base de données

Normaliser les données (1FN, 2FN, 3FN)

Repérer les tables mal construites (valeurs multiples, données répétées) et les corriger avec les trois premières formes normales.

1Situer

Avant l'arrivée du projet, la secrétaire de Souk Atlas tenait un grand tableau Excel : une ligne par commande, avec le nom du client, sa ville, la liste des produits séparés par des virgules, le prix de chacun... Quand une cliente a changé d'email, il a fallu le corriger sur 40 lignes, et on en a oublié 3. La normalisation est la méthode qui évite ce genre de catastrophe.

2Comprendre

Normaliser un tableau : de 0FN à 3FN
cmd | client | ville | produits 1 | Amina Benali| Fès | "Tajine, Savon noir" cmd | prod | client | ville | nom_produit | qte 1 | 1 | Amina | Fès | Tajine | 1 1 | 5 | Amina | Fès | Savon noir | 3 LIGNE #cmd, #prod, qte PRODUIT id_produit, nom_produit COMMANDE id_cmd, nom_client, ville_client ← encore répétés COMMANDE id_cmd, date, #id_client CLIENT id_client, nom, ville ✔ 3FN : chaque information est écrite une seule fois.

Le tableau Excel d'origine : une ligne par commande, les produits dans une seule case.

1 / 4

Pourquoi normaliser

Une table mal construite provoque trois anomalies :

AnomalieExemple avec le tableau Excel de Souk Atlas
de mise à jourAmina change d’email : il faut corriger toutes ses lignes, on en oublie
d’insertionOn ne peut pas ajouter un produit tant que personne ne l’a commandé
de suppressionOn supprime la seule commande d’un client : on perd le client

Première forme normale (1FN)

Deuxième forme normale (2FN)

Troisième forme normale (3FN)

Un MCD bien construit (leçon précédente) donne directement des tables en 3FN : la normalisation sert surtout à vérifier le modèle et à corriger les tableaux existants.

Exemple simple

Le carnet d'adresses en double

Si l'adresse de votre tante est écrite dans trois carnets différents et qu'elle déménage, vous risquez de n'en corriger qu'un. Une information doit être écrite à un seul endroit.

Exemple simple

Une case, une valeur

Dans un formulaire officiel, on ne met qu'un numéro de téléphone par case. Si on en a deux, il y a deux cases. C'est la première forme normale.

✖ telephones : "0661..., 0522..."
✔ une ligne par téléphone

3Manipuler

Chaque table ci-dessous a un défaut, ou aucun. Indiquez quelle forme normale elle ne respecte pas. Les clés primaires sont entre crochets.
CLIENT([id_client], nom, telephones) avec telephones = « 0661…, 0522… »
LIGNE([id_commande, id_produit], quantite, nom_produit)
CLIENT([id_client], nom, id_ville, nom_ville)
PRODUIT([id_produit], nom, prix, id_categorie)
COMMANDE([id_commande], date, produits) avec produits = « tajine, savon »
LIGNE([id_commande, id_produit], quantite, date_commande)
EMPLOYE([id], nom, id_service, telephone_service)
LIGNE([id_commande, id_produit], quantite, prix_unitaire)

4Pratiquer

Exercice 1 · Normaliser le tableau Excel

Tableau : COMMANDE(num_cmd, date, num_client, nom_client, ville_client, code_produit, nom_produit, quantite). Une commande a plusieurs produits. Décomposez jusqu'à la 3FN.

Voir le corrigé
CLIENT  (num_client, nom_client, ville_client)
PRODUIT (code_produit, nom_produit)
COMMANDE(num_cmd, date, #num_client)
LIGNE   (#num_cmd, #code_produit, quantite)
(et si besoin : VILLE(id_ville, nom_ville) pour aller plus loin)

Exercice 2 · Pourquoi ce n'est pas en 2FN

Expliquez pourquoi INSCRIPTION([num_stagiaire, code_module], note, nom_module) n'est pas en 2FN, et corrigez.

Voir le corrigé
nom_module dépend seulement de code_module, une partie de la clé.
Correction :
MODULE(code_module, nom_module)
INSCRIPTION(#num_stagiaire, #code_module, note)

Exercice 3 · L'anomalie de suppression

Dans CLIENT([id_client], nom, id_ville, nom_ville), que se passe-t-il si on supprime le seul client d'Oujda ?

Voir le corrigé
On perd aussi l'information « la ville 6 s'appelle Oujda ».
C'est une anomalie de suppression, réglée par la 3FN :
VILLE(id_ville, nom_ville) devient une table à part.

5Vérifier

1. Une table est en 1FN si...
2. La 2FN concerne surtout les tables...
3. id_client → id_ville → nom_ville dans la table CLIENT est un problème de...