donderdag 11 februari 2016

Domeintabellen

Wat is een domeintabel?
Objecten en relaties hebben eigenschappen (bijvoorbeeld: het object ‘werknemer' heeft onder andere een voornaam, achternaam, geslacht, BSN-nummer, woonplaats). Deze eigenschappen zijn mogelijk beperkt in de toegestane waarden, dit heet een domein. Bijvoorbeeld, de eigenschap ‘geslacht' heeft als mogelijke waarden: ‘Man', ‘Vrouw' en ‘Onzijdig'. Deze domeinwaarden worden doorgaans gecodeerd. Voor eigenschappen als ‘voornaam' zijn geen domeintabellen opgesteld, omdat de mogelijke waarden hiervoor onbeperkt zijn.(Bron:Aquo.nl-domeintabel


Voor verdere toelichting over het gebruik van domeinen wordt verwezen naar de  Praktijkrichtlijn Aquo-domeintabellen. Dit document is al enkele jaren oud en wellicht niet geactualiseerd sinds 2011.

Het is voor informatiesystemen gebruikelijk alle domeinen te verzamelen in enkele domein-, stam- en/of stuurtabellen, waarbij in de objecttabellen sleutels (foreign-key relaties) opgenomen worden die indirect verwijzen naar de juiste domeinwaarden, zoals werknemer > tabelrelatie > geslacht.
Er wordt meestal wat programmatuur om deze tabellen heen geschreven om er een werkend geheel van te maken.

Nu een korte beschouwing na wat Aquo domeintabellen bekeken te hebben:

- Er is geen toegevoegde waarde van de kolom ID.
- Voor 90% van alle domeinwaarden blijkt de kolom code niet significant te verschillen van de kolom afkorting. Sterker, er is maar één tabel gezien waarbij beiden van elkaar afwijken, namelijk WatertypeKwalitatief, waarbij het ook nog eens lijkt dat de kolom afkorting wordt misbruikt als een alternatieve code waarde. Huh..?
- Het aantal kolommen/eigenschappen kan per domein verschillen, maar er is zo te zien wel een minimum set (waarbij ID en afkorting maar alvast weggelaten worden):
  • Code
  • Omschrijving
  • Groep
  • D_BEGIN
  • D_EIND
  • D_STATUS
- Alle overige kolommen die af-en-toe voorkomen zijn zeker relevant, maar niet echt geschikt om in een databasetabel te verzamelen.
- De kolom Code is vaak te abstract om te gebruiken als de domeinwaarde, het zegt vaak niets.
- De kolom Omschrijving daarentegen voldoet prima als aanduiding van de domeinwaarde.

Hierboven is Aquo genoemd als bron voor domeinwaarden, maar er zijn natuurlijk meer bronhouders, inclusief de eigen organisatie.

Uitwerking in DEMO

1. Er is maar één domeinwaardentabel, in het schema public, voor alle domeinwaarden afkomstig van alle domeinbronhouders, inclusief de eigen organisatie.

2. De domeinwaardentabel wordt gebruikt als lookup table voor alle schema's binnen (en eventueel buiten) de database.

3. Een object legt geen verwijzing (sleutel) vast naar een domeinwaarde, maar de omschrijving van die domeinwaarde. Applicaties krijgen hiermee eenvoudiger toegang tot objectinformatie.

3. Voor iedere domeinwaarde geldt, rekening houdend met historie: once-in, never out. Applicaties worden met een view geholpen om actuele domeinwaarden op te vragen.

5. Het originele bronrecord van iedere domeinwaarde (ongeacht het aantal kolommen dat het record bevat) bevind zich integraal in de domeinwaardentabel in een JSON kolom. Applicaties kunnen deze structuur geautomatiseerd inlezen en naar wens gebruiken. Voorbeelden volgen later..

6. Aan een domeinwaarde is te zien of  het een waarde is uit een limitatieve enumeratie of een waarde uit een vrij aan te vullen codelijst. Van een enumeratie is altijd een codelijst te maken, maar de limitatieve domeinwaarden blijven voor applicaties altijd apart toepasbaar.

Zo doende is de volgende tabel ontstaan, waaraan twee views zijn toegevoegd:


CREATE TABLE public.domeinwaarden
(
  domeinwaarden_pk serial PRIMARY KEY,
  naamruimte varchar,
  domein varchar,
  code varchar,
  omschrijving varchar,
  groep varchar,
  begindatum date,
  einddatum date,
  status varchar,
  json json,
  enumerator boolean,
  waardering integer
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.domeinwaarden OWNER TO postgres;

CREATE OR REPLACE VIEW public.current_domeinwaarden AS
  SELECT *
  FROM domeinwaarden
  WHERE einddatum IS NULL;
ALTER TABLE public.current_domeinwaarden
  OWNER TO postgres;

CREATE OR REPLACE VIEW public.current_enum_domeinwaarden AS
  SELECT *
  FROM domeinwaarden
  WHERE einddatum IS NULL AND enumerator = true;
ALTER TABLE public.current_enum_domeinwaarden
  OWNER TO postgres;


Deze opzet is sterk vereenvoudigd ten opzichte van traditionele informatiesystemen.
Er hoeft niets geprogrammeerd te worden.
Het voldoet prima, biedt functioneel gezien zelfs meer mogelijkheden..


Geen opmerkingen:

Een reactie posten