🗃️sql

Normalisation des bases de donnees : 1NF 2NF 3NF expliquees

30 mars 2026 5 min de lecture

Pourquoi normaliser une base de données ?

Imagine que tu crées une base de données pour gérer les commandes d'une boutique en ligne. Au début, tu pourrais être tenté de tout mettre dans une seule grande table : Commande(ID_Commande, Date, Client, Adresse_Client, Produit1, Prix1, Produit2, Prix2...). Ça semble simple, mais c'est un piège ! Cette structure va rapidement causer des problèmes :

  • Redondance des données : L'adresse du client est répétée pour chaque commande. S'il déménage, il faut la modifier partout.
  • Anomalies de mise à jour : Risque d'incohérence si on oublie de modifier une occurrence.
  • Anomalies de suppression : Supprimer une commande pourrait faire disparaître les infos du client si c'était sa seule commande.
  • Gaspillage d'espace : Beaucoup de données sont dupliquées inutilement.

La normalisation est le processus qui permet de réorganiser ces données en plusieurs tables bien structurées, pour éliminer ces problèmes. C'est une compétence clé en NSI et pour tout développeur qui travaille avec des bases de données relationnelles comme MySQL ou PostgreSQL.

La Première Forme Normale (1NF) : Les bases solides

La 1NF est le point de départ obligatoire. Une table est en Première Forme Normale si elle respecte trois règles fondamentales :

  1. Chaque colonne a un nom unique.
  2. Chaque colonne contient des valeurs atomiques, c'est-à-dire indivisibles. Plus de listes ou de groupes de valeurs dans une seule cellule.
  3. L'ordre des lignes et des colonnes n'a pas d'importance pour interroger la base.

Exemple concret : De NON-1NF à 1NF

Prenons une table Inscriptions_Cours mal structurée :

Etudiant_ID: 101
Nom: Dupont
Cours_Inscrits: NSI, Maths, Physique (⚠️ VIOLATION ! Valeur non atomique)
Telephone: 0601020304, 0144758695 (⚠️ VIOLATION !)

Pour la mettre en 1NF, on doit éclater ces valeurs multiples :

Etudiant_ID: 101 | Nom: Dupont | Cours: NSI | Telephone: 0601020304
Etudiant_ID: 101 | Nom: Dupont | Cours: Maths | Telephone: 0601020304
Etudiant_ID: 101 | Nom: Dupont | Cours: Physique | Telephone: 0601020304
... et une ligne séparée pour le second numéro si nécessaire, avec une relation spécifique.

On voit déjà la redondance (Dupont apparaît 3 fois). C'est normal, la 1NF ne résout pas tout, elle assure juste une structure de base propre.

La Deuxième Forme Normale (2NF) : Éliminer les dépendances partielles

Une table est en 2NF si :

  1. Elle est déjà en 1NF.
  2. Tous les attributs non-clés dépendent de la clé primaire entière, et pas seulement d'une partie de celle-ci.

Ce concept est crucial quand tu as une clé primaire composite (faite de plusieurs colonnes).

Le piège de la dépendance partielle

Reprenons notre exemple d'inscriptions, avec une clé primaire composite (Etudiant_ID, Cours) :

(Etudiant_ID, Cours) → Note, Date_Inscription, Nom_Etudiant

Il y a un problème ici. Le Nom_Etudiant ne dépend que de Etudiant_ID (une partie de la clé), et pas du couple (Etudiant_ID, Cours). Si l'étudiant 101 s'appelle Dupont, ce sera vrai qu'il prenne le cours de NSI ou de Maths. C'est une dépendance partielle.

Pour atteindre la 2NF, on doit décomposer la table :

  • Table Inscriptions : (Etudiant_ID, Cours, Note, Date_Inscription)
    Ici, Note et Date_Inscription dépendent bien des DEUX éléments de la clé.
  • Table Etudiants : (Etudiant_ID, Nom_Etudiant, Telephone)
    Les informations sur l'étudiant sont maintenant dans leur propre table.

