maandag 1 februari 2016

Wèrkelijk unieke objectidentificatie

We duiken meteen de diepte in..

De standaard (logische) datamodellen waar DEMO-DAMO op gebaseerd wordt gaan er van uit dat ieder (bedrijfs) object uniek identificeerbaar is met het attribuut LokaalID, echter zonder aan te geven wat de reikwijdte van dit attribuut is en hoe het gebruikt moet worden.

Een gemiste kans, want door een Globally Unique Identifer (GUID) of Universally Unique Identifier (UUID) te gebruiken als LokaalID wordt een object pas écht uniek, òòk buiten de eigen organisatie.

Iedere tabel in een informatiesysteem gebruikt een PRIMARY KEY (PK) om ervoor te zorgen dat ieder record in die tabel uniek is, en gebruikt deze sleutel ook voor het leggen van relaties met andere tabellen en het indiceren van records. Meestal is de PK een oplopend nummer (integer) dat door het databasesysteem automatisch gegenereerd wordt.

Het is verleidelijk om een PK op te waarderen als hèt identificerend gegeven van een object naar de gebruiker toe. Dat is niet verstandig, alleen al om het feit dat PK's over tabellen, of zelfs databases heen, niet zonder meer uniek is. Een PK heeft een belangrijke taak binnen een relationeel database systeem, maar daar moet het bij blijven.
Dus PK's  zijn niet bruikbaar als identificerend gegeven van een object.

Meestal wordt aan een objecttabel een extra kolom toegevoegd met een uniek 'code' attribuut. In deze code worden vaak ook nog eens een aantal objecteigenschappen versleuteld. Dat kan handig zijn voor degene die vaak met deze objecten werkt, maar zo'n code verliest al snel iedere betekenis buiten de tabel. Omdat ieder objecttype een eigen codeersysteem kent, staat dit verdere standaardisatie in de weg. Dus coderingen ook niet gaan gebruiken als identificerend gegeven van een object.

Door een Globally Unique Identifer (GUID) of Universally Unique Identifier (UUID) als identificerend gegeven te gebruiken wordt een object pas écht uniek, ook buiten de eigen organisatie.

GUID's in DEMO

De omschrijving van een GUID in DEMO is een 'Uniek identificatienummer voor het object dat onveranderlijk is zolang het object bestaat'.

Dit is bijvoorbeeld een GUID: ddee9026-f2ff-49aa-881a-e60d9bb00e06

Niet iets waar je als gebruiker mee geconfronteerd wil worden. Het is te vergelijken met het Burgerservicenummer (BSN). Het is een administratienummer wat zeer bruikbaar is als koppelvlak tussen verschillende systemen, maar niet geschikt om even over te typen om een object in een tabel te zoeken.

PostgreSQL wordt tijdens installatie aangepast zodat het zelf GUID's  kan genereren:

--Enable UUID generation
CREATE EXTENSION "uuid-ossp"
  SCHEMA public VERSION "1.0";

De GUID wordt bij ieder object opgenomen als het attribuut guid van het type UUID.
In heel DEMO is er maar één (abstracte) tabel nodig waar de guid als identificerend attribuut is opgenomen.

--DROP TABLE public.object;
CREATE TABLE public.object (
  object_pk serial PRIMARY KEY,
  naamruimte varchar,
  guid UUID,
  objectbegintijd timestamp DEFAULT CURRENT_TIMESTAMP,
  objecteindtijd timestamp,
  tijdstipregistratie timestamp DEFAULT CURRENT_TIMESTAMP,
  eindregistratie timestamp,
  inonderzoek boolean
) WITH ( OIDS=FALSE );

Deze tabel wordt geërfd door ieder andere objectentabel in DEMO (hierover later meer). Daarmee heeft ieder object meteen ook minimaal bovenstaande set van attributen.
De GUID wordt gegenereerd met INSERT TRIGGERs die op alle objectentabellen in het schema public zijn gelegd. Bij aanmaak van een nieuw object wordt de GUID gelijktijdig in een tabel public.oidx geregistreerd. Hiermee is altijd te achterhalen wat voor type object bij een gegeven GUID hoort. Ter illustratie hieronder een stukje van een INSERT TRIGGER functie op de objecttabel public.oppervlaktewaterlichaam:

CREATE OR REPLACE FUNCTION public.oppervlaktewaterlichaam_insert()
RETURNS trigger AS
  $BODY$
    BEGIN
      ..
      NEW.guid = (SELECT uuid_generate_v4());
      ..
      INSERT INTO public.oidx VALUES(DEFAULT, NEW.guid, TG_TABLE_NAME);
      RETURN NEW;
    END;
  $BODY$ LANGUAGE plpgsql SECURITY DEFINER;

Eindgebruikers hebben niet veel met GUID's op, maar dat is ook niet de bedoeling. Het zijn administratieve gegevens die door het systeem automatisch gegenereerd en afgehandeld worden.
Ze zijn er.. En ze zijn er om systemen te laten samenwerken.

Geen opmerkingen:

Een reactie posten