MariaDB - Messwerte in der Zwischentabelle auswerten (Grundlagen)

christofj

Fleissiger Benutzer
Beiträge
55
Hallo zusammen,

ich brauche mal eure Hilfe bezüglich der Auswertung von Messwerten.
Bis jetzt habe ich ein DB-Schema erstellt mit dem Messwerte von Sensoren abgespeichert werden, Tabelle "gemessene Werte".
Dann gibt es eine Tabelle "Sensoren" und eine Tabelle "Referenzmesswerte".
Die Tabelle "gemessene Werte" hat diesen Aufbau: id_gemessener_wert (Prim Key), messpunkt, gemessener_wert, sensor_id, zeitstempel.
Die Tabelle "Sensoren" beinhaltet die id_sensor (Prim Key), sensor_typ, sensor_standort.
Die Tabelle "Referenzmesswerte" hat die Spalten: id_ref_messwert (Prim Key), messpunkt, referenz_wert, min_wert, max_wert.

Nun ist es so, es gibt mehrere Sensoren die sich auf einen Referenzmesswert beziehen. Da die Sensoren mehrere Messpunkte aufnehmen hat jeder Sensor mehrere Referenzmesswerte. Daher habe ich gedacht es handelt sich um eine n--m Beziehung. Hier bin ich mir unsicher und überlege ob es sinnvoller ist einen zusammengesetzten Prim Key aus id und Messpunkt zu erstellen um eine 1-n Beziehung zu erhalten.

Am ende will ich folgendes auswerten: Der neue gemessene Wert aus der Tabelle "gemessene Werte" soll mit dem Referenzmesswert verglichen werden. Ist gemessener_wert = ref_messwert, ist gemessener_wert ›= min_wert, ist gemessener_wert ‹=max_wert. Dafür habe ich mir gedacht drei neue Spalten in der Zwischentabelle (bei der n--m Beziehung) zu erstellen und dort nur binäre Zustände der Auswertung festzuhalten und diese abzufragen (ist der gemessene Wert ok wird eine 1 gespeichert sonnst wird eine 0 gespeichert).
Oder ist es besser die Auswertung in die Tabelle "gemessene Werte" mit zu integrieren?

Ich hoffe meine Ausführungen sind soweit Verständlich.

Danke im Voraus.

Gruß,
Christof
 
Werbung:
Dafür habe ich mir gedacht drei neue Spalten in der Zwischentabelle (bei der n--m Beziehung) zu erstellen und dort nur binäre Zustände der Auswertung festzuhalten und diese abzufragen (ist der gemessene Wert ok wird eine 1 gespeichert sonnst wird eine 0 gespeichert).
Oder ist es besser die Auswertung in die Tabelle "gemessene Werte" mit zu integrieren?

Wenn ich Dich richtig verstehe willst Du Redundant Daten speichern, was ein Fehler ist.
 
Hallo,

nein ich will eigentlich nur das Ergebnis des Vergleiches speichern und später auswerten.
Mein erstes Verständnisproblem ist, wie ich die Verbindung zwischen den Referenzwerten, den Sensoren und den gemessenen Werten hinbekomme.
Ich habe Referenzmesswerte. Diese stehen mit mehreren Sensoren (Sensor_IDs) in Beziehung. Bei den gemessenen Werten will ich die Spalten sensor_id und messpunkt auslesen um erst mal zu wissen welcher Referenzwert zu diesem Sensor passt.
So denke ich mir das zurecht, das kann aber auch großer Misst sein. Ich befinde mich hier irgendwie in einer Sackgasse.

Gruß
 
Das ist jetzt nicht ganz identisch zu deinem, aber oll zeigen, was ich meine.

Ich habe:

Code:
test=*# create table sensoren(id_sensor int primary key, sensor_typ text);
CREATE TABLE
test=*# create table referenz(id_ref int primary key, messpunkt int, min_max numrange);
CREATE TABLE
test=*# create table werte (id_wert int primary key, messpunkt int, wert numeric, sensor_id int references sensoren, ts timestamp default now());
CREATE TABLE

Und werte:

Code:
test=*# insert into sensoren values (1, 'sensor typ 1');
INSERT 0 1
test=*# insert into sensoren values (2, 'sensor typ 1');
INSERT 0 1
test=*# insert into referenz values (1, 1, '[10,20)');
INSERT 0 1
test=*# insert into referenz values (2, 3, '[40,50)');
INSERT 0 1
test=*# insert into referenz values (3, 2, '[40,50)');
INSERT 0 1
test=*# commit;
COMMIT

