La troisième forme normale (3NF), c'est un pas de plus vers un vrai rangement dans nos données. En gros, une table est en 3NF si :
- Elle est déjà en deuxième forme normale (2NF).
- Tous les attributs non-clés dépendent uniquement de la clé primaire et de rien d'autre (pas de dépendances transitives !).
En d'autres termes, la 3NF exige que toutes les données d'une table soient directement liées à sa clé primaire et ne dépendent pas d'autres attributs non-clés.
Une dépendance transitive, c'est quand l'attribut A dépend de l'attribut B, et que B dépend de l'attribut C, ce qui crée une chaîne de dépendances A → B → C. Par exemple, « Employé » dépend du « Département », et le « Département » dépend de « Emplacement ». Du coup, « Employé » dépend transitivement de « Emplacement ».
Exemple de violation de la 3NF
Imaginons qu'on a une table employees qui stocke les infos sur les employés :
| employee_id | name | department | department_manager |
|---|---|---|---|
| 1 | Otto Lin | Marketing | Leo Zhang |
| 2 | Alex Song | Finance | Maria Chi |
| 3 | Anna Ming | Finance | Maria Chi |
Ici :
employee_id— c'est la clé primaire.departmentetdepartment_manager— ce sont des attributs non-clés.
À première vue, tout a l'air ok, mais si on regarde de plus près, on voit un souci : department_manager dépend pas de employee_id, mais de department. Donc, on a une dépendance transitive : employee_id → department → department_manager.
Les problèmes qui peuvent arriver
Si on change le nom du manager du département (« Finance »), il faudra mettre à jour toutes les lignes où ce département apparaît. Si on oublie une ligne, les données deviennent incohérentes. C'est la galère qu'on peut éviter.
Mettre la table en 3NF
Pour virer les dépendances transitives, on va séparer la table en deux : une pour les employés, l'autre pour les départements.
Table employees
| employee_id | name | department |
|---|---|---|
| 1 | Otto Lin | Marketing |
| 2 | Alex Song | Finance |
| 3 | Anna Ming | Finance |
Table departments
| department | department_manager |
|---|---|
| Marketing | Leo Zhang |
| Finance | Maria Chi |
Maintenant, tout est bien rangé, et chaque table fait son taf :
- La table
employeesgarde les infos sur les employés. - La table
departmentsstocke les infos sur les départements et leurs managers.
Si le manager d'un département change, on n'a qu'à mettre à jour une seule ligne dans la table departments, pas toutes les lignes des employés.
Comment savoir si une table viole la 3NF ?
Pour voir si une table viole la 3NF, vérifie :
- Est-ce qu'il y a des dépendances transitives ? Par exemple, l'attribut A dépend de B, qui dépend de C.
- Est-ce que tous les attributs non-clés dépendent directement de la clé primaire ? Si un truc dépend d'un autre attribut non-clé, la table n'est pas en 3NF.
Exemple pratique : magasin
Regarde la table sales qui contient les infos sur les ventes :
| sale_id | product_name | product_price | customer_name |
|---|---|---|---|
| 1 | Téléphone | 20 000 | Otto Lin |
| 2 | Ordinateur portable | 50 000 | Alex Song |
| 3 | Téléphone | 20 000 | Anna Ming |
Ici, on voit clairement de la redondance : le prix du produit se répète à chaque vente. Si le prix change, les données deviennent vite incohérentes.
Pour corriger la violation de la 3NF, on va séparer la table en deux :
- La table
salesva garder les infos sur les ventes. - La table
products— les infos sur les produits et leurs prix.
Table sales
| sale_id | product_id | customer_name |
|---|---|---|
| 1 | 1 | Otto Lin |
| 2 | 2 | Alex Song |
| 3 | 1 | Anna Ming |
Table products
| product_id | product_name | product_price |
|---|---|---|
| 1 | Téléphone | 20 000 |
| 2 | Ordinateur portable | 50 000 |
Maintenant, si le prix d'un produit change, on met à jour une seule ligne dans la table products, et les données restent cohérentes.
Exercice pratique
Voilà un petit défi : tu as une table students_courses comme ça :
| student_id | student_name | course_name | teacher_name |
|---|---|---|---|
| 1 | Otto Lin | Mathématiques | Maria Chi |
| 2 | Alex Song | Programmation | Leo Zhang |
| 1 | Otto Lin | Programmation | Leo Zhang |
Sépare la table pour qu'elle respecte la 3NF. Astuce : il faut créer trois tables (students, courses, teachers) et bien les relier.
Pourquoi c'est important de respecter la 3NF ?
Pourquoi se prendre la tête avec la troisième forme normale (3NF) ? Parce que ça te simplifie vraiment la vie. Quand tes tables sont en 3NF, les données sont bien rangées — pas de doublons inutiles, donc moins de risques de tout casser par accident. Les mises à jour sont plus rapides et plus simples, vu que tout est stocké à un seul endroit, pas copié-collé partout.
En plus, la structure de la base devient plus flexible. Tu veux ajouter un nouveau champ ou modifier un ancien ? Pas besoin de tout refaire.
Mais, comme dans toute bonne histoire, y'a un mais : si tu normalises trop, tu te retrouves avec plein de petites tables et des requêtes compliquées avec plein de JOIN. Parfois, ça peut ralentir un peu. Donc le plus important, c'est de doser. Là où il faut — normalise, et là où c'est plus simple de garder un peu de redondance — n'aie pas peur.
On va continuer à creuser : on va apprendre à bien faire les relations entre les tables et à créer des bases qui sont à la fois pratiques et fiables. Allez, on fonce vers un super design de base de données !
GO TO FULL VERSION