Voor een administratie applicatie ben ik bezig met het database design voor een nieuwe versie, de oude is ooit 5 jaar geleden gebouwd in Azie op basis van een vaag obscuur home-made framework wat echt gewoon _te slecht_ is om nog te kunnen blijven gebruiken. Daarnaast is het database design ook wel aan wat upgrades toe, dus is er besloten om opnieuw te gaan bouwen.
In grote lijnen is het wel duidelijk hoe we de data willen gaan structureren, maar er is nog een stukje waar ik mee zit.
In de oude situatie worden de gegevens van personen opgeslagen in twee tabellen 'persons' en 'person_details'. De eerste tabel bevat eigenlijk alle belangrijke informatie (naw, email, bankgegevens, ww, etc) en de tweede tabel is een koppeltabel waarin een hoop secundaire informatie staat over de persoon. Met name dingen als 'is het een cursist j/n', 'is het een docent j/n', 'wat is het uurtarief als docent', etc etc.
Het eerste wat ik eigenlijk al nooit aan deze setup heb begrepen is waarom er uberhaupt een tweede tabel is aangezien IEDERE persoon ALTIJD een record moet hebben in deze gekoppelde tabel, waarom niet al die informatie gewoon in één en dezelfde tabel zou je zeggen. Maargoed, het is nou eenmaal zo...
Maargoed, mijn twijfelstuk is nu of ik uberhaupt ruimte wil reserveren voor die secundaire data in de personen tabel. De informatie in kwestie komt op het totaal gezien misschien maar bij 1% van de records ook echt in beeld. Ik zit er bijvoorbeeld aan te denken om een 'datafields' tabel te maken waarin in een kolom of 4 maak waarin de extra data voor een persoon (en evt ook andere dingen) geplaatst kunnen worden die gewoon niet vaak voorkomen.
De setup voor deze tabel zou dan zijn:
{“type”:”varchar”,”name”:”photo”,”content”:”upload/images/persons/10.jpg”}
{“type”:”boolean”,”name”:”is_tutor”,”content”:”1”}
{“type”:”date”,”name”:”is_tutor_since”,”content”:”2012-09-01”}
De controller die de data oproept bij het datafields model krijgt object terug waarin de data is geparsed naar een werkbaar formaat. Het idee is dus dat op deze manier er niet overbodig ruimte gereserveerd wordt in de database, nu kan het bijvoorbeeld zijn dat bij persoon_a men nog 10 additionele objecten terugkrijgt uit de datafields, bij persoon_b misschien zelfs 0 en bij persoon_c weer 4, etc.
Dus, de overweging is:
1. Gewoon een tabel met daarin alle informatie die bij een persoon hoort, een situatie waarbij een GROOT deel van de velden in 99% van de gevallen dus eigenlijk _NIET_ gebruikt gaat worden.
2. Een tabel met daarin de meest relevante data voor een persoon en een tweede tabel waarin de extra alleen worden opgeslagen indien ze nodig zijn.
Thoughts?
Edit: NB: Het gaat dus enkel om secudaire data eigenlijk. Geen data waarop personen gezocht worden of waar superveel mee gewerkt wordt in de eerste lijn. Maar data waarmee rapportages worden samengesteld, betaalbestanden, etc.
In grote lijnen is het wel duidelijk hoe we de data willen gaan structureren, maar er is nog een stukje waar ik mee zit.
In de oude situatie worden de gegevens van personen opgeslagen in twee tabellen 'persons' en 'person_details'. De eerste tabel bevat eigenlijk alle belangrijke informatie (naw, email, bankgegevens, ww, etc) en de tweede tabel is een koppeltabel waarin een hoop secundaire informatie staat over de persoon. Met name dingen als 'is het een cursist j/n', 'is het een docent j/n', 'wat is het uurtarief als docent', etc etc.
Het eerste wat ik eigenlijk al nooit aan deze setup heb begrepen is waarom er uberhaupt een tweede tabel is aangezien IEDERE persoon ALTIJD een record moet hebben in deze gekoppelde tabel, waarom niet al die informatie gewoon in één en dezelfde tabel zou je zeggen. Maargoed, het is nou eenmaal zo...
Maargoed, mijn twijfelstuk is nu of ik uberhaupt ruimte wil reserveren voor die secundaire data in de personen tabel. De informatie in kwestie komt op het totaal gezien misschien maar bij 1% van de records ook echt in beeld. Ik zit er bijvoorbeeld aan te denken om een 'datafields' tabel te maken waarin in een kolom of 4 maak waarin de extra data voor een persoon (en evt ook andere dingen) geplaatst kunnen worden die gewoon niet vaak voorkomen.
De setup voor deze tabel zou dan zijn:
- datafield_id (primary key)
- foreign_id (uniek icm foreign_table)
- foreign_table (uniek icm foreign_id)
- data
{“type”:”varchar”,”name”:”photo”,”content”:”upload/images/persons/10.jpg”}
{“type”:”boolean”,”name”:”is_tutor”,”content”:”1”}
{“type”:”date”,”name”:”is_tutor_since”,”content”:”2012-09-01”}
De controller die de data oproept bij het datafields model krijgt object terug waarin de data is geparsed naar een werkbaar formaat. Het idee is dus dat op deze manier er niet overbodig ruimte gereserveerd wordt in de database, nu kan het bijvoorbeeld zijn dat bij persoon_a men nog 10 additionele objecten terugkrijgt uit de datafields, bij persoon_b misschien zelfs 0 en bij persoon_c weer 4, etc.
Dus, de overweging is:
1. Gewoon een tabel met daarin alle informatie die bij een persoon hoort, een situatie waarbij een GROOT deel van de velden in 99% van de gevallen dus eigenlijk _NIET_ gebruikt gaat worden.
2. Een tabel met daarin de meest relevante data voor een persoon en een tweede tabel waarin de extra alleen worden opgeslagen indien ze nodig zijn.
Thoughts?
Edit: NB: Het gaat dus enkel om secudaire data eigenlijk. Geen data waarop personen gezocht worden of waar superveel mee gewerkt wordt in de eerste lijn. Maar data waarmee rapportages worden samengesteld, betaalbestanden, etc.
[ Voor 3% gewijzigd door Spooksel op 15-02-2015 21:44 ]
Bevalt mijn schrijfsel je niet? www.korrelatie.nl