PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Messwerte für grafische Darstellung speichern in ein SQL Datenbank



Ritchie
02.02.2013, 08:58
Hallo Zusammen,

ich möchte Messwerte (zyklisch erfasste Daten) in einer SQL Datenbank (mySQL) abspeichern. Hierbei sollten die Daten idealerweise in komprimierter Weise gespeichert werden und später für die Darstellung in einem Trenddiagramm bereit stehen. (Min. Sekundentakt).

Die Software wird unter kUbuntu und Verwendung von QT4.7 und C++ erstellt.

Ich dachte hierbei an der Verwendung eines BLOB Field, wobei ich hier noch Problem (gedankliche) in der internen Verarbeitung habe:

- Die Messwerte sollten mit Zeitstempel abgelegt werden
- Jeder Messwert muss seiner Messquelle (Tagname) zugeordnet werden können
- Es sollten/werden Stützwerte (wenn der Messwert sich länger nicht ändert) im festen Zeitraster abgelegt
- Das Beschreiben der Daten erfolgt in einem seperaten Thread, welcher die Daten zyklisch ablegt
- Das Auslesen sollte zeitgleich möglich sein, bis zu den zuletzt abgelegt Daten.

Das ganze sollte zeitlich so schnell wie möglich sein. Hat jemand eine Idee, wie ich das Zwischenspeichern von Werten
machen könnte, wenn die SQL Datenbank nicht erreichbar ist.

Gruss R.

TheDarkRose
02.02.2013, 10:54
Ich würde dir MongoDB empfehlen. Eignet sich für sowas viel besser, besonders wenn man die Daten nachträglich auswerten will. Mit Map/Reduce geht das dann super.

schorsch_76
02.02.2013, 17:24
Ich schreib zum Beispiel meine PV Anlagendaten in eine SQL Tabelle (PostgreSQL) . Um den Speicherplatz brauchst du dir nicht viele Gedanken machen. 4 Jahre (2 min Takt) sind bei mir grade mal ca 12 MB im unkomprimierten SQL Textformat. Gezippt sinds dann nur 3 MB.
SQL ist dafür da dir die richtigen Datentypen zu liefern. Du brauchst nicht in einem Blob rumhantieren wenn du Spannungen/Ströme etc aufnehmen willst. Die Kompimierung macht der DB Server für dich.

Eien Tabelle wie du sie möchtest würde ich wie folgt anlegen:
date_time (DATE_TIME)
tag (VARCHAR)
messwert(REAL)

Ein SQL Server kann die konkurrierenden Aufrufe handhaben. Das ist seine Aufgabe ;)

Eine Abfrage wäre dann etwa so:


SELECT messwert FROM datatable
WHERE DATE(date_time)='2013-02-01'
ORDER BY date_time;


Einfügen:


INSERT INTO datatable
(date,messwert,tag) VALUES(NOW(),12345,"was weis ich");


Kuck dir die die Tutorials zu SQL im Netz an.

Bsp.
http://www.mysqltutorial.org/
http://dev.mysql.com/doc/refman/5.1/de/tutorial.html

Gruß
Georg

Ritchie
02.02.2013, 18:32
Hallo Georg,

im Prinzip wäre mir das auch lieber so, da ich in diesem Fall mir keine Gedanken für die Daten machen muss.

Ich werde das so dann mal ausprobieren und schaue mir dann die Datengröße an.

SQL ist mir eigentlich schon bekannt, da ich bereits eine SQL Datenbank für ein Meldesystem (Alarme/Events) im Einsatz habe. Nur bei historischen Trenddaten können andere Ansätze besser sein. So kenne ich z.B. eine Lösung von Siemens (PMQ) für historische Trenddaten und hier sind die Datenbanken gleich mehrer MB gross nach einem Tag.

@TheDarkRose
Ich hab mir kurz die Wiki von MongoDB angesehen. Ich kannte diese Datenbank bis dato nicht.
Derzeit weiss ich nicht ob mein SQL Server (externer Rechner im Netzwerk, QNAP NAS Server) diese Art der Datenbank unterstützt. Ebenso weiss ich nicht, wie eine Anbindung dieser Datenbank für meine Zwecke möglich ist. Das sind derzeit zuviele "ich weiss nicht", daher schaue ich mir erst mal den MySQL nochmals genauer an. Schliesslich soll es ja auch so einfach wie möglich sein. Bei einem "normalem SQL Server sind mir die Strukturen kein Geheimnis, bei einem OO-DB bin ich absoluter Anfänger.

Gruss R.

TheDarkRose
02.02.2013, 19:06
MongoDB ist keine OO-DB. Die ist dokumentenorientiert. Datensätze werden als JSON Doc abgespeichert. Ganz fein, vor allem ist es schemalos. Mit der Größe hast du etwas recht. Habe dies bei meinen aktuellen Projekt im Einsatz zur Auswertung vom Messdaten im Zählerschrank. ~1Mil Datensätze kommen auf ~200MB. Dafür ist die DB sehr schnell und mit Map/Reduce kannst du beliebige Auswertungen fahren, die mit SQL niemals möglich wären.
Für C++ gibt es einen schönen OO-Connector, genauso wie für PHP.