Bonsoir,

Envoyé par
tc92
Sur le fait de s'interdire les valeurs NULL, déclarer (Not Null) pour chaque colonne au moment de la création de la table, ok, pourquoi pas. Je dirais que ça manque un peu d'ambition, mais c'est une stratégie tout à fait valable.
Allons-y pour une stratégie ne manquant pas d’ambition, à savoir autoriser les valeurs marques "NULL". Allons voir du côté de la normalisation des bases de données quelles en sont les conséquences, car la normalisation c’est quand même un sujet important, sur lequel planchèrent moult PhD et autres docteurs ès sciences.
Voici ce qu’écrit Codd (père du relationnel) dans The Relational Model for Database Management: Version 2 (Reading, Mass.: Addison-Wesley, 1990). :
« the normalization concepts should be applied to a conceptual version of the database in which rows containing missing-but-applicable information in the pertinent columns have been removed ».
De fait, si le bonhomme Null traîne ses guêtres dans les tables, tous les théorèmes ‒ et y en a ! ‒ ayant trait à la normalisation sont alors bons pour la poubelle. Il est donc nécessaire de normaliser, tout en interdisant de facto à Null de ficher la patouille dans les tables.
Prenons par exemple le cas du théorème de Heath, qui dit ceci :
Si la relation R (A, B, C) satisfait à la dépendance fonctionnelle A → B, alors R peut être décomposée sans perte [de contenu] selon ses projections R1 (A, B) et R2 (A, C), c'est-à-dire que l'on peut retrouver R par la jointure naturelle de R1 et de R2 sur A.
Voyons voir. Soit E {Eno, Dno, Ct} la table des employés d’une entreprise, où :
Eno représente le numéro de l'employé (clé primaire) ;
Dno représente le numéro du département ;
Ct représente le type de contrat.
Dans l'entreprise, un employé est affecté à un seul département et à un département est affecté un seul type de contrat. Il existe donc notamment les dépendances fonctionnelles suivantes :
(df1) Eno → Dno
(df2) Dno → Ct
(df3) Eno → Ct
Du fait de la dépendance fonctionnelle df3, la troisième forme normale est violée, la table E doit donc être décomposée en :
E1 {Eno, Dno} /* clé primaire Eno */
E2 {Dno, Ct} /* clé primaire Dno */
Maintenant, avant normalisation, polluons la table E avec NULL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Create Table E
( Eno Varchar(5) Not Null
, Dno Varchar(3)
, Ct Varchar(3)
, Constraint E_PK Primary Key (Eno)
) ;
Insert Into E Values
('e1', 'd5', 'g')
, ('e2', NULL, 'g')
, ('e3', 'd2', 'n')
, ('e4', 'd3', 'n')
, ('e5', 'd2', 'n')
, ('e6', NULL, 'n')
, ('e7', 'd8', 'g')
;
select * from E ; |
Au résultat :
1 2 3 4 5 6 7 8
| Eno Dno Ct
e1 d5 g
e2 NULL g
e3 d2 n
e4 d3 n
e5 d2 n
e6 NULL n
e7 d8 g |
Décomposons E en E1 et E2, et joignons ces deux dernières :
1 2 3 4 5 6
| select distinct E1.Eno, E1.Dno, E2.ct
from
(select Eno, Dno from E) as E1
join
(select Dno, Ct from E) as E2
on E1.Dno = E2.Dno ; |
Au résultat :
1 2 3 4 5 6
| Eno Dno ct
e1 d5 g
e3 d2 n
e4 d3 n
e5 d2 n
e7 d8 g |
Les employés e2 et e6 manquent à l’appel : à cause de NULL, le théorème de Heath est inapplicable et ceci vaut pour l’ensemble des théorèmes ayant trait à la normalisation...
Bref, comme en 1815, l’ambition peut conduire à l’échec. Cela dit, prudence est mère de sûreté.
Partager