vrijdag 19 februari 2016

CREATE DOMAIN

Aan een PostgreSQL database kunnen domains toegevoegd worden. Een prima basis voor het opnemen van domeinlijsten in databasetabellen.

DAMO: Domeinwaarden opnemen in tabellen

Een PostgreSQL domain is eigenlijk een speciaal data-type met optionele constraints, bijvoorbeeld:


CREATE DOMAIN public.jaofnee AS character varying
  CONSTRAINT jaofnee CHECK (value = ANY (ARRAY['j', 'ja', 'n', 'nee']));


Een eenmaal gedefinieerd domain kan in tabeldefinities toegepast worden:


CREATE TABLE object
(
  ..

  inonderzoek jaofnee,
  ..
)



Het voorbeeld spreekt voor zich. De grote winst in het gebruik van domains is dat de check constraints geen onderdeel (meer) uitmaken van de tabeldefinities, maar van generieke data-typen:

  • eenvoudig van opzet
  • éénmalig definieren, meervoudig toepassen in tabellen
  • geen tabelonderhoud bij domein aanpassingen


Maar het kan nog beter..
Door check-constraints te laten verwijzen naar de tabel public.domeinwaarden waarin alle mogelijke domeinwaarden zijn opgenomen neemt het eenduidig gebruik toe en het beheer nog verder af. Zie als voorbeeld het volgende speciale data-type watertypekwalitatief:



CREATE DOMAIN public.watertypekwalitatief
  AS character varying
  COLLATE pg_catalog."default"
  CONSTRAINT watertypekwalitatief CHECK (VALUE = ANY (get_domainvalues('aquo', 'watertypekwalitatief')));
ALTER DOMAIN public.watertypekwalitatief OWNER TO postgres;


Mochten domeinwaarden in de tabel public.domeinwaarden later veranderen, dan heeft dat op de tabellen waar deze gebruikt worden geen effect.

Merk op dat er in deze constraints gebruik gemaakt wordt van een functie get_domainvalues:


CREATE OR REPLACE FUNCTION public.get_domainvalues(varchar, varchar) RETURNS character varying[]
  AS 'SELECT array_agg(omschrijving) FROM public.domeinwaarden
  WHERE  naamruimte = $1 AND domein = $2;'
LANGUAGE SQL SECURITY DEFINER;


Deze functie stelt aan de hand van twee parameters (in dit voorbeeld 'aquo' en 'watertypekwalitatief' ) een lijst samen met alle (in het heden  EN verleden) passende domeinwaarden:


"{"heuvellandbeken bovenloop","heuvellandbeken middenloop","heuvellandbeken benedenloop",rivieren,veenbeken,"overige rivieren",stadswateren,kleigaten,petgaten,"afgesloten zeearmen",laagveenplassen,"licht brakke sloten",duinbeken,"brakke sloten","weteringen  (...)"}"


Veel meer valt er over domains niet te vertellen,
Bij het gebruik van domeinen in objecttabellen komt nog wel de geldigheid ter sprake.


Geen opmerkingen:

Een reactie posten