MongoDB

MongoDB ist die führende Open-Source, Document Datenbank die für einfache Entwicklung und Skalierung aber auch für Big Data Szenarien entwickelt wurde.

MongoDB Patterns: Das Bucket-Pattern

Marc-David Militz
Expert
Diesmal betrachten wir das "Bucket-Pattern". Bucket bedeutet übersetzt Eimer und kommt, als Begriff, auch bei Cloud Speicherdiensten von Amazon und Alibaba Cloud vor. Das "Bucket-Pattern" eignet sich vor allem sehr gut für den Einsatz in IoT-Szenarien, Echtzeit-Analytics-Anwendungen und generell für Daten mit Zeitserien.

  • Das Bucket-Pattern

    • Wenn wir einen Datenstrom über einen bestimmten Zeitraum (time series) haben, z.B. Temperaturmessungen eines Sensors, werden wir geneigt sein jede einzelne Messung in ein eigenes Dokument zu speichern. Das ist aber ein sehr "relationaler" Ansatz für den Umgang mit den Daten. Die Daten unseres Temperatursensors würden dabei folgendermaßen aussehen.
      {
      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.

      • Beispiel Use Cases

        • Ein Beispiel, wie man dieses Pattern auf Daten mit Zeitserien gewinnbringend einsetzen kann, stammt von einer MongoDB IoT Implementierung von Bosch. Dort nutzt man solche Daten für eine App aus dem Automotive-Bereich. Die App sammelt Daten von einer Vielzahl von Sensoren in einem Fahrzeug und ermöglicht damit eine verbesserte Diagnostik des Fahrzeugs und seiner Komponenten.

          Weitere Beispiele gibt es im Bankensektor, die das Pattern in Finanzapplikationen nutzen um Transaktionen zu gruppieren.

          • Zusammenfassung

            • Für die Verarbeitung und Speicherung von Daten mit Zeitserien ist das "Bucket-Pattern" eine großartige Option. Es reduziert die Anzahl der Dokumente in einer Collection, verbessert die Index-Performance und wenn man die Möglichkeit der Voraggregation nutzt vereinfacht es den Datenzugriff.

              Wer mehr über das Schema Design in MongoDB erfahren möchte, dem sei der Qualiero Kurs für Datenbank Entwickler empfohlen https://www.qualiero.com/lerninhalte/classroom-trainings/mongodb-datenbank-entwickler-kurs.html

Latest member activities

Recommend this community post