4 Stimmen

Wie kann man in SQL eine Tabelle abfragen, deren Name in einer anderen Tabelle gespeichert ist?

Die Situation stellt sich wie folgt dar:

Ich habe Zehntausende von Sensoren (sagen wir 100.000). Jeder Sensor erzeugt regelmäßig oder unregelmäßig zeitlich festgelegte Werte in Form von (timestamp, value) . Die Schrittweite kann weniger als 1 Sekunde betragen, so dass im Laufe eines Jahres Millionen von Ereignissen stattfinden können. (timestamp, value) Paare für einen bestimmten Sensor und bilden eine Zeitreihe pro Sensor. Ein Benutzer kann die Werte für einen bestimmten Zeitraum anfordern (from, to) für eine solche Zeitreihe von Sensoren.

Die Speicherung aller Werte in einer Tabelle ( sensor_id, timestamp, value) wird die Tabelle mit buchstäblich Milliarden von Werten/Zeilen pro Monat gefüllt. Dies überfordert herkömmliche Open-Source-Datenbanksysteme (MySQL, PostgreSQL).

Ich denke daran, eine Tabelle pro Sensorzeitreihe zu erstellen (timestamp, value) und referenziere dies in meiner Sensortabelle (sensor_id, sensor_name, sensor_table_name) . Es wird also 100.000 Tabellen mit jeweils einigen Millionen Zeilen geben.

Kann ich die Werte direkt mit der Option sensor_table_name Spalte in meinem Sensor direkt oder muss ich zwei Abfragen durchführen, eine, um die sensor_table_name und eine, um die Werte aus dieser Tabelle zu erhalten?

3voto

Henrique Ordine Punkte 3177

Wenn Sie eine Konvention für die Sensortabellennamen verwenden, müssen Sie keine Abfrage durchführen, um herauszufinden, welche Tabelle für einen bestimmten Sensor abgefragt werden soll.

Wenn Ihre Sensor-ID z. B. Wolverine967 lautet und Ihre Konvention für die Namen dieser Tabellen Sensor_ + Sensor-ID ist, dann wissen Sie sofort, dass Sie die Tabelle Sensor_Wolverine967 abfragen können.

2voto

kgrittn Punkte 16937

Eine bessere Lösung für Sie als die dynamische Generierung von SQL-Anweisungen mit einem Namen, der dem Sensor entspricht, wäre die Verwendung von Tabellenaufteilung . Wenn Sie jedoch nicht vorhaben, Milliarden von Messwerten pro Jahr für immer aufzubewahren (ohne sie zusammenzufassen), sollten Sie sie nach Datumsbereich partitionieren, um die Datenbereinigung zu erleichtern.

Dies ist wahrscheinlich leistungsfähiger als die fliegende Generierung von SQL-Anweisungen und sollte einfacher zu verwalten sein.

0voto

piokuc Punkte 24184

Wenn Sie eine normale relationale Datenbank verwenden, müssen Sie dafür leider zwei Abfragen durchführen: eine, um den Namen der Sensortabelle zu ermitteln, und eine, um die Werte aus dieser Tabelle abzurufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X