Voor een eigen projectje ben ik bezig met een database model voor een applicatie waarbij er zowel bepaalde periodes opgeslagen worden als specifieke gebeurtenissen.
Omdat het zoeken door de database voornamelijk op datum / periode zal gaan zal de 'events' table als kern gebruikt wordt om locaties, personen etc aan te koppelen. Het uitgangspunt is daarom ook om altijd maar 1 query te hebben voor het ophalen van gebeurtenissen in een periode/op een datum en vervolgens alle gekoppelde data daarbij los te querien.
Bij het schetsen van use-cases tegen allerlei verschillende mogelijkheden aan en vroeg me af hoe jullie met bepaalde problemen om zouden gaan of welke oplossingen jullie zouden kiezen.
1) Stel ik wil opslaan dat Einstein geleefd heeft van 14 maart 1879 tot 18 april 1955 zou ik ervoor kunnen kiezen om dit als 1 record in de database te zetten als een 'event' met een start- en einddatum
Probleem hiervan is als ik hier ook plaatsen aan zou willen koppelen, zou het moeilijk zijn om specifiek aan te geven waar hij geboren is en waar hij overleden is. Ook voelt het opslaan van een enkele gebeurtenis (dus geen periode) binnen dit datamodel niet lekker omdat je dan eigenlijk geen echte start of einddatum hebt. Dus de record voor de release van Portal 2 zou als volgt in de database komen te staan:
Voordeel is dat je een eenduidige manier hebt om zowel perioden als losse gebeurtenissen op te slaan, al is dat laatste dan enigszins een hack.
2) Je zou ervoor kunnen kiezen om het leven van Einstein op te slaan als 2 records, namelijk zijn geboortedatum en de datum waarop hij stierf. Echter is het enige verband tussen deze 2 records dat het gerelateerd is aan Einstein ... in het voorbeeld van Einstein is het enigszins logisch dat de laatste datum zijn sterfdatum is, maar voor iemand die nog leeft zou dit een andere betekenis kunnen hebben.
Een oplossing hiervoor zou kunnen zijn om een bepaald type aan een datum (bijv: geboorte, overlijden, huldiging, ontdekking, scheiding, trouwen) mee te geven maar dit brengt meteen het probleem mee dat er aan een event ook meerdere personen gekoppeld kunnen zijn.
3) Het los definieren van periodes en events die gekoppeld zijn aan die periodes.
Het nadeel hiervan is dat niet ieder event gekoppeld is aan een periode en dit of in de code of in de query afgevangen moet worden, wat niet echt een probleem is maar wat wel zwaarder is door extra condities en joins.
Ik geloof niet dat hier een holy-grail oplossing voor is die voor iedere mogelijke use-case zal werken die zal werken zonder complexere queries. Wel ben ik benieuwd welke aanpak anderen zouden hanteren en waarom.
Omdat het zoeken door de database voornamelijk op datum / periode zal gaan zal de 'events' table als kern gebruikt wordt om locaties, personen etc aan te koppelen. Het uitgangspunt is daarom ook om altijd maar 1 query te hebben voor het ophalen van gebeurtenissen in een periode/op een datum en vervolgens alle gekoppelde data daarbij los te querien.
Bij het schetsen van use-cases tegen allerlei verschillende mogelijkheden aan en vroeg me af hoe jullie met bepaalde problemen om zouden gaan of welke oplossingen jullie zouden kiezen.
1) Stel ik wil opslaan dat Einstein geleefd heeft van 14 maart 1879 tot 18 april 1955 zou ik ervoor kunnen kiezen om dit als 1 record in de database te zetten als een 'event' met een start- en einddatum
lomschrijving | startdate | enddate |
leven einstein | 1879-3-14 | 1955-04-18 |
Probleem hiervan is als ik hier ook plaatsen aan zou willen koppelen, zou het moeilijk zijn om specifiek aan te geven waar hij geboren is en waar hij overleden is. Ook voelt het opslaan van een enkele gebeurtenis (dus geen periode) binnen dit datamodel niet lekker omdat je dan eigenlijk geen echte start of einddatum hebt. Dus de record voor de release van Portal 2 zou als volgt in de database komen te staan:
lomschrijving | startdate | enddate |
Portal 2 release | 2011-04-01 | null |
Voordeel is dat je een eenduidige manier hebt om zowel perioden als losse gebeurtenissen op te slaan, al is dat laatste dan enigszins een hack.
2) Je zou ervoor kunnen kiezen om het leven van Einstein op te slaan als 2 records, namelijk zijn geboortedatum en de datum waarop hij stierf. Echter is het enige verband tussen deze 2 records dat het gerelateerd is aan Einstein ... in het voorbeeld van Einstein is het enigszins logisch dat de laatste datum zijn sterfdatum is, maar voor iemand die nog leeft zou dit een andere betekenis kunnen hebben.
Een oplossing hiervoor zou kunnen zijn om een bepaald type aan een datum (bijv: geboorte, overlijden, huldiging, ontdekking, scheiding, trouwen) mee te geven maar dit brengt meteen het probleem mee dat er aan een event ook meerdere personen gekoppeld kunnen zijn.
3) Het los definieren van periodes en events die gekoppeld zijn aan die periodes.
periode_id | periodenaam | startdate | enddate |
event_id | periode_id | eventtitle | eventdate |
Het nadeel hiervan is dat niet ieder event gekoppeld is aan een periode en dit of in de code of in de query afgevangen moet worden, wat niet echt een probleem is maar wat wel zwaarder is door extra condities en joins.
Ik geloof niet dat hier een holy-grail oplossing voor is die voor iedere mogelijke use-case zal werken die zal werken zonder complexere queries. Wel ben ik benieuwd welke aanpak anderen zouden hanteren en waarom.
I feel like i've been taking crazy pills