Van een bepaald stukje apparatuur verzamelen wij (binaire) eventlogs om een historie van de apparaten bij te houden, de staat te controleren en voor diagnose bij eventuele problemen. Nu willen we dit gaan automatiseren en de logs gaan archiveren in een database, maar loop ik een beetje vast bij het tabelontwerp voor deze logs.
De binaire structuur van een log entry is ongeveer als volgt:
Hierbij kan het aantal niveau's van unions soms 2 of 3 zijn. In totaal kom ik op ongeveer 200 velden.
De hoeveelheid nieuwe data is naar verwachting iets van 12000 nieuwe records per dag. De logbestanden zullen worden aangeboden aan de software en die plaatst deze in de database. Momenteel is er alleen een viewer voor de binaire bestanden die alle kolommen gewoon achter elkaar plaatst en met een dropdown menu de gebruiker de keuze geeft welke koppen hij wil zien, dit werkt in de praktijk prima.
Om het geheel doorzoekbaar te houden is id,timestamp,logtype,data absoluut niet wenselijk. Meerdere tabellen voor verschillende types is ook niet echt wenselijk omdat het belangrijk is om een bepaald tijdsraam van de volledige log te kunnen bekijken.
De enige mogelijkheden waar ik nog op uit kom is een tabel met een vaste set kolommen die andere betekenissen hebben bij verschillende logtypes maar dat lijkt me een nachtmerrie om te onderhouden. Dan is de volgende optie om een tabel te maken waarin gewoon alle kolommen bestaan en het grootste deel dus steeds NULL is, dit lijkt vooralsnog wel de beste optie.
Ik heb er ook al op zitten googlen maar er is weinig te vinden over het opslaan van dit soort data, alleen dat een grote hoeveelheid kolommen kennelijk niet zo'n probleem is.
Hebben mensen hier ervaring met de opslag van dit soort data of nog andere briljante suggesties die ik over het hoofd zie? Of nog tips om dit te optimaliseren om het geheel wel snel te houden?
DBMS is overigens MySQL (InnoDB). Mocht MSSQL erg grote voordelen opleveren bij dit soort data (alleen al in performance geloof ik dat graag) dan is switchen nu nog een optie.
De binaire structuur van een log entry is ongeveer als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| DWORD logid; DWORD timestamp; BYTE logtype; union { struct { ..velden voor logtype 1.. } struct { ..velden voor logtype 2.. } struct { ..velden voor logtype 3.. union { ..velden voor logtype 3a.. ..velden voor logtype 3b.. } } ..enz.. } |
Hierbij kan het aantal niveau's van unions soms 2 of 3 zijn. In totaal kom ik op ongeveer 200 velden.
De hoeveelheid nieuwe data is naar verwachting iets van 12000 nieuwe records per dag. De logbestanden zullen worden aangeboden aan de software en die plaatst deze in de database. Momenteel is er alleen een viewer voor de binaire bestanden die alle kolommen gewoon achter elkaar plaatst en met een dropdown menu de gebruiker de keuze geeft welke koppen hij wil zien, dit werkt in de praktijk prima.
Om het geheel doorzoekbaar te houden is id,timestamp,logtype,data absoluut niet wenselijk. Meerdere tabellen voor verschillende types is ook niet echt wenselijk omdat het belangrijk is om een bepaald tijdsraam van de volledige log te kunnen bekijken.
De enige mogelijkheden waar ik nog op uit kom is een tabel met een vaste set kolommen die andere betekenissen hebben bij verschillende logtypes maar dat lijkt me een nachtmerrie om te onderhouden. Dan is de volgende optie om een tabel te maken waarin gewoon alle kolommen bestaan en het grootste deel dus steeds NULL is, dit lijkt vooralsnog wel de beste optie.
Ik heb er ook al op zitten googlen maar er is weinig te vinden over het opslaan van dit soort data, alleen dat een grote hoeveelheid kolommen kennelijk niet zo'n probleem is.
Hebben mensen hier ervaring met de opslag van dit soort data of nog andere briljante suggesties die ik over het hoofd zie? Of nog tips om dit te optimaliseren om het geheel wel snel te houden?
DBMS is overigens MySQL (InnoDB). Mocht MSSQL erg grote voordelen opleveren bij dit soort data (alleen al in performance geloof ik dat graag) dan is switchen nu nog een optie.