Bonsoir,
La « valeur » de NumeroSecu peut être n’importe quoi, puisque c’est l’attribut NumeroSecuIndic qui permet de savoir si la valeur prise par l’attribut NumeroSecu a un sens. Le plus économique (il n’y a pas de petit profit) est une chaîne vide. Pour les attributs de type numérique, même principe.
Mais on peut aussi procéder plus proprement, en fragmentant les tables verticalement. Je reprends un exemple que j’utilise à l’occasion — inspiré d'un article commis par Chris Date (Database Programming & Design 10, No. 1, January 1997) —, à savoir celui des employés :
— Tous les employés ont un salaire.Si l’on se met dans vos conditions, salaires et primes ne sont pas forcément connus lors de la saisie.
— Seuls certains employés ont une prime.
La table des employés ressemble à ceci :
EMPLOYE {EmpId, Nom, Salaire, Prime, ...}Mais on peut fragmenter verticalement cette table en trois parties :
EMPLOYE {EmpId, Nom, IndicPrime, ...}A cette occasion, on a ajouté à la nouvelle table EMPLOYE un attribut IndicPrime, grâce auquel on peut savoir si un employé fait partie ou non de ceux qui ont droit à une prime ("V" pour ceux qui ont droit, "F" dans le cas contraire).
EMP_SALAIRE {EmpId, Salaire}
EMP_PRIME {EmpId, Prime}
Supposons maintenant que, vu de l’utilisateur, la réalité soit la suivante :
Le contenu correspondant des tables est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 EmpId Nom Salaire Prime ----- -------- -------- -------- 1 Albert 3500 750 2 Bernard 5000 Sans objet 3 Charles Inconnu Sans objet 4 Dorothée 4000 Inconnu 5 Eugène Inconnu Inconnu 6 Francis 2000 0 7 Guy Inconnu 0 8 Hector Inconnu 1000
Tout le monde ayant un salaire, si les employés Charles (3), Eugène (5), Guy (7) et Hector (8) sont absents de la table EMP_SALAIRE, c’est que leur salaire n’est pas [encore] connu. D’après l’attribut IndicPrime, Bernard (2) et Charles (3) ne sont pas concernés par les primes. En revanche, Dorothée (4) et Eugène (5) sont concernés, mais leur prime n’est pas [encore] connue. Si Francis et Guy ont une prime égale à zéro, c’est sans doute parce qu’ils ont été trop peu productifs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 EMPLOYE EMP_SALAIRE EMP_PRIME EmpId Nom IndicPrime EmpId Salaire EmpId Prime 1 Albert V 1 3500 1 750 2 Bernard F 2 5000 6 0 3 Charles F 4 4000 7 0 4 Dorothée V 6 2000 8 1000 5 Eugène V 6 Francis V 7 Guy V 8 Hector V
La fragmentation verticale donne des boutons à d’aucuns, tout comme la dénormalisation, parce que l’on « casse » les tables. Pour le confort des développeurs, des trois tables on peut faire une vue qui permet de voir les données comme on les a présentées ci-dessus à l’utilisateur (indépendance logique, again...), c'est-à-dire sans qu'ils aient à effectuer eux-mêmes les jointures :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 CREATE VIEW EMP_V (Empid, Nom, Salaire, Prime) AS SELECT x.Empid, x.EmpNom, x.Salaire, y.Prime FROM (SELECT e.Empid, e.EmpNom , Coalesce(Cast(s.Salaire As Char), 'Inconnu') AS Salaire FROM EMPLOYE AS e LEFT JOIN EMP_SALAIRE AS s ON e.Empid = s.Empid) AS x JOIN (SELECT e.Empid, e.EmpNom , Coalesce(Cast(p.Prime As Char), 'Inconnu') AS Prime FROM EMPLOYE AS e LEFT JOIN EMP_PRIME AS p ON e.Empid = p.Empid WHERE IndicPrime = 'V' UNION SELECT e.Empid, e.EmpNom, 'Sans objet' AS Prime FROM EMPLOYE As e WHERE IndicPrime = 'F') AS y ON x.Empid = y.Empid ;
Un SELECT * FROM EMP_V et on a le résultat tel qu'il a été présenté à l'utilisateur.
Maintenant, si le patron de la Production refuse que l’on fragmente les tables (inflation des fichiers hébergeant les données car, hélas ! les SGBD ont la fâcheuse habitude de reprendre la structure des tuples pour les enregistrements physiques...), battons en retraite, sinon notre prime nous passera sous le nez. Même chose si le prototypage des performances s’avère négatif (ce qui m'étonnerait quand même beaucoup). Peut-être faudra-t-il se résoudre à passer sous les fourches caudines du bonhomme NULL ?
Partager