by Marc-David Militz
Forum: MongoDB Theorie
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:00:00.000Z"),
temperature: 40
}
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:01:00.000Z"),
temperature: 40
}
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:02:00.000Z"),
temperature: 41
}
Über einen längeren Zeitraum könnten wir auf diese Weise in Probleme laufen, vor allem was die Daten- und Indexgrößen angeht. Ein Index auf die Felder "sensor_id" und "timestamp" würde z.B. einen schnellen Datenzugriff erlauben, aber auf Kosten des vorhandenen RAM. Indem wir die Dokumentstruktur anpassen können wir diese Informationen, anhand der Zeit, in einen "Bucket" stecken. Dieses Dokument hält dann die Daten für einen bestimmten Zeitraum parat. Zusätzlich können wir diese Buckets mit Zusatzinformationen anreichern.
Indem wir das "Bucket-Pattern" auf unser Datenmodell anwenden erzielen wir Einsparungen was Indexgröße, potentiell einfache Abfragen und die Möglichkeit von Voraggregationen betrifft. Für unsere Beispieldaten könnte das Ergebnis dann so aussehen.
{
sensor_id: 12345,
start_date: ISODate("2019-01-31T10:00:00.000Z"),
end_date: ISODate("2019-01-31T10:59:59.000Z"),
measurements: [
{
timestamp: ISODate("2019-01-31T10:00:00.000Z"),
temperature: 40
},
{
timestamp: ISODate("2019-01-31T10:01:00.000Z"),
temperature: 40
},
…
{
timestamp: ISODate("2019-01-31T10:42:00.000Z"),
temperature: 42
}
],
transaction_count: 42,
sum_temperature: 2413
}
Die Daten wurden in diesem Beispiel in einem einstündigen Bucket zusammengefaßt. Dieser Bucket bietet auch noch die Möglichkeit weitere Werte aufzunehmen. Mit jedem hinzugefügten Wert, werden die Maßeinheiten "transaction_count" und "sum_temperature" erhöht, so daß hier bereits eine laufende Voraggregation auf Stundenebene erfolgt.
Berechnungen wie z.B. die Durchschnittliche Temperatur während einer Stunde können damit direkt auf den aggregierten Werten (sum_temperature / transaction_count) gemacht werden, ohne auf die Rohdaten zurückgreifen zu müssen. Bei der Arbeit mit Zeitserien ist es meist interessant und wichtig wie z.B. die Durchschnittstemperatur zwischen 15 Uhr und 15 Uhr, in Nürnberg am 13. Juli 2018 war. Danach geht man dann auf eine kleinere Ebene herunter und nimmt z.B. die Temperatur um 14:03 Uhr. Durch das Bucketing und die laufende Voraggregation wird es weitaus einfacher diese Informationen zu liefern.
Ein weiterer Zusatznutzen ist, daß es einfacher und effektiver wird Daten zu archivieren. Wie oft müssen wir wohl auf die Temperaturen in Nürnberg aus dem Jahre 1999 zugreifen? Man kann diese Daten sehr einfach, mit dem jeweiligen Bucket, in ein Archiv verschieben, was für die Applikation von Vorteil sein kann.