Ik ga binnenkort beginnen met het bouwen van een nieuw software pakket waar een wens aan hangt om te kunnen zien wie wat wanneer heeft gewijzigd. Eigen een soort van auditing / versiebeheer van de data dus. Aangezien dit de eerste keer voor mij is dat ik iets dergelijks ga implementeren vraag ik me af wat de beste aanpak is.
Ik gebruik even hypothetisch voorbeeldje waar bijgehouden moet worden welke user een bepaald product aanpast en op welk tijdstip dit gebeurt.
Data ziet er dan als volgt uit:
Ik zie eigenlijk twee verschillende mogelijkheden om dit op te lossen in een RDBMS:
1) Records dupliceren en metadata toevoegen zoals user, en timestamp.
Om de huidige versie van het product op te halen kan je volstaan met een selectquery met een max(timestamp) in de where clause. Het komt er ook op neer dat je in principe nooit een update doet op de product tabel, maar alleen inserts. Het nadeel is wel dat je er veel data dupliceert. Elke wijziging resulteert in een nieuw record in de db, waardoor de data behoorlijk groeit. Aan de andere kant is diskspace goedkoop.
2) audit / change info opslaan in een aparte tabel.
Het nadeel van deze aanpak is dat wanneer kolomnamen of tabelnamen wijzigen je ook gelijk de audit tabel inhoudelijk moet gaan bewerken. Verder vind ik het wat minder transparant. Als je als devver in een tabel zit te kijken heb je niet direct het overzicht welke wijzigingen er allemaal zijn en lijkt met me dus een stuk lastiger om het geheel te debuggen.
Mijn voorkeur gaat in principe uit naar oplossing 1. Dit vind ik namelijk een stuk simpeler en duidelijker dan oplossing twee en minder bewerkelijk qua onderhoud omdat je nergens rekening mee hoeft te houden als je bijvoorbeeld een kolom dropped of een nieuwe maakt. Maar mogelijk mis ik nog een paar voordelen / nadelen van beide methodes of is er nog een andere manier om dit te implementeren.
Ik hoor graag ideeën en ervaringen over dit soort implementaties.
Ik gebruik even hypothetisch voorbeeldje waar bijgehouden moet worden welke user een bepaald product aanpast en op welk tijdstip dit gebeurt.
Product |
productNumber, (prim key) |
supplierId |
name |
price |
stock |
Data ziet er dan als volgt uit:
productNumber | supplierId | name | price | stock |
2348953 | 2 | Zwitsal babysalf | 2.99 | 13 |
Ik zie eigenlijk twee verschillende mogelijkheden om dit op te lossen in een RDBMS:
1) Records dupliceren en metadata toevoegen zoals user, en timestamp.
key | productNumber | supplierId | name | price | stock | userid | timestamp |
2 | 2348953 | 2 | Zwitsal babysalf | 1.99 | 13 | 633 | 2011-07-05 16:49:45 |
3 | 2348953 | 2 | Zwitsal babyzalf | 1.99 | 13 | 25 | 2011-07-05 16:51:29 |
Om de huidige versie van het product op te halen kan je volstaan met een selectquery met een max(timestamp) in de where clause. Het komt er ook op neer dat je in principe nooit een update doet op de product tabel, maar alleen inserts. Het nadeel is wel dat je er veel data dupliceert. Elke wijziging resulteert in een nieuw record in de db, waardoor de data behoorlijk groeit. Aan de andere kant is diskspace goedkoop.
2) audit / change info opslaan in een aparte tabel.
Audit |
id |
table |
column |
key |
previousValue |
userId |
timestamp |
id | table | column | key | previousValue | userid | timestamp |
1 | Product | price | 2348953 | 2.99 | 633 | 2011-07-05 16:49:45 |
1 | Product | name | 2348953 | Zwitsal babysalf | 25 | 2011-07-05 16:49:45 |
Het nadeel van deze aanpak is dat wanneer kolomnamen of tabelnamen wijzigen je ook gelijk de audit tabel inhoudelijk moet gaan bewerken. Verder vind ik het wat minder transparant. Als je als devver in een tabel zit te kijken heb je niet direct het overzicht welke wijzigingen er allemaal zijn en lijkt met me dus een stuk lastiger om het geheel te debuggen.
Mijn voorkeur gaat in principe uit naar oplossing 1. Dit vind ik namelijk een stuk simpeler en duidelijker dan oplossing twee en minder bewerkelijk qua onderhoud omdat je nergens rekening mee hoeft te houden als je bijvoorbeeld een kolom dropped of een nieuwe maakt. Maar mogelijk mis ik nog een paar voordelen / nadelen van beide methodes of is er nog een andere manier om dit te implementeren.
Ik hoor graag ideeën en ervaringen over dit soort implementaties.
The ships hung in the sky in much the same way that bricks don’t.