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é !).
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 |
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 |
Exemple 59. Troisième forme normale - table Marins
create table marins (nom, date de naissance) primary key (nom) ;
Exemple 60. Troisième forme normale - table Embarquements
create table embarquements (marin, date_embarquement, bateau, tonnage) primary key (marin, date_embarquement) ;
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.