On supprime ainsi la redondance du nom de l'étudiant.

La Troisième Forme Normale (3NF) : Chasser les dépendances transitives

Une table est en 3NF si :

  1. Elle est déjà en 2NF.
  2. Aucun attribut non-clé ne dépend d'un autre attribut non-clé. Tous dépendent uniquement de la clé primaire.

On appelle cela une dépendance transitive : A → B → C, où C dépend de B, qui dépend de A. En 3NF, on veut A → C directement.

Exemple classique : Commande / Client / Ville

Imaginons une table Commandes après la 2NF :

Commande_ID (clé primaire)
Date_Commande
Client_ID
Nom_Client
Code_Postal_Client
Ville_Client

Ici, Ville_Client dépend du Code_Postal_Client (un attribut non-clé), qui lui-même dépend de la clé (Commande_ID via Client_ID). C'est une dépendance transitive !

Problème : Si on change le nom de la ville pour un code postal, il faut le faire pour tous les clients qui l'utilisent. Pour atteindre la 3NF, on décompose encore :

  • Table Commandes : (Commande_ID, Date_Commande, Client_ID)
  • Table Clients : (Client_ID, Nom_Client, Code_Postal)
  • Table Villes : (Code_Postal, Nom_Ville) ← NOUVELLE TABLE

La relation entre code postal et ville n'est stockée qu'à un seul endroit. C'est propre, efficace et sans redondance.

Résumé et bonnes pratiques pour tes projets NSI

Voici un pense-bête pour normaliser tes bases de données :

  • 1NF : « Une valeur, une cellule ». Pas de listes.
  • 2NF : « Tout dépend de toute la clé ». Surtout important avec les clés composites.
  • 3NF : « Tout dépend de la clé, rien d'autre ». Élimine les liens entre attributs non-clés.

La normalisation est un outil, pas une fin en soi. Parfois, pour des raisons de performance sur des requêtes très complexes, on peut accepter une dénormalisation contrôlée. Mais pour la majorité de tes projets en NSI, viser la 3NF est la meilleure stratégie. Cela te garantit une base de données robuste, facile à maintenir et à faire évoluer.

Commence toujours par modéliser tes données (avec un MCD ou un schéma) avant de créer tes tables. La normalisation viendra naturellement vérifier et améliorer ta modélisation. Bon courage pour tes créations !

📚 Pour aller plus loin

Questions fréquentes

Faut-il toujours normaliser jusqu'à la 3NF ?

Dans la plupart des cas scolaires et pour les applications classiques, oui, la 3NF est un excellent objectif. Elle élimine les redondances et anomalies principales. Cependant, pour des applications d'analyse de données (data warehouse) où la vitesse de lecture est critique, on utilise parfois des modèles dénormalisés (en étoile ou en flocon). Pour tes projets NSI, pars toujours sur une base 3NF.

Comment repérer une dépendance transitive facilement ?

Pose-toi cette question pour chaque colonne non-clé : "Est-ce que cette information découle directement de la clé primaire, ou est-ce qu'elle découle d'une autre information déjà dans la table ?". Par exemple, 'Nom_Ville' découle souvent du 'Code_Postal', qui lui découle du 'Client_ID'. 'Nom_Ville' a donc une dépendance transitive. Si tu peux formuler une règle du type "Un [attribut A] détermine toujours un [attribut B]", et que A et B sont tous deux non-clés, tu as probablement une dépendance transitive.

La normalisation ralentit-elle les requêtes ?

Elle peut les complexifier car il faut faire des JOIN entre plusieurs tables. Cependant, elle améliore généralement les performances des opérations d'écriture (INSERT, UPDATE, DELETE) en évitant la redondance. Pour la lecture, un bon indexation et des requêtes bien écrites compensent largement. L'avantage en intégrité des données est bien plus important que le léger coût potentiel en lecture.

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
normalisation BDDformes normales1NF2NF3NFdépendance fonctionnelle
Pixel