Partitonierte Tabelle und referentielle integrität

christofj

Fleissiger Benutzer
Beiträge
55
Hallo zusammen,

ich bin noch immer mit meiner DB für meine Sensoren und deren Messwerte beschäftigt.
Ich habe vor drei Tabellen zu erstellen.
Die Erste, Sensoren, sieht so aus:
Code:
=# CREATE TABLE sensoren(                                                                                                                 id_sensoren serial NOT NULL PRIMARY KEY,
sensor_typ varchar(45) NOT NULL,
ueberwachte_komponente varchar(45),
zusatzinformationen text);
Die Zweite, Referenz_Messwerte, sieht so aus:
Code:
# CREATE TABLE referenz_messwerte(        
id_referenz_messwert serial NOT NULL PRIMARY KEY,
messreihe_messpunkt numeric(10) NOT NULL,
messreihe_wert numeric(10,3),
verschleissteile_id_verschleissteil integer REFERENCES verschleissteil (id_verschleissteile));
Die Dritte, Gemessene_Messwerte, soll über ein Shellscript mit den gemessen Werten gefüllt werden und mit Hilfe des Zeitstempels partitioniert werden. Wie eine Partition in PG erstellt wird hat mir akretschmer schon gezeigt.
Jetzt möchte ich sicherstellen das die übermittelte Sensor_ID zu einer ID aus der ersten Tabelle Sensoren passt um dann mit dem richtigen Referenzwert vergleichen zu können.
Wenn ich jetzt versuche die dritte Tabelle zu erstellen gibt es eine Fehlermeldung.
Dritte Tabelle:
Code:
# CREATE TABLE gemessene_messwerte(
ts timestamp, 
id_gemessener_messwert serial NOT NULL, 
topic_messpunkt numeric(10) NOT NULL, 
topic_vorgangsnummer numeric(5), 
wert numeric(10,3), 
sensoren_id_sensor integer REFERENCES sensoren (id_sensoren)) partition by range(ts);


Fehlermeldung:
Code:
FEHLER:  Fremdschlüssel-Constraints auf partitionierten Tabellen werden nicht unterstützt
ZEILE 1: ...), wert numeric(10,3), sensoren_id_sensor integer REFERENCES...
Ist hier der TS als Primärschlüssel schon ausreichend?

Mein gedankliches Problem ist, das ich zweimal eine Sensor_ID in der DB habe. Einmal die aus der Tabelle Sensor und einmal in der Tabelle gemessene Werte. Kann ich diese zwei Sensor_IDs getrennt betrachten? Habe ich dann nicht das Problem der Redundanz? (In der Tabelle gemessene Werte kann ein Sensor beliebig oft vorkommen.)

Sicherstellen das die Sensor_ID des gemessenen Wertes zur ID der Referenzmesswerte passt, würde ich über eine weitere Tabelle mit Fremdschlüsselbeziehung zwischen der übermittelten Sensor_ID und der id_Referenz_messwert wenn, ich die Sensor_IDs getrennt betrachten darf.

Kann mir jemand meinen Knoten auflösen?

Gruß
 
Werbung:
FEHLER: Fremdschlüssel-Constraints auf partitionierten Tabellen werden nicht unterstützt

Korrekt, das ist leider eine der Limitierungen.

PostgreSQL: Documentation: 10: 5.10. Table Partitioning ,
5.10.2.3. Limitations

Zumindest der erste Punkt wird in 11 nicht mehr bestehen: Postgres 11 highlight - Indexes and Partitions (Alvaro ist einer meiner Kollegen),
ich hoffe, die anderen Limitationen fallen auch bald. In 11 wird es wohl auch Hash-Partitioning geben.

Du kannst im Select ja dennoch über das Feld joinen, Du hast halt nur nicht den Constraint.
 
Hallo nochmal,

ich habe jetzt meine Fremdschlüsselbeziehungen zwischen den Tabellen Sensoren und Referenz_messwerte in einer Zwischentabelle hergestellt. Die Partitionierte Tabelle gemessene Werte steht jetzt in keinerlei Beziehung zur restlichen DB und wird nur vom Shellscript gefüllt (wenn es erstellt ist).
Meine Abfragen kann ich dann trotzdem auf diese Tabelle beziehen?

Sorry für die vielleicht etwas blöde Frage aber meine DB-Kenntnisse aus der Schule sind schon ein paar Jahre her und nie wirklich zum Einsatz gekommen.
Danke schon mal vorab.
 
Das kann ich aktuell noch nicht genau beziffern da sich bei mir noch alles im Aufbau befindet.
In 2-3 Jahren kann es im schlechtesten (wenn ich alle Messwerte übertragen würde) 29900 Datensätze/sec. geben.
Ich denke aber schlauer ist, nur die von der vorherigen Messung abweichenden Werte zu übertragen. Damit reduzieren sich die Datensätze im besten Fall (keine Abweichungen) auf 29,9 Datensätze/sec.
 
PG kann das handeln. Wie lange ist das aufzuheben? Wenn Du immer komplette Partitions löschen kannst, ist das für die DB sehr angenehm.
 
Werbung:
PG kann das handeln. Wie lange ist das aufzuheben? Wenn Du immer komplette Partitions löschen kannst, ist das für die DB sehr angenehm.

Ich habe mir vorgestellt das ich nach einem Monat den Durchschnittswert von jedem Messpunkt eines jeden Sensors speichern will. Der Rest kann dann nach einem Monat weg. Somit gäbe es eine Aktuelle und eine Vormonatstabelle.
 
Zurück
Oben