Vorweg: diese Kolumne wurde zu 90% von ChatGPT geschrieben, auch die Idee kommt von dort. Mir selbst ist einfach kein Thema eingefallen, jetzt ist auch noch Freitagnachmittag - also lasse ich die KI das mal machen:
Eine Postleitzahl ist fünfstellig. Eine E-Mail-Adresse enthält ein @. Eine IBAN folgt bestimmten Regeln. Für uns ist das selbstverständlich – für die Datenbank war das bisher oft nur: PLZ VARCHAR2 (5). Was in dieser Spalte tatsächlich steckt, musste man am Namen erkennen, in der Dokumentation nachlesen oder aus irgendwelchen Constraints zusammensuchen.
In Oracle 26ai wurden darum Data Use Case Domains eingeführt.
Eine Domain beschreibt nicht nur, wie Daten technisch gespeichert werden, sondern auch, was sie bedeuten, und welche Regeln gelten. Statt in zehn Tabellen jeweils neu festzulegen, wie eine E-Mail-Adresse aussehen muss, kann man dafür einmal eine Domain definieren und sie passenden Spalten zuordnen. Sie kann unter anderem Datentyp, CHECK-Constraint, Default-Wert, Anzeigeformat und Metadaten enthalten. Domains ersetzen dabei weder sinnvolle Datentypen noch Primary Keys, Foreign Keys oder normale Constraints.
Eine Domain ist ein eigenes Schemaobjekt. Nehmen wir eine deutsche Postleitzahl:
CREATE DOMAIN deutsche_plz AS CHAR(5)
CONSTRAINT deutsche_plz_chk
CHECK (REGEXP_LIKE(deutsche_plz, '^[0-9]{5}$'));
Damit haben wir einmal festgelegt: Eine DEUTSCHE_PLZ besteht aus genau fünf Ziffern.
Beim Anlegen einer Tabelle lässt sich diese Domain einer Spalte zuordnen:
CREATE TABLE kunde (
kunden_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
plz CHAR(5) DOMAIN deutsche_plz
);
Jetzt funktioniert es:
INSERT INTO kunde VALUES (1, 'Müller', '60311');
Das hier dagegen nicht:
INSERT INTO kunde VALUES (2, 'Meier', '60A11');
Der Check steckt nicht in KUNDE, sondern stammt aus der Domain. Dieselbe Domain kann anschließend auch für LIEFERADRESSE.PLZ, FILIALE.PLZ oder andere passende Spalten verwendet werden. Oracle wendet die Eigenschaften und Constraints der Domain auf die zugeordneten Spalten an.
Auch vorhandene Tabellen lassen sich nachträglich zuordnen:
ALTER TABLE lieferadresse MODIFY (plz CHAR(5) DOMAIN deutsche_plz);
Im Data Dictionary findet man sie hier:
SELECT * FROM dba_domains;
(interessanterweise gibt es kein CDB-Äquivalent. Die KI konnte keinen Grund finden, warum den DBAs das Leben hier wieder komplizierter gemacht wird.)
Und wo sie tatsächlich verwendet werden, sieht man es beispielsweise so:
SELECT owner, table_name, column_name,
domain_owner, domain_name
FROM dba_tab_columns
WHERE domain_name IS NOT NULL;
Außerdem gibt es bereits 109 vorgefertigte Domains, die SYS gehören, natürlich oft im amerikanischen Format ('US_VEHICLE_ID_D',...).
Natürlich braucht nicht plötzlich jede zweite Spalte eine Domain. Aber bei Dingen, die in vielen Tabellen immer wieder dasselbe bedeuten – Postleitzahlen, E-Mail-Adressen, Währungen, Artikelnummern, ist die Idee charmant: Die Regel steht nicht zwanzigmal irgendwo im Datenmodell.
Eine Postleitzahl bleibt technisch vielleicht ein CHAR(5). Aber Oracle weiß jetzt zusätzlich, dass sie eine Postleitzahl ist.
Dagmar Förster


