Qu'est-ce que Normalisation ?

Démarche de conception qui découpe les tables d'une base de données relationnelle en fonction des dépendances fonctionnelles entre colonnes, afin que le même fait ne soit pas enregistré à plusieurs endroits. Elle supprime les données en double et évite les anomalies de mise à jour, d'insertion et de suppression. Ses étapes comprennent les première à troisième formes normales et la forme normale de Boyce-Codd.

Nom japonais: 正規化

« Normalisation » apparaît dans 3 questions d'entraînement réparties sur 1 thèmes, dont Bases des bases de données.

Domaine: Bases des bases de données

Anomalies évitées par la normalisation

Dans une table non normalisée, le même fait est enregistré à de nombreuses reprises dans de nombreuses lignes. Si chaque ligne d'une table des employés contient aussi le nom du service, par exemple, renommer un service oblige à réécrire toutes les lignes des employés de ce service, et en oublier une seule rend le contenu incohérent (anomalie de mise à jour). On ne peut pas enregistrer un service qui n'a pas encore d'employé (anomalie d'insertion), et supprimer le dernier employé d'un service efface aussi les informations du service (anomalie de suppression). Placer les informations sur les services dans une table distincte enregistre chaque fait à un seul endroit et évite ces anomalies.

De la première à la troisième forme normale

La première forme normale est l'état dans lequel chaque colonne contient une valeur unique, sans répétition. La deuxième forme normale est la première forme normale sans aucune colonne qui dépende d'une partie seulement de la clé primaire (pas de dépendance fonctionnelle partielle) ; cela concerne les tables dont la clé primaire comporte plusieurs colonnes. La troisième forme normale est la deuxième forme normale sans aucune colonne déterminée par l'intermédiaire d'une colonne autre que la clé primaire (pas de dépendance fonctionnelle transitive). S'il existe par exemple une dépendance comme NumCommande → NumClient → NomClient, NumClient et NomClient sont déplacés dans une table distincte. Les tables sont découpées de façon que leur jointure sur les colonnes communes restitue la table d'origine sans perte d'information.

Trouver l'équilibre avec la dénormalisation

La normalisation supprime les doublons, mais découper les tables impose des jointures à chaque recherche. Dans les bases de données utilisées surtout pour la lecture et l'agrégation, on fusionne parfois délibérément des tables et l'on réintroduit des doublons pour les performances ; c'est la dénormalisation. Elle exige alors un mécanisme pour mettre à jour les données en double de façon cohérente. Les bases de données de traitement transactionnel, qui subissent beaucoup de mises à jour, sont en principe normalisées jusqu'à la troisième forme normale.

S'entraîner : questions sur Normalisation

Quel est le but principal de la normalisation des tables d'une base de données relationnelle ?

  1. ARéduire le nombre de tables pour que toute recherche puisse se faire rapidement sans jointure
  2. BChiffrer les données pour que les utilisateurs non autorisés ne puissent pas les lire
  3. CÉliminer les données en double et éviter des anomalies comme des contenus qui deviennent incohérents après une mise à jour
Afficher la réponse et l'explication

Réponse : C. Éliminer les données en double et éviter des anomalies comme des contenus qui deviennent incohérents après une mise à jour

