Bonjour zizoufoot,
Ce que MS SQL Server appelle « DOMAINE » n’est pas un domaine, mais une construction fort bizarre. Je rappelle ce qu’a écrit Ted Codd en 1970 dans son article fondateur A Relational Model of Data Large Shared Data Banks, je cite et traduis :
« Le terme 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. »
Le concept de domaine vient donc des mathématiques. Jusqu’au milieu des années quatre-vingt-dix, tous les SGBD SQL (à l’exception de RDB de DEC) on ignoré superbement le concept de domaine, tandis que nous le réclamions invariablement sur l’air des lampions puisqu’il est au coeur de la théorie relationnelle. Et patatras, ceux qui font la norme SQL ont accouché d’un concept dévoyé, décrit dans SQL/92 :
1 2 3 4
| Domain-definition
::= CREATE DOMAIN domain [AS] data-type
[default-definition]
[domain-constraint-definition-list] |
Où à son tour « domain-constraint-definition-list » se présente ainsi :
[CONSTRAINT constraint] CHECK (conditional expression)
Puis, si on tire sur la ficelle, on en arrive aux cas où « conditional expression » peut être en particulier (j’abrège la liste) une condition du type :
in-condtion
exists-condition
C'est-à-dire que l’on peut faire référence à une [expression de] table pour définir ce que la norme prétend être un domaine !
Je cite et traduis Chris Date (Relational Database, Writings 1991 - 1994, page 104) :
« Une règle d’intégrité de domaine se contente conceptuellement d’énumérer les valeurs qui composent ce domaine. Néanmoins SQL/92 permet qu’une règle d’intégrité de “domaine” implique une expression à valeur de vérité, de complexité arbitraire. Un pareil laxisme injustifié sème la pagaille au sein de concepts tout à fait fondamentaux. Par exemple, si on définit le domaine D de telle sorte qu’il tire ses valeurs de la colonne C de la table T, alors QUEL EST LE DOMAINE DE LA COLONNE T.C ? Je recommande vivement de ne pas “tirer avantage” de cet aspect tout à fait étrange de SQL/92. »
A son tour, Microsoft se contente manifestement de suivre ce qui vient de la norme dont la définition du domaine est bonne pour la poubelle, d’où ses recommandations pour le moins étranges, faisant intervenir les clés étrangères, la clause NOT NULL, etc., et qui vous ont fait tiquer à juste titre.
En complément :
Je ferai observer que selon la norme, un domaine est défini « [AS] data-type », c'est-à-dire comme un sous-ensemble d’un type de données existant : INTEGER, CHAR, ... : pas moyen de décoller et de définir soi-même un domaine aussi simple que le domaine POINT (en coordonnées cartésiennes ou polaires, peu importe), puis le domaine ELLIPSE, etc. Un domaine n'a pas à faire obligatoirement référence à un data-type du SGBD, on doit pouvoir écrire par exemple (je m’inspire ici de Tutorial D où le terme DOMAIN a été remplacé par celui de TYPE) :
1 2
| DOMAIN LONGUEUR ORDINAL -- domaine des longueurs (ORDINAL signifie que 2 longueurs peuvent être comparées).
{X RATIONAL CONSTRAINT X >= 0.0} ; |
Où X est le composant du type qui me convient (rationnel en l’occurrence).
1 2
| DOMAIN ANGLE ORDINAL
RHO RATIONAL CONSTRAINT RHO >= 0.0 AND RHO < 3.14159} ; |
1 2 3
| DOMAIN POINT -- points géométriques dans l’espace à 2 dimensions
POSSREP CARTESIAN {X RATIONAL, Y RATIONAL}
POSSREP POLAR {R LONGUEUR, THETA ANGLE} ; |
1 2
| DOMAIN ELLIPSE
{A LONGUEUR, B LONGUEUR, CENTRE POINT CONSTRAINT A >= B} ; |
C'est-à-dire qu’on doit pouvoir enfin décoller de façon très simple et ne pas rester scotché au ras des types fournis par le SGBD.
Partager