2. Formes normales

Le premier modèle relationnel établi par le Dr Codd comporte douze règles. Nous allons juste voir les premières règles, dans une forme simplifiée.

2.1. Première forme normale

La première forme normale définit essentiellement la notion d'information atomique. Elle stipule les choses suivantes :
  • l'ordre des lignes ne porte pas d'information dans une table ;
  • l'ordre des colonnes ne porte pas d'information dans une table ;
  • une table ne peut pas comporter une même ligne plusieurs fois ;
  • chaque cellule d'une ligne ne porte qu'une seule information, qui ne peut pas être divisée ;
  • une table expose toutes ses informations dans ses lignes et ses colonnes (pas d'information cachée).
Tous ces principes sont en fait assez triviaux. Le fait qu'il ne peut pas y avoir de ligne dupliquée implique que chaque ligne doit avoir une identité , ce qui suppose que l'on peut toujours définir dessus une clé primaire. En général, cette clé primaire est portée par une colonne particulière, mais ce n'est pas toujours le cas. La notion de clé primaire est définie par la deuxième forme normale. Notons que cette forme indique que chaque cellule ne peut porter qu'une seule information. En toute rigueur, une colonne numéro de téléphone de notre table Marins ne doit donc pas comporter plusieurs numéros séparés par des virgules (cas que l'on ne rencontre bien sûr jamais dans la réalité !).

2.2. Deuxième forme normale

La deuxième forme normale définit la notion de clé primaire. Une table vérifiant la deuxième forme normale doit d'abord vérifier la première forme normale. Si l'on définit une clé primaire PK sur cette table, éventuellement constituée de plusieurs colonnes, alors toutes les colonnes de la table doivent dépendre uniquement de la totalité de PK, et non pas de l'une de ses parties. Théoriquement, cet énoncé peut paraître un peu compliqué, sur un exemple il devient très simple.

Tableau 10. Base musique - première version

Nom Instrument Adresse
Albert Piano 12, rue des fruits
Albert Clavecin 12, rue des fruits
André Clarinette 23, rue des fleurs
André Hautbois 23, rue des fleurs
André Flûte 23, rue des fleurs
Antoine Basson 34, rue des légumes

Une approche naturelle serait de prendre le nom de chaque musicien comme clé primaire. Ce n'est pas possible, car ce nom devrait permettre d'accéder à une ligne unique, ce qui n'est pas le cas. Une approche plus complexe pourrait consister à prendre les champs (nom, instrument) comme clé primaire. Cette seconde approche échoue aussi, dans la mesure où l'adresse que nous avons ajoutée ne dépend que du nom du musicien, et pas de l'instrument qu'il joue. On viole ici donc le fait qu'une colonne ne peut pas dépendre d'un composant (c'est-à-dire d'une partie) d'une clé primaire. Cette table viole donc la deuxième forme normale, il faut donc la réorganiser. Il faut éclater nos informations en deux tables.

Tableau 11. Base musique - deuxième version : table musiciens

Nom Adresse
Albert 12, rue des fruits
André 23, rue des fleurs
Antoine 34, rue des légumes

Tableau 12. Base musique - deuxième version : table instruments pratiqués

Nom Instrument
Albert Piano
Albert Clavecin
André Clarinette
André Hautbois
André Flûte
Antoine Basson

Dans cette dernière table, la clé primaire est constituée des deux colonnes de la table. En toute rigueur il faudrait même éclater cette deuxième table en deux tables, suivant le modèle que nous avons utilisé pour construire la relation entre nos marins et leurs communes de naissance.

2.3. Troisième forme normale

La deuxième forme normale nous impose qu'il n'est pas possible qu'une colonne puisse dépendre d'une partie de la clé primaire définie sur la table. La troisième nous impose le complément : une colonne n'a pas le droit de dépendre d'une colonne qui ne fait pas partie de la clé primaire. Prenons un exemple d’une structure qui respecte la deuxième forme normale, et qui malgré tout pose un problème immédiat. Nous avons une première table de marins :

Exemple 59. Troisième forme normale - table Marins

create  table marins (nom, date de naissance)  primary  key (nom) ;

Ces marins embarquent sur des bateaux, qui ont un tonnage :

Exemple 60. Troisième forme normale - table Embarquements

create  table embarquements (marin, date_embarquement, bateau, tonnage) 
    primary  key (marin, date_embarquement) ;

La table embarquements suit bien la deuxième forme normale : aucune colonne ne dépend d'une partie de la clé primaire. Toutefois, la colonne bateau, qui ne fait pas partie de la clé primaire, sert en fait de clé à la colonne tonnage, puisque le tonnage dépend bien sûr du bateau. Si l’on change la valeur de bateau, qui est une partie de clé primaire, on doit aussi changer celle de tonnage. En cela, elle viole la troisième forme normale : une colonne ne peut pas dépendre d'autre chose que de la clé primaire d'une table.

2.4. Formes normales d'ordres supérieurs

Il existe encore de nombreuses façons de normaliser les données. Le principe qui sous-tend toutes ces normalisations est cependant toujours le même : unicité des dépendances, unicité des actions SQL à effectuer pour la mise à jour d’une donnée unique. Il appartient aussi à chaque développeur de réfléchir à son problème, et de voir quelle forme normale est la plus simple pour résoudre son problème.
Introduction à SQL
Retour au blog Java le soir
Cours & Tutoriaux
Table des matières
Introduction
1. Un peu d'histoire
2. Organisation de la présentation
Un premier exemple
1. Un premier exemple
1.1. Construction d'une première table
1.2. Enregistrer quelques données
1.3. Extraire des données
2. Trier, classer, calculer
2.1. Classer des données
2.2. Trier des données
2.3. Effectuer des calculs
2.4. Mise à jour d'une valeur
3. Sélection sur plusieurs tables
3.1. Ajout du lieu de naissance
3.2. Clés primaires et clés étrangères
Organisation des données
1. Introduction
2. Bases de données, schémas et tables
2.1. Création d'une table
2.2. Création d'une colonne
2.3. Contraintes sur une table
2.4. Nommage des contraintes
2.5. Exemples de création de tables
2.6. Modification d'une table
2.7. Effacement d'une table
2.8. Remarques sur restrict et cascade
3. Types de données
3.1. Les types numériques
3.2. Les types caractère
3.3. Les types temporels
3.4. Les types binaires
3.5. Type auto-incrémental de MySQL
3.6. Type auto-généré de Derby
3.7. Séquences d'Oracle
Manipulation des données
1. Introduction
2. Extraire des données : select
2.1. Extraire des données d'une table unique
2.2. Clause where
2.3. Requêtes imbriquées
2.4. Fonctions d'agrégation, groupage
3. Supprimer des données : delete
3.1. Forme générale du delete
3.2. Effacement en cascade
3.3. Fonctionnement du delete
4. Ajouter des données : insert
4.1. Forme générale de l' insert
4.2. Copie d'une table dans une autre
5. Mettre à jour des données : update
5.1. Forme générale de l' update
5.2. Mise à jour avec une requête imbriquée
Interrogations sur plusieurs tables
1. Introduction
2. Formes normales
2.1. Première forme normale
2.2. Deuxième forme normale
2.3. Troisième forme normale
2.4. Formes normales d'ordres supérieurs
3. Relations entre éléments
3.1. Cardinalité d'une relation
3.2. Relation 1:1
3.3. Relation 1:p
3.4. Relation p:1
3.5. Relation n:p
4. Jointures
4.1. Jointure interne
4.2. Jointure externe
4.3. Auto-jointure
5. Unions
6. Vues
6.1. Création d'une vue
6.2. Exemples de vues
Transactions
1. Introduction
2. Isolation des transactions
2.1. ACIDité d'une transaction
2.2. Définition de l'isolation
3. Gestion d'une transaction
3.1. Mode auto-commit
3.2. Fixer le niveau d'isolation
3.3. Démarrer une transaction
3.4. Terminer une transaction
3.5. Remarques importantes
Index
1. Introduction
2. Manipulation d'index
2.1. Création automatique d'index
2.2. Création manuelle d'index