La normalisation est une démarche de conception qui découpe les tables en fonction des dépendances fonctionnelles entre colonnes (une relation dans laquelle la valeur d'une colonne détermine celle d'une autre), afin que le même fait ne soit pas enregistré à plusieurs endroits. Par exemple, si chaque ligne d'une table des employés contient aussi le nom du service, renommer un service oblige à réécrire toutes les lignes des employés de ce service, et en oublier une seule rend le contenu incohérent (anomalie de mise à jour). D'autres problèmes surviennent aussi : on ne peut pas enregistrer un service qui n'a pas encore d'employé (anomalie d'insertion), et supprimer le dernier employé d'un service efface aussi les informations du service (anomalie de suppression). Si les informations sur les services sont placées dans une table Service distincte, le nom d'un service ne doit être corrigé qu'à un seul endroit. En revanche, des tables séparées impliquent davantage de jointures lors des recherches ; la normalisation ne rend donc pas forcément les recherches plus rapides.

La clé primaire d'une table Commande(NumCommande, NumArticle, Quantite, NumClient, NomClient) est {NumCommande, NumArticle}, et ses dépendances fonctionnelles sont {NumCommande, NumArticle} → Quantite, NumCommande → NumClient et NumClient → NomClient. Quel est le résultat correct de la normalisation de cette table jusqu'à la troisième forme normale (3NF) ?

  1. ALigneCommande(NumCommande, NumArticle, Quantite, NumClient), Client(NumClient, NomClient)
  2. BLigneCommande(NumCommande, NumArticle, Quantite), Commande(NumCommande, NumClient), Client(NumClient, NomClient)
  3. CLigneCommande(NumCommande, NumArticle, Quantite), Commande(NumCommande, NumClient, NomClient)
Afficher la réponse et l'explication

Réponse : B. LigneCommande(NumCommande, NumArticle, Quantite), Commande(NumCommande, NumClient), Client(NumClient, NomClient)

La deuxième forme normale est l'état d'une table en première forme normale dans laquelle aucune colonne ne dépend d'une partie seulement de la clé primaire (pas de dépendance fonctionnelle partielle). NumCommande → NumClient est une dépendance fonctionnelle partielle, car NumClient est déterminé par NumCommande seul, qui n'est qu'une partie de la clé primaire ; la table d'origine est donc en première forme normale mais pas en deuxième forme normale. Placer les colonnes déterminées par NumCommande dans Commande(NumCommande, NumClient, NomClient) donne la deuxième forme normale. La troisième forme normale (3NF) est l'état d'une table en deuxième forme normale dans laquelle aucune colonne n'est déterminée par l'intermédiaire d'une colonne autre que la clé primaire (pas de dépendance fonctionnelle transitive). Commande contient encore la dépendance fonctionnelle transitive NumCommande → NumClient → NomClient ; on sépare donc aussi Client(NumClient, NomClient). Les 3 tables LigneCommande(NumCommande, NumArticle, Quantite), Commande(NumCommande, NumClient) et Client(NumClient, NomClient) sont alors en troisième forme normale. Les joindre sur NumCommande et NumClient restitue la table d'origine.

Questions fréquentes

Quelle est la différence entre la deuxième et la troisième forme normale ?

La deuxième forme normale n'a aucune colonne déterminée par une partie seulement de la clé primaire (pas de dépendance fonctionnelle partielle). La troisième forme normale n'a en plus aucune colonne déterminée par l'intermédiaire d'une colonne autre que la clé primaire (pas de dépendance fonctionnelle transitive). Une table dont la clé primaire ne compte qu'une colonne est automatiquement en deuxième forme normale si elle est en première forme normale.

La normalisation accélère-t-elle les recherches ?

Pas forcément. Le but de la normalisation est de supprimer les doublons et d'éviter les anomalies lors des mises à jour ; découper les tables implique davantage de jointures pour les recherches. Lorsque les performances de lecture sont importantes, on dénormalise parfois délibérément des tables.

« Normalisation » dans les explications

Questions mentionnant « Normalisation » (3)

  1. Quel est le but principal de la normalisation des tables d'une base de données relationnelle ?
  2. La clé primaire d'une table Commande(NumCommande, NumArticle, Quantite, NumClient, NomClient) est {NumCommande, NumArticle}, et ses dépendances fonctionnelles sont {NumCommande, NumArticle} → Quantite, NumCommande → NumClient et NumClient → NomClient. Quel est le résultat correct de la normalisation de cette table jusqu'à la troisième forme normale (3NF) ?
  3. Dans une base de données utilisée surtout pour la lecture et l'agrégation, des tables issues de la normalisation sont parfois délibérément fusionnées en une seule, de sorte que les mêmes données sont stockées en double (dénormalisation). Quelle combinaison associe correctement un avantage et un inconvénient de cette conception ?

Termes associés

Base de données relationnelle Clé primaire Troisième forme normale (3NF) Clé étrangère (foreign key) Diagramme E-R (entité-association) Index (index de base de données) Niveau d'isolation NoSQL Propriétés ACID SQL

Retour au glossaire