Normalisation de bases de données
Normalisation
Les formes normales sont des niveaux de qualité d'un modèle relationnel.
Elles permettent de vérifier la robustesse de la conception du modèle en
évitant:
La redondance des données
Les problèmes de mise à jour
La cohérence.
Il existe 6 niveaux de de formes normales nous allons nous occuper des 3
premiers uniquement.
1NF
2NF
3NF
BCNF
Données
non-normalisation 1 NF 2 NF 3 NF BCNF
5 NF 4 NF
Pourquoi normalisation ?
-Réduire l’espace de stockage
-Eviter la redondance de données
-Eviter le coding (trigger,procédure stocké,…)
-Bien structurer des données
-Optimisation de performance:
.temps d’exécution(‘’thin table’’)
.Maximiser ‘’Clustered indexes’’ (trier,rercherche)
.Nombre d’index par table
1NF
Une relation est dite normalisée ou en première forme normale si :
aucun attribut qui la compose n'est lui-même une relation, c'est-à-dire si tout attribut
est atomique (non décomposable).
Cette forme n'utilise que les structures de base d'une relation, elle ne résout pas le
problème de la redondance.
Exemple :
Cette table ne respecte pas 1NF il y a plusieurs mails dans la meme colonne
La solution est de créer un table email pour y stocker les emails
2NF
Une relation est dite en deuxième forme normale si et seulement si :
Elle est en première forme normale ;
Chaque attribut est totalement dépendant de la clé primaire.
Avec cette forme, les problèmes de redondance ne sont pas entièrement résolus.
Mais ne pas respecter la 2FN entraîne des redondances. Cela gaspille de l'espace de stockage, et pose
aussi le problème de la mise à jour des données.
Exemple: 2NF
Dans la table suivante la difficulté de la figure ne dépend que de
la figure et non de la clef primaire entière (skater, figure). 2NF
n’est pas respecté
Exemple: 2NF
La solution est de décomposer la table en deux qui affichent les
deux dépendances:
Nom difficulté
(Skater,Figure)note
3NF
Une relation est en troisième forme normale si et seulement si :
Elle est en 2NF;
Et chaque attribut non-clé primaire dépend directement de la clé primaire.
La 3NF est adéquate pour la majorité des designs de BD mais elle n'élimine pas toutes les
redondances et incohérences. Pour cela, Codd a pensé à BCNF qui est une forme plus stricte de 3NF.
Exemple: 3NF
Dans la table suivante le sexe peut être déduit de l’attribut non
clef civilité. 3NF n’est pas respecté
Exemple: 3NF
La solution est de créer une table civilité qui contient le sexe
d’une personne en fonction de sa civilité
Cas de dénormalisation 3NF
Dans table suivante le total peut être calculé. Nous pourrions
donc supprimer cette colonne.
Cas de dénormalisation 3NF
Mais dans certains cas, même s'il est possible de recalculer les
montants totaux hors taxes et TTC à partir des lignes de commandes
de l'expédition associée à une facture,
Il peut être judicieux d'ajouter les colonnes total_ht et total_ttc dans
notre table facture. Cela permettrait de:
Faire des recherches par montant total plus facilement
Purger les tables expedition, ligne_commande et commande à intervalles
réguliers sans perdre l'information des montants totaux dans les factures.
Boyce-Codd Normal Form (BCNF)
Une relation est en BCNF si :
Elle est en 3NF
Les seules DFE existantes sont celles dans lesquelles une clé détermine un attribut.
4NF
Permet autant que possible de minimiser l'occurence d'attributs
indépendants à valeur mutiple.
Une relation est de la 4NF si :
elle satisfait la 3NF
les données composant chaque attribut ne comportent aucune
répétition inutile -> dans une même colonne, il faut minimiser les
répétitions.
Une base qui est 4NF est des plus optimales quoiqu'il soit possible de
généraliser cette dernière afin d'obtenir la 5NF.
4NF Exemple
Dans la table suivante :
Conférencier et Livre sont deux entités indépendantes
Les conférenciers peuvent enseigner n’importe quelle matière
Pour une matière donnée les étudiants peuvent utiliser plusieurs livres
Il y a une dépendance multivaluée sur Matière
La table cours ne respecte pas 4NF
4NF Exemple
Si nous faisons un « SELECT [Link], [Link] FROM
COURSE c WHERE SUBJECT = 'Mathematics’; »
Nous obtenons
Alors qu’il n’y a pas de dépendance entre conférencier et livre
La solution pour supprimer la dépendance est de créer deux tables
Conférencier et Livre