À quoi sert un domaine ?

  • Une abstraction de haut niveau permattant de maintenir une base de code clair.
  • Définir des contraintes métiers ou technologiques.

Passons a la pratique avec PG13 avec un exercice:

Je veux vérifier que mon nombre est compris entre 1 et 10 inclus.

DROP DOMAIN IF EXISTS d_number_between_1_10;
CREATE DOMAIN d_number_between_1_10 AS INTEGER
CHECK (
      VALUE >= 1 AND VALUE <= 10
);

Le domaine est crée. Je peux vérifier son existence en requetant le catalogue:

\dD d_number_between_1_10

                                                 List of domains
 Schema |         Name          |  Type   | Collation | Nullable | Default |               Check
--------+-----------------------+---------+-----------+----------+---------+------------------------------------
 public | d_number_between_1_10 | integer |           |          |         | CHECK (VALUE >= 1 AND VALUE <= 10)

Passons a la création de la table. À partir de maintenant le domaine peut être utilisé pour la définition d’une table, fonction ou vue.

CREATE TABLE T_FOOBAR (
       ID SERIAL NOT NULL,
       my_number d_number_between_1_10,
       PRIMARY KEY (ID)
);

-- FONCTIONNE
INSERT INTO T_FOOBAR (my_number) VALUES (1), (2), (9), (10);

-- ERREUR : violation de la contrainte
INSERT INTO T_FOOBAR (my_number) VALUES (11);

Note: un domaine peut réferencer un autre domaine et donc construire des abstractions puissante et évolutives:

  • Un domaine technologie: vérifier les entrées saisies par les utilisateurs.
  • Un domaine métier: se base sur le domaine technologie et ajoute une logique métier.