Cours Détaillé : Formes Normales Avancées (BCNF, 4NF) et Contraintes d’intégrité
Introduction
Si les formes normales classiques (1NF, 2NF, 3NF) suffisent pour la majorité des applications, certaines situations complexes nécessitent des règles plus strictes pour éliminer toute redondance subtile. C’est là qu’interviennent la Forme Normale de Boyce-Codd (BCNF) et la Quatrième Forme Normale (4NF).
I. La Forme Normale de Boyce-Codd (BCNF)
La BCNF est une version plus stricte de la 3NF. On la considère souvent comme la “vraie” 3NF, car elle corrige une lacune de la 3NF concernant les clés candidates multiples qui se chevauchent.
A. Définition et Règle
Une table est en BCNF si et seulement si :
- Elle est en 3NF.
- Pour toute dépendance fonctionnelle X → Y, X doit être une super clé (c’est-à-dire qu’il permet d’identifier uniquely une ligne).
En termes simples : Il ne doit exister aucun attribut non-clé qui détermine un autre attribut. Même une partie d’une clé candidate ne doit pas déterminer un attribut non-clé.
B. Exemple Corrigé et Détaillé
Imaginons une université où :
- Un étudiant peut suivre plusieurs cours.
- Un cours peut être enseigné par plusieurs professeurs (mais un professeur n’enseigne qu’un seul cours).
- Un étudiant n’a qu’un seul professeur par cours.
Table Initiale : Inscription
| Etudiant | Cours | Professeur |
|---|---|---|
| Eva | Maths | Prof. Laravel |
| Eva | Physique | Prof. Devinsto |
| Owen | Maths | Prof. Inertia |
| Charlie | Maths | Prof. Laravel |
Analyse des Dépendances Fonctionnelles (DF) :
(Etudiant, Cours) -> Professeur: Un étudiant dans un cours a un unique professeur.- La clé candidate est
(Etudiant, Cours). C’est une clé composée.
- La clé candidate est
Professeur -> Cours: Un professeur n’enseigne qu’une seule matière.- Ici,
Professeurest un déterminant, mais ce n’est pas une super clé (car un professeur peut avoir plusieurs étudiants, il ne détermine pas une ligne unique).
- Ici,
Le Problème (Violation BCNF) :
La table est en 3NF, mais pas en BCNF car nous avons une dépendance Professeur -> Cours où le déterminant (Professeur) n’est pas une clé.
Cela crée de la redondance : On répète que “Prof. Laravel” enseigne les “Maths” à chaque fois qu’un nouvel étudiant s’inscrit chez lui.
Décomposition en BCNF : On sépare la dépendance problématique dans une nouvelle table.
Table 1 : Enseignement
| Professeur | Cours |
|---|---|
| Prof. Laravel | Maths |
| Prof. Inertia | Maths |
| Prof. Devinsto | Physique |
Table 2 : Inscription_Etudiant
| Etudiant | Professeur |
|---|---|
| Eva | Prof. Laravel |
| Eva | Prof. Devinsto |
| Owen | Prof. Inertia |
| Charlie | Prof. Laravel |
Résultat : Plus de redondance sur le lien Professeur/Cours. Pour savoir quel cours suit Eva, on joint les deux tables.
II. La Quatrième Forme Normale (4NF)
La 4NF traite les problèmes que la BCNF ne peut pas résoudre : les Dépendances Multi-Values (DMV). Elle intervient lorsque une table contient deux attributs indépendants l’un de l’autre, mais dépendant tous deux d’une même clé.
A. Définition
Une table est en 4NF si :
- Elle est en BCNF.
- Elle ne contient pas de dépendance multi-valeur non triviale.
Qu’est-ce qu’une Dépendance Multi-Valeur (DMV) ? Cela se produit quand, pour une valeur de A, il existe un ensemble de valeurs B et un ensemble de valeurs C, mais B et C sont totalement indépendants l’un de l’autre. Notation : A ↠ B (A multi-détermine B).
B. Exemple Détaillé
Imaginons une table qui liste les compétences d’un employé et les langues qu’il parle. Un employé peut avoir plusieurs compétences et plusieurs langues, mais la compétence n’a rien à voir avec la langue parlée.
Table Initiale (Problématique) :
| Employé | Compétence | Langue |
|---|---|---|
| Pierre | PHP | Français |
| Pierre | PHP | Anglais |
| Pierre | Python | Français |
| Pierre | Python | Anglais |
Le Problème :
- Pour Pierre, nous devons lister toutes les combinaisons possibles (Cartesian Product). Si Pierre apprend l’Espagnol, nous devons ajouter deux lignes (une pour PHP, une pour Python). C’est une explosion de données inutile.
- Ici,
Employé ↠ CompétenceetEmployé ↠ Langue. Compétence et Langue sont indépendants.
Décomposition en 4NF : On crée deux tables distinctes pour casser cette dépendance cartésienne.
Table A : Competences_Employe
| Employé | Compétence |
|---|---|
| Pierre | PHP |
| Pierre | Python |
Table B : Langues_Employe
| Employé | Langue |
|---|---|
| Pierre | Français |
| Pierre | Anglais |
Résultat : Si Pierre apprend l’Espagnol, on ajoute une seule ligne dans la Table B. La redondance est drastiquement réduite.
III. Les Contraintes d’Intégrité (Approfondissement)
Les contraintes d’intégrité sont les “garde-fous” de la base de données. Elles garantissent que les données restent exactes et cohérentes tout au long de leur vie.
A. Contraintes d’intégrité statiques (Structurelles)
Elles définissent l’état valide des données à un instant T.
- Intégrité d’entité (Clé Primaire) :
- Règle : Aucun attribut de la clé primaire ne peut être
NULL. La clé doit être unique. - But : Identifier chaque ligne de manière unique.
- Règle : Aucun attribut de la clé primaire ne peut être
- Intégrité référentielle (Clé Étrangère) :
- Règle : Une valeur de clé étrangère doit soit être
NULL, soit correspondre à une valeur existante de la clé primaire référencée. - But : Assurer la cohérence entre tables (ex: impossible de créer une commande pour un client qui n’existe pas).
- Règle : Une valeur de clé étrangère doit soit être
- Contrainte d’unicité (UNIQUE) :
- Règle : Deux lignes ne peuvent avoir la même valeur pour cet attribut (ex: Email), mais peut accepter
NULL(contrairement à la clé primaire).
- Règle : Deux lignes ne peuvent avoir la même valeur pour cet attribut (ex: Email), mais peut accepter
- Contrainte de domaine (CHECK) :
- Règle : Limite les valeurs possibles pour un attribut.
- Exemple :
CHECK (Age >= 18),CHECK (Status IN ('Actif', 'Inactif')).
B. Contraintes d’intégrité dynamiques (Comportementales)
Elles contrôlent les transitions d’un état à un autre lors des opérations.
- Déclencheurs (Triggers) :
- Ce sont des procédures stockées qui s’exécutent automatiquement après un événement (
INSERT,UPDATE,DELETE). - Exemple : Mettre à jour le
Stock_Totalautomatiquement après l’ajout d’une ligne de commande.
- Ce sont des procédures stockées qui s’exécutent automatiquement après un événement (
- Règles métier complexes :
- Validation logique impliquant plusieurs colonnes ou tables.
- Exemple : Interdire la modification du
Salaired’un employé si sonPosteest “Stagiaire”.
C. Contraintes transactionnelles (ACID)
Ces propriétés assurent la fiabilité des opérations globales.
- Atomicité : “Tout ou Rien”. Si une transaction comporte 5 étapes et que l’étape 4 échoue, les 3 premières étapes sont annulées (Rollback).
- Cohérence : La base de données passe d’un état valide à un autre état valide après chaque transaction.
- Isolation : Les transactions concurrentes ne doivent pas s’interférer. L’utilisateur A ne doit pas voir les modifications non validées de l’utilisateur B.
- Durabilité : Une fois la transaction validée (
COMMIT), les données sont sauvegardées de façon permanente, même en cas de coupure de courant.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Cours Détaillé : Formes Normales Avancées (BCNF, 4NF) et Contraintes d'intégrité. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.