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.
Repérer les tables mal construites (valeurs multiples, données répétées) et les corriger avec les trois premières formes normales.
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.
Le tableau Excel d'origine : une ligne par commande, les produits dans une seule case.
Une table mal construite provoque trois anomalies :
| Anomalie | Exemple avec le tableau Excel de Souk Atlas |
|---|---|
| de mise à jour | Amina change d’email : il faut corriger toutes ses lignes, on en oublie |
| d’insertion | On ne peut pas ajouter un produit tant que personne ne l’a commandé |
| de suppression | On supprime la seule commande d’un client : on perd le client |
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.
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.
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
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.
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)
Expliquez pourquoi INSCRIPTION([num_stagiaire, code_module], note, nom_module) n'est pas en 2FN, et corrigez.
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)
Dans CLIENT([id_client], nom, id_ville, nom_ville), que se passe-t-il si on supprime le seul client d'Oujda ?
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.