Ik heb op dit moment 22 tabellen in een administratieve relationele (genormaliseerde) database waarvan ik van elke tabel wil vastleggen wat er verandert, wie er iets verandert en wanneer dit gebeurt. Als ik echter kijk naar performance of normalisatie komen er nooit echt 'mooie' oplossingen dagen. Wat ik al had bedacht:
1) Ik zou twee tabellen kunnen maken, logs en logtypes. In logtypes sla ik de verschillende typen logs op, dit komt in de praktijk neer op de verschillende tabellen. Vervolgens wordt er bij elke mutatie een nieuw record aangemaakt in logs waarbij er wordt verwezen naar een logtype en een primary key van de betreffende tabel.
Voordelen:
- maar twee extra tabellen benodigd
- benadeelt performance andere tabellen niet
Nadelen:
- in de tabel logs zit een foreign key die niet echt een foreign key is; dus lelijk
- inhoud logs verschilt per tabel; geen consistentie
2) Ik kan de tabellen uitbreiden met een extra veld, revision_id. Ik hou dan in feite revisies van records bij, waarbij ik erg gemakkelijk terug in de geschiedenis kan om te zien hoe een record er twee weken geleden uitzag.
Voordelen:
- uniforme manier van logging
- biedt meer mogelijkheden dan gereduceerde logs
Nadelen:
- performancetechnisch een ramp
- veel opslagruimte benodigd voor een feature die niet ontzettend veel gebruikt gaat worden
3) Ik maak 22 nieuwe tabellen aan waarin alle records worden opgeslagen voordat ze worden gewijzigd.
Voordelen:
- uniforme manier van logging
- biedt meer mogelijkheden dan gereduceerde logs
- performance verschilt niet van het oorspronkelijke design
- opslagruimte is te beperken door de scheiding van tabellen
Nadelen:
- het aantal tabellen wordt verdubbeld
Wat ik niet heb behandeld is een lagere vorm van logging; ik zou bijvoorbeeld alle SQL-statements (INSERT, UPDATE, DELETE) kunnen loggen in een apart bestand, tezamen met een tijdstip en de persoon die de wijziging uitvoert. Ik wil het echter op databaseniveau houden, zodat men simpel in het administratieprogramma de logs van een bepaald record kan opvragen.
Graag lees ik jullie voorstellen voor oplossingen voor dit obstakel
1) Ik zou twee tabellen kunnen maken, logs en logtypes. In logtypes sla ik de verschillende typen logs op, dit komt in de praktijk neer op de verschillende tabellen. Vervolgens wordt er bij elke mutatie een nieuw record aangemaakt in logs waarbij er wordt verwezen naar een logtype en een primary key van de betreffende tabel.
Voordelen:
- maar twee extra tabellen benodigd
- benadeelt performance andere tabellen niet
Nadelen:
- in de tabel logs zit een foreign key die niet echt een foreign key is; dus lelijk
- inhoud logs verschilt per tabel; geen consistentie
2) Ik kan de tabellen uitbreiden met een extra veld, revision_id. Ik hou dan in feite revisies van records bij, waarbij ik erg gemakkelijk terug in de geschiedenis kan om te zien hoe een record er twee weken geleden uitzag.
Voordelen:
- uniforme manier van logging
- biedt meer mogelijkheden dan gereduceerde logs
Nadelen:
- performancetechnisch een ramp
- veel opslagruimte benodigd voor een feature die niet ontzettend veel gebruikt gaat worden
3) Ik maak 22 nieuwe tabellen aan waarin alle records worden opgeslagen voordat ze worden gewijzigd.
Voordelen:
- uniforme manier van logging
- biedt meer mogelijkheden dan gereduceerde logs
- performance verschilt niet van het oorspronkelijke design
- opslagruimte is te beperken door de scheiding van tabellen
Nadelen:
- het aantal tabellen wordt verdubbeld
Wat ik niet heb behandeld is een lagere vorm van logging; ik zou bijvoorbeeld alle SQL-statements (INSERT, UPDATE, DELETE) kunnen loggen in een apart bestand, tezamen met een tijdstip en de persoon die de wijziging uitvoert. Ik wil het echter op databaseniveau houden, zodat men simpel in het administratieprogramma de logs van een bepaald record kan opvragen.
Graag lees ik jullie voorstellen voor oplossingen voor dit obstakel