Bij enkele projecten op mijn werk hebben we situaties waarbij we de geschiedenis van relaties tussen bepaalde objecten willen vastleggen.
Een voorbeeld:
- klasse Account (een account)
- klasse Sim (een simkaart)
- Gekoppeld aan elkaar middels een koppeltabel accountsimhistory.
De koppeltabel heeft een samengestelde sleutel:

Om het niet onnodig ingewikkeld te maken heb ik even de rest van de attributen van beide klassen achterwege gelaten. Ook de (overbodige) attributen van de koppeltabel heb ik weggelaten.
UIteraard zijn er ook constraints:
Ik ben dus bezig om de constraints door de database te laten afdwingen.
Het lijkt me (misschien zie ik iets over het hoofd) dat ik dit niet met standaard row-level of column-level constraints kan afdwingen. Immers een sim kan best meerdere keren voorkomen in de tabel, een account kan meerdere keren voorkomen in de tabel en de huidige primary key beschermt niet tegen meerdere relaties die 'tegelijkertijd' bestaan.
Ik heb een trigger gemaakt die voor een insert of een update kijkt of de actie zal leiden tot inconsistentie, en als dat zo is, de actie tegenhoudt. Een delete kan ik negeren, aangezien deze niet voor overlappingen kan zorgen.
De trigger is behoorlijk 'groot' geworden: andere behandeling voor een insert/update. Onderscheid tussen 'open' en 'gesloten' relaties. Controle op overlap voor account. Controle voor overlap voor sim.
Ik heb van te voren het een ander opgezocht en kwam onder andere stukken tegen over zogenaamde 'temporal databases' maar dat is een net iets andere insteek.
Ik kwam dit document tegen http://www.dcs.warwick.ac.../TemporalData.Warwick.pdf en daarin geven ze aan dat het erg lastig is en het gedeelte dat over constraints gaat komt bij mij niet duidelijk over.
De vraag
Ik vroeg me af of ik niet het wiel opnieuw zat uit te vinden en of hier geen andere (standaard) oplossingen voor zijn.
Een voorbeeld:
- klasse Account (een account)
- klasse Sim (een simkaart)
- Gekoppeld aan elkaar middels een koppeltabel accountsimhistory.
De koppeltabel heeft een samengestelde sleutel:
- De FK naar account
- De FK naar sim
- De starttijd
- Een sim hoort bij een bepaalde klant tot de klant hem niet meer hoeft; er is dus een start en een stop. Per definitie: als stop == null, dan geldt de relatie nog.
- Een sim kan hergebruikt worden. Bijvoorbeeld bij dezelfde klant, maar ook bij andere klanten.

Om het niet onnodig ingewikkeld te maken heb ik even de rest van de attributen van beide klassen achterwege gelaten. Ook de (overbodige) attributen van de koppeltabel heb ik weggelaten.
UIteraard zijn er ook constraints:
- een sim kan niet tegelijkertijd in gebruik zijn door meerdere accounts
- een account kan geen meerdere sims tegelijkertijd hebben
Ik ben dus bezig om de constraints door de database te laten afdwingen.
Het lijkt me (misschien zie ik iets over het hoofd) dat ik dit niet met standaard row-level of column-level constraints kan afdwingen. Immers een sim kan best meerdere keren voorkomen in de tabel, een account kan meerdere keren voorkomen in de tabel en de huidige primary key beschermt niet tegen meerdere relaties die 'tegelijkertijd' bestaan.
Ik heb een trigger gemaakt die voor een insert of een update kijkt of de actie zal leiden tot inconsistentie, en als dat zo is, de actie tegenhoudt. Een delete kan ik negeren, aangezien deze niet voor overlappingen kan zorgen.
De trigger is behoorlijk 'groot' geworden: andere behandeling voor een insert/update. Onderscheid tussen 'open' en 'gesloten' relaties. Controle op overlap voor account. Controle voor overlap voor sim.
Ik heb van te voren het een ander opgezocht en kwam onder andere stukken tegen over zogenaamde 'temporal databases' maar dat is een net iets andere insteek.
Ik kwam dit document tegen http://www.dcs.warwick.ac.../TemporalData.Warwick.pdf en daarin geven ze aan dat het erg lastig is en het gedeelte dat over constraints gaat komt bij mij niet duidelijk over.
De vraag
Ik vroeg me af of ik niet het wiel opnieuw zat uit te vinden en of hier geen andere (standaard) oplossingen voor zijn.