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;
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