Schemadesign für Zeitachsendaten

Auf dieser Seite werden Schemadesignmuster zum Speichern von Zeitachsendaten in Bigtable erläutert. Diese Seite baut auf der Erstellung eines Schemas auf. Es wird davon ausgegangen, dass Sie mit den auf dieser Seite beschriebenen Konzepten und Empfehlungen vertraut sind.

Eine Zeitachse ist eine Sammlung von Daten, die aus Messungen und den Zeitpunkten der Aufzeichnung der Messungen besteht. Beispiele für Zeitachsen

  • Grafische Darstellung der Speichernutzung auf Ihrem Computer
  • Temperaturen über einen gewissen Zeitraum in einer Nachrichtensendung
  • Börsenkurse über einen bestimmten Zeitraum

Ein gutes Schemadesign führt zu exzellenter Leistung sowie Skalierbarkeit und ein schlechtes Schemadesign kann zu einem System mit schwacher Leistung führen. Es gibt jedoch kein einzelnes Schemadesign, das für alle Anwendungsfälle am besten geeignet ist.

Die auf dieser Seite beschriebenen Muster bieten einen Ausgangspunkt. Ihr eindeutiges Dataset und die Abfragen, die Sie verwenden möchten, sind die wichtigsten Aspekte, die Sie bei der Entwicklung eines Schemas für Ihre Zeitachsendaten berücksichtigen sollten.

Die grundlegenden Designmuster zum Speichern von Zeitachsendaten in Bigtable sind:

Daten für Beispiele

Zur Veranschaulichung der Unterschiede zwischen Mustern, gehen die Beispiele auf dieser Seite davon aus, dass Sie Daten für eine Anwendung speichern, die die Messwerte aufzeichnet, die von Wetterballonen einmal pro Minute gemessen werden. Als Ereignis wird eine einzelne Anfrage bezeichnet, die eine oder mehrere Zellen gleichzeitig schreibt. Die Standort-IDs entsprechen Google Cloud-Regionen.

Messung Beispiel
  1. Zeitstempel auf dieser Seite haben das Format "tJJJJ-MM-TT-HHMM", damit sie besser lesbar sind. In einer Produktionstabelle werden Zeitstempel in der Regel als Anzahl der Mikrosekunden seit 1970-01-0100:00:00 UTC ausgedrückt, z. B. "1616264288050807".
Druck (Pascal) 94587
Temperatur (Celsius) 9,5
Feuchtigkeit (Prozent) 65
Höhe (Meter) 601
Zugehörige Daten Beispiel
Ballon-ID 3698
Standort asia-southeast1
Zeitstempel1 t2021-03-05-1204

Zeit-Buckets

In einem Muster für einen Zeit-Bucket entspricht jede Zeile in der Tabelle einem "Bucket" der Zeit, z. B. einer Stunde, einem Tag oder einem Monat. Ein Zeilenschlüssel enthält eine Kennzeichnung ohne Zeitstempel, z. B. week49, für den in der Zeile aufgezeichneten Zeitraum, sowie andere kennzeichnende Daten.

Die Größe des von Ihnen verwendeten Buckets, z. B. Minute, Stunde oder Tag, hängt von den Abfragen ab, die Sie verwenden möchten, und von den Größenlimits der Bigtable-Daten. Beispiel: Wenn Zeilen, die Daten von einer Stunde enthalten, die empfohlene maximale Zeilengröße von 100 MB überschreiten, dann sind Zeilen, die eine halbe Stunde oder eine Minute darstellen, wahrscheinlich eine bessere Wahl.

Vorteile von Mustern für Zeit-Buckets:

  • Sie erhalten eine bessere Leistung. Wenn Sie beispielsweise 100 Messungen speichern, schreibt und liest Bigtable diese Messungen schneller, wenn sie sich in einer Zeile und nicht in 100 Zeilen befinden.

  • Auf diese Weise gespeicherte Daten werden effizienter komprimiert als Daten in großen, schmalen Tabellen.

Nachteile sind:

  • Schemadesignmuster für Zeit-Buckets sind komplizierter als Muster mit einem Zeitstempel. Ihre Entwicklung kann mehr Zeit und Mühe beanspruchen.

Neue Spalten für neue Ereignisse hinzufügen

