Logsysteem
Ik denk dan aan het loggen van elk record wat 'geupdate', 'gedelete' of 'geinsert' wordt.
Dit kan handig zijn om eventuele fouten in het systeem maar ook fouten door gebruikers te kunnen achterhalen.
Is het haalbaar (qua performance) en zinvol om een logsysteem voor een webapplicatie in PHP/MYSQL op te zetten ?
Toevoeging op 09/06/2015 14:25:41:
Aan ieder record wat wordt gelogd wordt dan een gebruiker_id / timestamp / actie (update, delete, insert) toegevoegd. Hierdoor zal de log-tabel snel in omvang toenemen.
Mysql's eigen log?
Daarnaast verdubbelt het aantal queries.
Moeilijk om te zeggen wat dat voor de performance betekent, maar wat vaak wordt gedaan, is die metadata in de tabel zelf opslaan. Voeg bijvoorbeeld een created_on met een TIMESTAMP plus een created_by met een user-ID toe en je kunt daarmee zien wanneer en door wie dat record werd toegevoegd.
Voor een DELETE doe je iets vergelijkbaars: je delete een record niet echt, maar zet een flag om voor "deze is verwijderd". Alleen registreren wie wanneer de DELETE heeft uitgevoerd, is namelijk vaak ontoereikend als je vervolgens echt data kwijt bent. Dan weet je eigenlijk nog niet wat er is gebeurd: mocht die data wel weg?
Bij een UPDATE hangt het tot slot vooral af van hoe belangrijk mutaties en historische gegevens zijn. Als iemand bijvoorbeeld een adres wijzigt, zou je ervoor kunnen kiezen om gewoon een nieuw record toe te voegen, zodat je het oude adres achter de hand hebt.
kan je niet de data in 2 tabellen inserten en in een tabel daar van alle updates en deletes uitvoeren?
INSERT INTO users (naam) VALUES ('fabian');
UPDATE users SET naam = 'jan' WHERE naam = 'fabian';
UPDATE users SET naam = 'piet' WHERE naam = 'jan';
op die manier weet je dus hooguit nog dat user Piet ooit Fabian heette, maar dat hij ook kort Jan heette, kun je niet meer achterhalen...
@Ward: Jouw oplossing zou kunnen, maar dan weet ik alleen of het record gewijzigd is, maar niet precies welk(e) veld(en) er is(zijn) gewijzigd.
Mijn logsysteem-idee is misschien een beetje lomp, maar als het qua performance amper iets uit maakt en de diskruimte is er gewoon! Who cares ?
N.B. Het log-bestand moet zo af-en-toe wel worden opgeschoond anders groeit het uit zijn voegen. Eens per maand opschonen en naar een backup schrijven.
Toevoeging op 09/06/2015 18:08:50:
Even nalezen: https://dev.mysql.com/doc/refman/5.1/en/server-logs.html
Gewijzigd op 09/06/2015 18:15:25 door Paco de Wulp
- tabelnaam
- kolomnaam
- timestamp
- oude waarde
- nieuwe waarde
Zo kun je precies terugvinden welke kolom in welke tabel wanneer werd gewijzigd. Het is relationeel niet okay, maar het geeft je wel een goed beeld van wat zich afspeelt in de database.
Ik heb dit model één keer gebruikt voor een CRM-systeem. Daarin werkt het op zich goed: je kunt zien wanneer bijvoorbeeld een telefoonnummer werd gewijzigd en wat het vorige telefoonnummer was. Zo registreert het elke wijziging — en af en toe betrapt het gebruikers daarmee ook op een leugen of een halve waarheid (want daarom was het te doen).
Ruimere en belangrijkere vraag is eigenlijk niet wát je logt, maar vooral wáárom je iets logt.
Ach, ik weet nog niet of ik het daadwerkelijk ga implementeren, want zoals je zegt het moet inderdaad wel een goede reden hebben om het te doen.
De oplossing hangt natuurlijk ook af van wat je precies met deze logging wilt bereiken en wat je ermee wilt kunnen doen...
kan je niet elke verandering naar je zelf toe mailen ofzo dan kan je het in je database schoon houden en een speciaal email adres maken voor alleen de "updates" die mensen uitvoeren. als er heel veel veranderd wordt is het alleen niet ideaal :P
Aan wat voor fouten door gebruikers denk jij dan? Kan een gebruiker rechtstreeks in jouw database? Dat lijkt me niet, dus op welke manier verwacht je dan dat hij/zij fouten kan maken?
Ik zou dan eerder denken aan het loggen van handelingen. Bijv. Pietje heeft 9 juni 2015 om 21.30 artikel X uit de database verwijderd. Als dan vervolgens de directeur van het bedrijf bij jou aan de telefoon hangt omdat ie z'n artikel mist, kun jij zeggen dat Pietje dat verwijderd heeft. Op die manier kun je met een bepaald doel loggen. Je logt dan bijv. handelingen van de afgelopen 2 weken en alles wat ouder is, wis je weer. Op die manier loopt je database ook niet vol. Ik zou dan vooral 'kritische' handelingen loggen, bijv. het verwijderen of aanpassen van een record. Maar bijv. het aan- of uitzetten van een bepaalde onbelangrijke setting zou ik dan weer niet loggen.
Gewijzigd op 10/06/2015 03:20:10 door Ozzie PHP