Envoyé par
grabriel
Le défi est de ne pas voir apparaître le Bonhomme Null.
C'est à dire que d'une manière générale avoir une clé étrangère à NULL c'est [dans certains cas c'est possible / mal / pas conseiller / à éviter / houlaaa!! jamais au grand jamais] (Rayer la mention inutile).
Pour mon usage personnel, je coche la case « jamais au grand jamais ». En ce qui vous concerne, comme dit Laspalès à Chevallier : C’est vous qui voyez...
Si vous lisez le paragraphe 1.2. « Retour aux sources » de l’article Bases de données relationnelles et normalisation , vous noterez la définition de ce qu’est une relation au sens de la théorie relationnelle, relation dont la table SQL est un avatar plus ou moins conforme :
« Le terme de relation est utilisé ici dans son acception mathématique. Étant donnés les ensembles S1, S2, ..., Sn (non nécessairement distincts), R est une relation sur ces n ensembles si c'est un ensemble de n-uplets, le 1er élément de chacun d'eux tirant sa valeur de S1, le 2e de S2, et ainsi de suite (de manière plus concise, R est un sous-ensemble du produit cartésien S1 X S2 X ... X Sn). On fera référence à Sj comme étant le jième domaine de R. Suite à ce qui vient d'être énoncé, on dit que R est de degré n. Les relations de degré 1 sont souvent dites unaires, celles de degré 2 binaires, de degré 3 ternaires, et celles de degré n n-aires. »
S1, ..., Sn sont des ensembles, et dans un ensemble, NULL n’a pas de sens puisque ça n’est pas une valeur. Dans le cadre de la théorie relationnelle, un n-uplet (ligne en SQL) est une valeur construite à partie de ces ensembles et on n’a pas à y injecter NULL, sinon la définition « R est un sous-ensemble du produit cartésien S1 X S2 X ... X Sn) » n’est pas respectée. Un « n-uplet » marqué NULL n’est pas un n-uplet et une « relation » contenant un tel « n-uplet » n’est pas une relation. Le concept de NULL est banni de la théorie relationnelle. N’oublions pas non plus que l’algèbre relationnelle (avec ses opérateurs UNION, INTERSECTION, PROJECTION, JOINTURE, etc.) permet de manipuler des relations pour produire d’autres relations qui à leur tour pourront être utilisées pour engendrer d’autres relations, en respectant nécessairement le principe de fermeture et il n’est pas prouvé que ce principe ne soit pas mis en échec quand le bonhomme NULL intervient.
Concernant la théorie SQL, les choses ne sont pas claires. L’avatar de la relation qu’est la table peut contenir des lignes (avatars des n-uplets) en double (donc une table n’est pas un ensemble), notamment dans le résultat d’un SELECT. L’algèbre relationnelle devient une algèbre de « sacs » (un sac est comme un ensemble, à ceci près que les doublons y sont autorisés). Et bien entendu, dans une table, le bonhomme NULL est chez lui.
Envoyé par
grabriel
dans quel cas peut on avoir une clé étrangère à NULL?
Puisque dans la théorie relationnelle NULL est hors-la-loi, une clé étrangère ne peut pas héberger le bonhomme NULL. En SQL, NULL tend des pièges. Par exemple, si une clé étrangère comporte deux attributs ou plus, il suffit que l’un deux soit marqué NULL pour que vous puissiez valoriser le reste des attributs avec n’importe quoi : l’intégrité référentielle n’est pas vérifiée (La norme SQL permet de s’assurer de l’intégrité d’une partie de clé en cas de présence de NULL, mais assurez-vous que votre SGBD soit en conformité, ce qui n’est en général pas le cas (paramètre MATCH (FULL | PARTIAL | SIMPLE)).
Vous pouvez aussi consulter les discussions :
http://www.developpez.net/forums/d26...orie-pratique/
http://www.developpez.net/forums/d50...sum-x-p-sum-y/
http://www.dbdebunk.com/page/page/2928212.htm
Envoyé par
CinePhil
Je ne pense pas que ce soit carrément interdit par la norme ou les bonnes pratiques mais c'est plutôt à éviter.
La norme étant déviante par rapport à la théorie relationnelle, elle autorise la présence de NULL dans les clés étrangère, avec des possibilités de contrôle plus ou moins satisfaisants, comme je viens de le préciser. Comme vous vous en doutez, je ne connais pour ma part qu’une bonne pratique et je n'en dévie pas (et cela depuis de longues années...)
Partager