In diesem Zeit-Bucket-Muster schreiben Sie eine neue Spalte für jedes Ereignis in eine Zeile. Dabei werden die Daten im Spaltenqualifizierer und nicht als Zellenwert gespeichert. Das bedeutet, dass Sie für jede Zelle die Spaltenfamilie, den Spaltenqualifizierer und den Zeitstempel, aber keinen Wert senden.

Wenn Sie dieses Muster für die Beispieldaten des Wetterballons verwenden, enthält jede Zeile alle Messungen für einen einzelnen Messwert, z. B. pressure, für einen einzelnen Wetterballon im Laufe einer Woche. Jeder Zeilenschlüssel enthält den Standort, die Ballon-ID, den Messwert, den Sie in der Zeile erfassen, und eine Wochennummer. Jedes Mal, wenn ein Ballon seine Daten für einen Messwert meldet, fügen Sie der Zeile eine neue Spalte hinzu. Der Spaltenqualifizierer enthält die Messung, den Druck in Pascal, für die durch den Zellenzeitstempel identifizierte Minute.

In diesem Beispiel könnte eine Zeile nach drei Minuten so aussehen:

Zeilenschlüssel 94558 94122 95992
us-west2#3698#pressure#week1 (t2021-03-05-1200) "" (t2021-03-05-1201) "" (t2021-03-05-1202)

Anwendungsfälle für dieses Muster:

Neue Zellen für neue Ereignisse hinzufügen

In diesem Zeit-Bucket-Muster fügen Sie vorhandenen Spalten neue Zellen hinzu, wenn Sie ein neues Ereignis schreiben. Mit diesem Muster nutzen Sie die Fähigkeit von Bigtable, mehrere Zellen mit Zeitstempel in einer bestimmten Zeile und Spalte zu speichern. Bei diesem Muster ist es wichtig, die Regeln für die automatische Speicherbereinigung festzulegen.

Im Beispiel werden die Daten des Wetterballons verwendet, wobei jede Zeile alle Messungen eines einzelnen Wetterballon im Verlauf einer Woche enthält. Das Zeilenschlüsselpräfix ist eine Kennzeichnung für die Woche. Sie können also die Daten der ganzen Woche für mehrere Ballons mit einer einzigen Abfrage lesen. Die anderen Zeilenschlüsselsegmente sind der Standort, an dem der Ballon operiert, und die ID-Nummer des Ballons. Die Tabelle enthält eine Spaltenfamilie measurements und diese Spaltenfamilie hat eine Spalte für jeden Messtyp: pressure, temperature, humidity und altitude.

Jedes Mal, wenn ein Ballon seine Messungen sendet, schreibt die Anwendung neue Werte in die Zeile, die die Daten der aktuellen Woche für den Ballon enthält, und schreibt zusätzliche Zellen mit Zeitstempel in jede Spalte. Am Ende der Woche hat jede Spalte in jeder Zeile eine Messung für jede Minute der Woche oder 10.080 Zellen, sofern die Richtlinie für die automatische Speicherbereinigung dies zulässt.

Jede Spalte in jeder Zeile enthält eine Messung für jede Minute der Woche. In diesem Fall können die ersten beiden Spalten einer Zeile nach drei Minuten so aussehen:

Zeilenschlüssel Druck Temperatur
asia-south2#3698#week1 94558 (t2021-03-05-1200) 9,5 (t2021-03-05-1200)
94122 (t2021-03-05-1201) 9,4 (t2021-03-05-1201)
95992 (t2021-03-05-1202) 9,2 (t2021-03-05-1202)

Anwendungsfälle für dieses Muster:

  • Sie möchten Änderungen an Messungen über einen gewissen Zeitraum erfassen.

Zeilen mit einem Zeitstempel

Bei diesem Muster erstellen Sie eine Zeile für jedes neue Ereignis oder jede neue Messung, anstatt Zellen zu Spalten in vorhandenen Zeilen hinzuzufügen. Das Suffix für den Zeilenschlüssel ist der Zeitstempelwert. Tabellen, die diesem Muster folgen, sind in der Regel hoch und schmal und jede Spalte in einer Zeile enthält nur eine Zelle.

Einzelner serialisierter Zeitstempel

