Ga naar hoofdinhoud

Bitemporele tabellen

Dit is een uitwerking van een mogelijke variant van implementatie van bitemporaliteit in projecties.

Eerder hebben we elementen van bitemporele projecties uitgelegd; de temporaliteit in projecties, en de standaardoperaties die gebruikt kunnen worden bij het bijwerken van projecties. In dit hoofdstuk beschrijven we een implementatie van deze patronen: de bitemporele opslag in tabellen. Een (beperkte) voorbeeldimplementatie kun je terugvinden in Gitlab.

Bitemporele tabellen zijn één invulling van een projectiestore: de plek waar een projectie wordt opgeslagen. Een projectiestore kan ook payload-gebaseerd of hybride zijn (zie de varianten); bitemporele tabellen zijn een specifieke opslagvorm.

Bitemporaliteit in relationele tabellen​

Moet nog verder ingevuld worden.

Het schrijven naar bitemporele tabellen​

Het snapshot-projectiemechanisme implementeert het contract zoals beschreven in een voorgaand hoofdstuk. De toestand van een een entiteit wordt bewaard in één of meer bitemporele tabellen. Een reeks van projectie-elementen vormt de projectie van 1 entiteit: één element per toestand van de entiteit, waarbij een projectie-element uitgespreid is over één of meerdere tabellen. Elke schrijfoperatie uit het contract maakt gebruik van steeds elementairder wordende schrijfoperaties die uiteindelijk te reduceren zijn tot twee atomaire operaties: het toevoegen van een nieuwe rij en het updaten van de system until.

Het lezen van bitemporele tabellen​

De schrijfkant en de leeskant van bitemporele tabellen vinden elkaar bij de verzameling bitemporele rijen. De schrijfkant is een procedure – elke pijl links hieronder is een functie die de volgende aanroept. De leeskant is een predicaat – een query wordt beantwoord door één SQL-statement dat de join, het bitemporele filter en de voorwaarde van de vraag combineert.

Nu is het juist de kracht van bitemporele tabellen dat het je de kracht van SQL queries geeft om elk denkbare representatie van de gegevens te query'en. Hieronder zijn dan ook slechts enkele voorbeelden uitgewerkt.

De drie soorten query's zijn uiteindelijk drie vormen van selectie op één raster. Gegeven onderstaande 'tabel':

geldigheidstijd →
t0 t1 t2 t3
┌───────────┬───────────┬───────────┬───────────┐
onttrokken │ el1 │ el2 │ │ │ system_until gezet
state │ │ │ │ │
├───────────┼───────────┼───────────┼───────────┤
huidig geldige │ el1' │ el2' │ el3 │ el4 │ system_until is leeg
state │ │ │ │ │
└───────────┴───────────┴───────────┴───────────┘

Zou je per query de volgende antwoorden krijgen:

VraagBereik op het rasterAntwoord
readéén celel2'
readTimelinede open kolomel1', el2', el3, el4
findde open rij, alle entiteiten, gefilterd op C