12.122012

Constraints auf Feldern durch Domains vereinheitlichen

In einer Datenbank kommt man oft in die Situation, in mehreren Tabellen Felder zu haben, bei denen man den Inhalt gleichermaßen prüfen, also Constraints auf dem Feld definieren möchte. Als Beispiel nehme ich hier mal ein Text-Feld, in dem eine URL steht.

Wir wollen sicherstellen, das der enthaltene Text auch wirklich eine URL ist - der einfachhalt halber nehmen wir beispielsweise jetzt die vereinfachte Bedingung, das das Feld mit http(s):// beginnt.
Anstatt jetzt auf jeder Tabelle, die so ein Text-Feld mit einer URL enthält, einen entsprechenden Constraint zu definieren, ist es leichter wartbar eine sogenannte Domain einzuführen. Eine Domain ist einfach ein Feld eines bestimmten Typs, das optional auch einen Constraint definiert haben kann. Unser Beispiel sähe jetzt auf PostgreSQL folgendermaßen aus:

CREATE DOMAIN url AS text
CONSTRAINT url_check CHECK
((VALUE ~ '^https?://.*'::text));

Jetzt können wir in unseren Tabellen einfach als Feld-Typ statt text unsere neu angelegte Domain url verwenden, die entsprechend sicherstellt, das der Inhalt mit unserer Regel (http(s)://) konform ist.

Auf diese Weise müssten wir bei Änderungen an dem Check für unsere Url-Felder jetzt nurnoch einmalig zentral machen, ohne die einzelnen Tabellen alle anfassen zu müssen.

Vielleicht erspart sich der eine oder andere von euch auf diese Weise in der Zukunft etwas Arbeit!