Bei diesem Muster speichern Sie alle Daten für eine Zeile in einer einzelnen Spalte in einem serialisierten Format, z. B. einem Protokollpuffer (protobuf). Dieser Ansatz wird unter Schema entwerfen ausführlicher beschrieben.

Wenn Sie dieses Muster zum Speichern der Daten des Wetterballons verwenden, könnte Ihre Tabelle beispielsweise nach vier Minuten so aussehen:

Zeilenschlüssel measurements_blob
us-west2#3698#2021-03-05-1200 protobuf_1
us-west2#3698#2021-03-05-1201 protobuf_2
us-west2#3698#2021-03-05-1202 protobuf_3
us-west2#3698#2021-03-05-1203 protobuf_4

Vorteile dieses Musters sind:

  • Speichereffizienz

  • Geschwindigkeit

Nachteile sind:

  • Unmöglichkeit, beim Lesen der Daten nur bestimmte Spalten abzurufen

  • Notwendigkeit, die Daten nach dem Lesen zu deserialisieren

Anwendungsfälle für dieses Muster:

  • Sie sind sich nicht sicher, wie Sie die Daten abfragen oder Ihre Abfragen sind unterschiedlich.

  • Notwendigkeit, Kosten niedrig zu halten überwiegt die Notwendigkeit, Daten vor dem Abrufen aus Bigtable zu filtern.

  • Jedes Ereignis enthält so viele Messungen, dass Sie das Limit von 100 MB pro Zeile überschreiten, wenn Sie die Daten in mehreren Spalten speichern.

Einzelner nicht serialisierter Zeitstempel

Bei diesem Muster speichern Sie jedes Ereignis in einer eigenen Zeile, auch wenn Sie nur eine Messung aufzeichnen. Die Daten in den Spalten sind nicht serialisiert.

Vorteile dieses Musters sind:

  • Das Muster ist im Allgemeinen einfacher zu implementieren als ein Zeit-Bucket-Muster.

  • Es nimmt weniger Zeit in Anspruch, das Schema zu optimieren, bevor Sie es verwenden.

Nachteile dieses Musters überwiegen häufig die Vorteile:

  • Bigtable ist mit diesem Muster weniger leistungsstark.

  • Auf diese Weise gespeicherte Daten sind nicht so effizient komprimiert wie Daten in breiteren Spalten.

  • Selbst wenn sich der Zeitstempel am Ende des Zeilenschlüssels befindet, kann dieses Muster zu Hotspots führen.

Anwendungsfälle für dieses Muster:

  • Sie möchten immer alle Spalten abrufen, jedoch nur einen bestimmten Bereich von Zeitstempeln. Sie haben außerdem einen Grund, die Daten nicht in einer serialisierten Struktur zu speichern.

  • Sie möchten eine unbegrenzte Anzahl von Ereignissen speichern.

Bei den Beispieldaten für den Wetterballon sind die Spaltenfamilie und die Spaltenqualifizierer identisch mit dem Beispiel für das Verwenden von Zeit-Buckets und neuen Zellen. Bei diesem Muster werden jedoch alle erfassten Messungen für jeden Wetterballon in eine neue Zeile geschrieben. Die folgende Tabelle zeigt fünf Zeilen, die nach diesem Muster geschrieben werden:

Zeilenschlüssel Druck Temperatur Feuchtigkeit Höhe
us-west2#3698#2021-03-05-1200 94558 9,6 61 612
us-west2#3698#2021-03-05-1201 94122 9,7 62 611
us-west2#3698#2021-03-05-1202 95992 9,5 58 602
us-west2#3698#2021-03-05-1203 96025 9,5 66 598
us-west2#3698#2021-03-05-1204 96021 9,6 63 624

Zusätzliche Strategien

Wenn Sie mehrere verschiedene Abfragen für dasselbe Dataset senden müssen, sollten Sie Ihre Daten in mehreren Tabellen mit jeweils einem Zeilenschlüssel speichern.

In einigen Fällen können Sie Muster auch kombinieren. Sie können beispielsweise serialisierte Daten in Zeilen speichern, die Zeit-Buckets darstellen, solange Sie nicht zulassen, dass die Zeilen zu groß werden.

Nächste Schritte