Das kann ich nun abfragen:

Code:
test=*# select * from werte left join referenz on werte.messpunkt = referenz.messpunkt;
 id_wert | messpunkt | wert | sensor_id |  ts  | id_ref | messpunkt | min_max
---------+-----------+------+-----------+----------------------------+--------+-----------+---------
  1 |  1 |  12 |  1 | 2018-02-21 11:31:42.274243 |  1 |  1 | [10,20)
  2 |  2 |  12 |  1 | 2018-02-21 11:32:13.706172 |  3 |  2 | [40,50)
(2 Zeilen)

test=*# select *, case when referenz.min_max @> werte.wert then true else false end wert_ok from werte left join referenz on werte.messpunkt = referenz.messpunkt;
 id_wert | messpunkt | wert | sensor_id |  ts  | id_ref | messpunkt | min_max | wert_ok
---------+-----------+------+-----------+----------------------------+--------+-----------+---------+---------
  1 |  1 |  12 |  1 | 2018-02-21 11:31:42.274243 |  1 |  1 | [10,20) | t
  2 |  2 |  12 |  1 | 2018-02-21 11:32:13.706172 |  3 |  2 | [40,50) | f
(2 Zeilen)

test=*#

Es besteht keine Notwendigkeit, irgendwo zu speichern, ob der Meßwert innerhalb der Referenzbereiche liegt. Das läßt sich abfragen. Wenn Du es speicherst, ist es doppelt. Wenn sich Daten ändern, führt das ganz schnell zu Inkonsistenzen. Das will man eher selten.
 
ok, wenn ich dein Bsp. richtig verstehe hast du die Beziehung zwischen der "gesendeten" Sensor_ID und der ID_Sensoren hergestellt.
Wie wird jetzt sichergestellt dass, der richtige Referenzwert für die Abfrage benutzt wird? Das ist mir noch nicht klar.
Bei mir ist es so dass, ich sicher sein muss das ich mit dem richtigen Referenzwert vergleiche.
Es gibt bei mir mehrere Messstrecken mit z. B. dem Messpunkt 3.
 
Wie wird jetzt sichergestellt dass, der richtige Referenzwert für die Abfrage benutzt wird? Das ist mir noch nicht klar.

Dazu brauchst eine Verknüpfung zwischen der Sensor-ID bw. Messpunkt und den dafür gültigen Referenzwerten. So ganz sicher, ob ich Dein Modell komplett verstanden habe, bin ich mir nicht. Mir ging es aber primär erst einmal darum, Redundanzen zu vermeiden.
 
Danke dir,

ich habe nicht gewusst das ich die Auswertung über die Abfrage regeln kann.
Die Verknüpfung mach ich dann in einer neuen Tabelle?
 
Ja, wenn ich das richtig sehe, hast Du Messpunkte. Diese kannst Du als weitere Tabelle definieren und via Foreign Keys darauf referenzieren.
 
Ja richtig, ich habe Messpunkte. Diese ergeben dann eine Messstrecke. Messstrecken gibt es bei mir viele verschiedene die wiederum aus Messpunkten bestehen.
 
Hallo noch mal,

das ist jetzt ein neues Problem aber es bezieht sich auf die weiter oben beschriebene Tabelle "gemessene Werte". Diese hatte ich auf den Zeitstempel partitioniert (jeden Monat eine neue Partition). Jetzt wollte ich einen Fremdschlüssel von der "gesendeten" Sensor_ID auf die ID_Sensor von der Sensoren Tabelle anlegen. Ähnlich den bsp. von akretschmer weiter oben im Text.

Dabei gibt es diese Fehlermeldung:

ERROR 1506 (HY000): Foreign key clause is not yet supported in conjunction with partitioning

Bei der Erstellung der Tabelle habe ich ENGINE=InnoDB DEAULT CHARSET=latin1; gesetzt. Kann das etwas damit zu tun haben?
 
Werbung:
:) darauf habe ich jetzt irgendwie gewartet.
Also doch das gute alte Jens Hartwig Buch raus geholt und durch die Installation kämpfen.
Das ist keine Kitik an PG, das ist eher meinen Fähigkeiten geschuldet.

Danke für die Unterstützung.
 
Zurück
Oben