Was ist der effizienteste Weg, Messungen zu speichern, mit einer variablen Anzahl von Feldern in einer Datenbank?

StackOverflow https://stackoverflow.com/questions/1629458

  •  06-07-2019
  •  | 
  •  

Frage

Wir haben ein Datenerfassungssystem, das Messungen von Umgebungssensoren erfasst, die Geschwindigkeit des Wassers zu messen, durch einen Fluss oder einen Kanal fließt. Jede Messung erzeugt eine feste Anzahl von Werten (z Datum, Zeit, Temperatur, Druck etc.) sowie eine Liste der Geschwindigkeitswerte.
Ursprünglich waren die Sensoren drei Geschwindigkeitswerte zugeführt, so habe ich einfach jeden Wert in einer eigenen Spalte einer Tabelle in einer Firebird-Datenbank gespeichert. Später Sensor wurden eingeführt, das könnte Ausgabe von bis zu neun Geschwindigkeitswerten so einfach ich sechs weitere Spalten hinzugefügt. Auch wenn die meisten Sensoren weniger als 9 Werte verwenden, rechnete ich, es wäre kein Problem, wenn die meisten der Spalten nur Nullen enthalten.
Aber jetzt bin vor ich eine neue Generation, die Ausgabe etwas von 1 bis 256 Werte, und ich nehme an, es wird nicht sehr effizient sein, weitere 247 Spalten hinzufügen, zumal die meisten Messungen werden nur noch 3 bis 9 Werte enthalten.
Da die Messungen alle 10 Minuten gesammelt werden, und die Datenbank enthält alle Daten für 30 bis 50 Sensoren die Gesamtmenge der Daten ist sehr bedeutsam nach ein paar Jahren, aber es muss möglich sein, Übersichten / Graphen für jede zufällige Zeitdauer zu erzeugen.

So was wäre der effizienteste Weg, um die variable Werteliste zu speichern?
Da jeder Datensatz seine eigene eindeutige ID hat, gehe ich davon aus ich nur alle Geschwindigkeitswerte in separaten Tabelle gespeichert werden können, jeder Wert mit ihm markiert ist Datensatz-ID. Ich habe nur das Gefühl, dass dies nicht sehr effizient sein würde und dass es nach einer Weile sehr langsam bekommen.

War es hilfreich?

Lösung

Datenbanken können große Mengen an Daten in einer Tabelle behandeln, wenn Sie effizienten Indizes verwenden. So können Sie diese Tabellenstruktur verwenden:

create table measurements (
     id,
     seq integer, -- between 1 and 256
     ts timestamp, -- Timestamp of the measurement
     value decimal(...)
)

Erstellen Sie einen Index auf id, id, seq und ts. Das ermöglicht es Ihnen, effizient durch die Daten zu suchen. Wenn Sie Ihre Datenbank misstrauen, nur ein paar Millionen Zeilen einfügen und ein paar wählt laufen, wie gut es Preise zu sehen.

Zum Vergleich: Ich habe eine Oracle-Datenbank hier mit 112 Millionen Zeilen und ich kann einen Datensatz von Zeitstempeln oder ID innerhalb 120ms (0.12s) wähle

Andere Tipps

Sie serialisierten Daten in einem Textfeld speichern könnte, zum Beispiel JSON-Codierung der Messungen wie:

[<velocity-value-1>, <velocity-value-2>, ...]

Dann in Ihrem Code deserialisiert die Werte nach abfragt.

Dies sollte gut funktionieren, wenn Sie nur Ihre Anfragen von den anderen Feldern filtern, und nicht durch die gespeicherten Werte. Wenn Sie durch die Werte filtern Sie, sie in WHERE Klauseln verwendet, wird ein Alptraum sein.

ich mit einem zweiten Tisch gehen würde:

table measurements (Id, DateTime, Temperature, Pressure)
table velocity (Id, MeasurementId, Sequence, Value)

Velocity.MeasurementId Referenzen Measurements.Id.
Velocity.Sequence ist der Index des Geschwindigkeitswertes für diese Messung (1-256).

Bestücken Sie

diese Tabellen mit Daten so nah an der realen Welt wie möglich und testen Sie die SQL-Anweisungen, die besten Indizes zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top