Schema entwerfen

Diese Seite enthält Informationen zum Schemadesign von Cloud Bigtable. Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Übersicht über Bigtable vertraut machen. Die folgenden Themen werden auf dieser Seite behandelt:

  • Allgemeine Konzepte: Grundlegende Konzepte, die Sie beim Erstellen Ihres Schemas berücksichtigen sollten.
  • Best Practices: Gestaltungsrichtlinien, die für die meisten Anwendungsfälle gelten, aufgeschlüsselt nach Tabellenkomponente.
  • Spezielle Anwendungsfälle: Empfehlungen für bestimmte Anwendungsfälle und Datenmuster.

Allgemeine Konzepte

Der Entwurfsprozess für ein Schema von Bigtable unterscheidet sich vom Entwurfsprozess für ein Schema einer relationalen Datenbank. Ein Schema ist in Bigtable ein Entwurf oder ein Modell einer Tabelle, einschließlich der Struktur der folgenden Tabellenkomponenten:

  • Zeilenschlüssel
  • Spaltenfamilien, einschließlich ihrer Richtlinien für die automatische Speicherbereinigung
  • Spalten

Die folgenden allgemeinen Konzepte gelten für das Schemadesign von Bigtable:

  • Bigtable ist ein Schlüssel/Wert-Speicher, kein relationaler Speicher. Es unterstützt keine Joins und Transaktionen werden nur in einer einzelnen Zeile unterstützt.
  • Jede Tabelle verfügt nur über einen Index, den Zeilenschlüssel. Es gibt keinen Sekundärindex. Zeilenschlüssel dürfen jeweils nur einmal vorkommen.
  • Zeilen werden lexikografisch nach Zeilenschlüssel geordnet, vom kleinsten bis zum größten Bytestring. Zeilenschlüssel werden in Big-Endian-Bytereihenfolge sortiert. Dies wird manchmal auch als Netzwerk-Bytereihenfolge bezeichnet und ist das binäre Äquivalent der alphabetischen Reihenfolge.
  • Spaltenfamilien werden nicht in einer bestimmten Reihenfolge gespeichert.
  • Spalten werden nach Spaltenfamilien gruppiert und in lexikografischer Reihenfolge innerhalb der Spaltenfamilie sortiert. Beispiel: In einer Spaltenfamilie mit dem Namen SysMonitor mit Spaltenqualifizierer von ProcessName, User, %CPU, ID, Memory, DiskRead und Priority speichert Bigtable die Spalten in folgender Reihenfolge:
SysMonitor
%CPU DiskRead ID Speicher Priorität ProcessName Nutzer
  • Der Schnittpunkt einer Zeile und Spalte kann mehrere Zellen mit Zeitstempel enthalten. Jede Zelle enthält eine eindeutige Zeitstempelversion der Daten für diese Zeile und Spalte.
  • Alle Vorgänge sind auf Zeilenebene atomar. Das bedeutet, dass ein Vorgang entweder eine ganze Zeile oder keine der Zeilen betrifft.
  • Über die Zeilen der Tabelle hinweg sollten Lese- und Schreibvorgänge idealerweise gleichmäßig verteilt sein.

  • Bigtable-Tabellen sind "Sparse Tables". Eine Spalte belegt keinen Platz in einer Zeile, in der die Spalte nicht verwendet wird.

Best Practices

Ein gutes Schema führt zu exzellenter Leistung sowie Skalierbarkeit und ein schlechtes Schema kann zu einem System mit schwacher Leistung führen. Jeder Anwendungsfall ist anders und erfordert ein eigenes Design, für die meisten Anwendungsfälle gelten die folgenden Best Practices. Ausnahmen sind vermerkt.

In den folgenden Abschnitten werden, beginnend mit der Tabellenebene bis hinunter zur Ebene der Zeilenschlüssel, die Best Practices für den Schemaentwurf beschrieben:

Alle Tabellenelemente, insbesondere Zeilenschlüssel, sollten auf geplante Leseanfragen ausgelegt werden. Empfohlene und feste Größenlimits für alle Tabellenelemente finden Sie unter Kontingente und Limits.

Tabellen

Speichern Sie Datasets mit ähnlichen Schemas in derselben Tabelle und nicht in separaten Tabellen.

In anderen Datenbanksystemen entscheiden Sie sich möglicherweise, Daten basierend auf dem Thema und der Anzahl der Spalten in mehreren Tabellen zu speichern. In Bigtable ist es jedoch meist besser, alle Daten in einer großen Tabelle zu speichern. Sie können jedem Dataset ein eindeutiges Zeilenschlüsselpräfix zuweisen, sodass Bigtable die zugehörigen Daten in einem zusammenhängenden Bereich von Zeilen speichert, die Sie dann nach dem Präfix des Zeilenschlüssels abfragen können.

Bigtable ist auf maximal 1.000 Tabellen pro Instanz beschränkt. In den meisten Fällen sollten Sie jedoch weitaus weniger Tabellen haben. Von der Erstellung vieler kleiner Tabellen wird in Bigtable aus verschiedenen Gründen abgeraten:

  • Das Senden von Anfragen an viele verschiedene Tabellen kann den Aufwand der Back-End-Verbindung erhöhen, was zu einem Anstieg der Extremwert-Latenz führt.
  • Mehrere Tabellen in verschiedenen Größen können das Load-Balancing im Hintergrund stören, das für die Leistungsfähigkeit von Bigtable sorgt.

Es kann natürlich vorkommen, dass Sie eine separate Tabelle für einen völlig anderen Anwendungsfall brauchen, der ein völlig anderes Schema erfordert, aber Sie sollten keine separaten Tabellen für ähnliche Daten verwenden. Sie sollten beispielsweise keine neue Tabelle erstellen, weil ein neues Jahr begonnen hat oder Sie einen neuen Kunden haben.

Spaltenfamilien

Legen Sie für verwandte Spalten dieselbe Spaltenfamilie fest. Wenn eine Zeile mehrere Werte enthält, die einen Bezug zueinander haben, empfiehlt es sich, die Spalten mit diesen Werten in derselben Spaltenfamilie zu gruppieren. Gruppieren Sie Daten so nah wie möglich beieinander, damit Sie keine komplexen Filter entwerfen müssen und in Ihren häufigsten Leseanfragen genau die Informationen erhalten, die Sie benötigen, aber nicht mehr.

Sie können bis zu 100 Spaltenfamilien pro Tabelle erstellen. Wenn Sie mehr als 100 Spaltenfamilien erstellen, kann das die Leistung beeinträchtigen.

Wählen Sie kurze, aber aussagekräftige Namen für die Spaltenfamilien. Die Namen sind in den Daten enthalten, die bei jeder Anfrage übertragen werden.

Legen Sie für Spalten mit unterschiedlichen Datenaufbewahrungsanforderungen verschiedene Spaltenfamilien fest. Das ist wichtig, wenn Sie die Speicherkosten in Grenzen halten möchten. Richtlinien für die automatische Speicherbereinigung werden auf der Ebene der Spaltenfamilie und nicht auf Spaltenebene festgelegt. Wenn Sie beispielsweise nur die neueste Version eines bestimmten Datenelements behalten möchten, speichern Sie diese nicht in einer Spaltenfamilie, in der 1.000 Versionen eines anderes Element gespeichert werden sollen. Andernfalls bezahlen Sie für das Speichern von 999 Zellen an Daten, die Sie nicht benötigen.

Spalten

Behandeln Sie Spaltenqualifizierer als Daten. Da Sie für jede Spalte einen Spaltenqualifizierer speichern müssen, können Sie Platz sparen, indem Sie die Spalte mit einem Wert benennen. Nehmen wir als Beispiel eine Tabelle, die Daten über Freundschaften speichert, wobei jede Zeile eine Person und all ihre Freundschaften darstellt. Jeder Spaltenqualifizierer kann die ID eines Freundes sein. Der Wert für diese Spalte kann der soziale Kreis sein, in dem sich der Freund befindet. In diesem Beispiel könnten die Zeilen so aussehen:

Jose Fred:book-club Gabriel:work Hiroshi:tennis
Sofia Hiroshi:work Seo Yoon:school Jakob:chess-club

Vergleichen Sie dies mit einem Schema für dieselben Daten, das keine Spaltenqualifizierer als Daten verwendet:

Jose#1 Friend:Fred Circle:book-club
Jose#2 Friend:Gabriel Circle:work
Jose#3 Friend:Hiroshi Circle:tennis
Sofia#1 Friend:Hiroshi Circle:work
Sofia#2 Friend:Seo Yoon Circle:school
Sofia# Friend:Jakob Circle:chess-club

Das zweite Schemadesign führt dazu, dass die Tabelle schneller wächst.

Wenn Sie zum Speichern von Daten keine Spaltenqualifizierer verwenden und die Menge der bei jeder Anfrage übertragenen Daten reduzieren möchten, erteilen Sie den Spaltenqualifizierern kurze, aber aussagekräftige Namen. Die maximale Größe beträgt 16 KB.

Erstellen Sie in der Tabelle so viele Spalten wie nötig. Bigtable-Tabellen sind dünnbesetzt und es gibt keinen Speicherplatznachteil für eine Spalte, die nicht in einer Zeile verwendet wird. Sie können in einer Tabelle Millionen von Spalten angeben, solange keine Zeile das Limit von 256 MB pro Zeile überschreitet.

Vermeiden Sie zu viele Spalten in einer einzelnen Zeile. Obwohl eine Tabelle Millionen von Spalten enthalten kann, sollte das bei Zeilen nicht der Fall sein. Bei diesen Best Practices spielen mehrere Faktoren eine Rolle:

  • Bigtable benötigt Zeit für die Verarbeitung der einzelnen Zellen in einer Zeile.
  • Jede Zelle bedeutet eine zusätzliche Datenmenge, die in der Tabelle gespeichert und über das Netzwerk gesendet wird. Wenn Sie beispielsweise 1 KB (1.024 Byte) Daten speichern, ist es sehr viel platzsparender, diese Daten in einer einzelnen Zelle zu speichern als in 1.024 Zellen mit jeweils 1 Byte.

Wenn Ihr Dataset logisch mehrere Spalten pro Zeile benötigt, als Bigtable effizient verarbeiten kann, sollten Sie die Daten als protobuf in einer einzelnen Spalte speichern.

Zeilen

Speichern Sie nicht mehr als 100 MB Daten in einer einzelnen Zeile. Zeilen, die dieses Limit überschreiten, können zu einer geringeren Leseleistung führen.

Bewahren Sie alle Informationen für eine Entität in einer einzelnen Zeile auf. In den meisten Anwendungsfällen sollten Sie Daten, die Sie atomisch lesen müssen, oder alle gleichzeitig, in mehreren Zeilen speichern, um Inkonsistenzen zu vermeiden. Wenn Sie zum Beispiel zwei Zeilen in einer Tabelle aktualisieren, ist es möglich, dass eine Zeile erfolgreich aktualisiert wird und die andere nicht. Ihr Schema darf nicht mehr als eine Zeile gleichzeitig aktualisieren, damit ähnliche Daten korrekt sind. So ist dieser Teil der Daten nicht vorübergehend unvollständig, wenn ein Teil der Schreibanfrage fehlschlägt oder noch einmal gesendet werden muss.

Ausnahme: Wenn das Speichern einer Entität in einer einzelnen Zeile zu Zeilen mit einer Größe von mehreren MB führt, sollten Sie die Daten auf mehrere Zeilen aufteilen.

Speichern Sie verwandte Entitäten in benachbarten Zeilen, damit Lesevorgänge effizienter werden.

Zellen

Speichern Sie nicht mehr als 10 MB Daten in einer einzelnen Zelle. Denken Sie daran, dass eine Zelle die Daten umfasst, die für eine bestimmte Zeile und Spalte mit einem eindeutigen Zeitstempel gespeichert sind, und dass mehrere Zellen am Schnittpunkt dieser Zeile und Spalte gespeichert werden können. Die Anzahl der in einer Spalte gespeicherten Zellen unterliegt der Richtlinie für die automatische Speicherbereinigung, die Sie für die Spaltenfamilie festlegen.

Zeilenschlüssel

Entwerfen Sie den Zeilenschlüssel basierend auf den Abfragen, mit denen Sie die Daten abrufen. Speziell konzipierte Zeilenschlüssel ermöglichen die optimale Leistung von Bigtable. Die effizientesten Bigtable-Abfragen rufen Daten mit einer der folgenden Optionen ab:

  • Zeilenschlüssel
  • Zeilenschlüsselpräfix
  • Zeilenbereich, der durch den Start und das Ende der Zeilenschlüssel definiert wird

Andere Arten von Abfragen lösen einen Scan der gesamten Tabelle aus, was deutlich weniger effizient ist. Wenn Sie von vornherein den richtigen Zeilenschlüssel wählen, verhindern Sie, dass Sie später mühsam Daten migrieren müssen.

Begrenzen Sie die Größe des Zeilenschlüssels. Ein Zeilenschlüssel darf maximal 4 KB groß sein. Lange Zeilenschlüssel nehmen mehr Arbeits- und Festplattenspeicher in Anspruch und erhöhen die Antwortzeit des Bigtable-Servers.

Speichern Sie mehrere durch Trennzeichen getrennte Werte in den einzelnen Zeilenschlüsseln. Die effizienteste Methode zum effizienten Abfragen von Bigtable ist der Zeilenschlüssel. Daher ist es oft nützlich, mehrere Kennungen in Ihren Zeilenschlüssel aufzunehmen. Wenn Ihr Zeilenschlüssel mehrere Werte enthält, ist es besonders wichtig, ein klares Verständnis von der Verwendung der Daten zu haben.

Zeilenschlüsselsegmente werden normalerweise durch ein Trennzeichen getrennt, z. B. einen Doppelpunkt, einen Schrägstrich oder ein Rautezeichen. Das erste Segment oder der Satz zusammenhängender Segmente ist das Zeilenschlüsselpräfix und das letzte Segment oder der Satz zusammenhängender Segmente ist das Suffix des Zeilenschlüssels.

Grafik: Beispiel für einen Zeilenschlüssel

Mit sorgfältig ausgewählten Zeilenschlüsselpräfixen können Sie die eingebaute Sortierung von Bigtable für das Speichern verwandter Daten in benachbarten Zeilen nutzen. Das Speichern zusammengehöriger Daten in angrenzenden Zeilen bietet Ihnen die Möglichkeit, auf verwandte Daten als Zeilenbereich zuzugreifen und keine ineffiziente Tabellensuche ausführen zu müssen.

Wenn Ihre Daten Ganzzahlen enthalten, die Sie numerisch speichern oder sortieren möchten, versehen Sie die Ganzzahlen mit vorangestellten Nullen auf. Bigtable speichert Daten lexikografisch. Beispiel: lexikografisch, 3 > 20, aber 20 > 03. Wenn Sie die Drei mit einer vorangestellten Null versehen, werden die Zahlen numerisch sortiert. Diese Taktik ist für Zeitstempel wichtig, in denen bereichsbasierte Abfragen gewünscht werden.

Es ist wichtig, einen Zeilenschlüssel zu erstellen, mit dem ein klar definierter Zeilenbereich abgerufen werden kann. Andernfalls erfordert Ihre Abfrage einen Tabellenscan, der viel langsamer ist als das Abrufen bestimmter Zeilen.

Wenn Ihre Anwendung beispielsweise Mobilgerätedaten erfasst, können Sie einen Zeilenschlüssel haben, der aus dem Gerätetyp, der Geräte-ID und dem Tag besteht, an dem die Daten aufgezeichnet werden. Zeilenschlüssel für diese Daten können so aussehen:

        phone#4c410523#20200501
        phone#4c410523#20200502
        tablet#a0b81f74#20200501
        tablet#a0b81f74#20200502

Mit diesem Zeilenschlüssel-Design können Sie Daten mit einer einzigen Anfrage für Folgendes abrufen:

  • Einen Gerätetyp
  • Eine Kombination aus Gerätetyp und Geräte-ID

Dieses Zeilenschlüsseldesign ist nicht ideal, wenn Sie alle Daten für einen bestimmten Tag abrufen möchten. Da der Tag im dritten Segment oder im Suffix des Zeilenschlüssels gespeichert wird, können Sie nicht einfach einen Zeilenbereich anhand des Suffixes oder des mittleren Abschnitts des Zeilenschlüssels anfordern. Stattdessen müssen Sie eine Leseanfrage mit einem Filter senden, der die gesamte Tabelle auf den Tageswert hin scannt.

Verwenden Sie für Ihre Zeilen lesbare Stringwerte, sofern dies möglich ist. Diese Vorgehensweise erleichtert die Verwendung des Key Visualizer-Tools zum Beheben von Problemen mit Bigtable.

In vielen Fällen sollten Sie Zeilenschlüssel entwerfen, die mit einem gemeinsamen Wert beginnen und mit einem detaillierten Wert enden. Wenn Ihr Zeilenschlüssel beispielsweise einen Kontinent, ein Land und eine Stadt enthält, können Sie Zeilenschlüssel erstellen, die folgendermaßen aussehen, sodass sie zuerst automatisch nach Werten mit einer niedrigen Kardinalität sortiert werden:

        asia#india#bangalore
        asia#india#mumbai
        asia#japan#okinawa
        asia#japan#sapporo
        southamerica#bolivia#cochabamba
        southamerica#bolivia#lapaz
        southamerica#chile#santiago
        southamerica#chile#temuco

Zu vermeidende Zeilenschlüssel

Einige Arten von Zeilenschlüsseln können das Abfragen Ihrer Daten erschweren und andere die Leistung beeinträchtigen. In diesem Teil werden einige Arten von Zeilenschlüsseln beschrieben, deren Verwendung Sie in Bigtable vermeiden sollten.

Zeilenschlüssel, die mit einem Zeitstempel beginnen: Dadurch werden sequenzielle Schreibvorgänge auf einen einzelnen Knoten verschoben und ein Hotspot erstellt. Wenn Sie einen Zeitstempel in einen Zeilenschlüssel einfügen, müssen Sie ihm einen hohen Kardinalitätswert wie eine Nutzer-ID voranstellen, um ein Heißlaufen zu verhindern.

Zeilenschlüssel, die dazu führen, dass ähnliche Daten nicht gruppiert werden: Vermeiden Sie Zeilenschlüssel, bei denen verwandte Daten in nicht zusammenhängenden Zeilenbereichen gespeichert werden, da diese nicht effizient gelesen werden können.

Sequenzielle numerische IDs. Angenommen, Ihr System vergibt eine numerische ID an jeden Nutzer Ihrer Anwendung. Es mag in diesem Fall bequem erscheinen, die numerische ID der Nutzer als Zeilenschlüssel für Ihre Tabelle zu verwenden. Da neue Nutzer jedoch wahrscheinlich aktiver sind, verschiebt diese Herangehensweise den Großteil Ihres Traffics auf wenige Knoten.

Eine sicherere Herangehensweise wäre es, eine umgekehrte Version der numerischen ID der Nutzer zu verwenden. Dadurch verteilt sich der Traffic gleichmäßiger auf die Knoten Ihrer Bigtable-Tabelle.

Häufig aktualisierte IDs. Vermeiden Sie die Verwendung eines einzelnen Zeilenschlüssels zur Identifizierung eines Wertes, der sehr oft aktualisiert werden muss. Wenn Sie z. B. Daten zur Speichernutzung für eine Reihe von Geräten einmal pro Sekunde speichern, verwenden Sie nicht für jedes Gerät einen einzelnen Zeilenschlüssel, der sich aus der Geräte-ID und dem zu speichernden Messwert zusammensetzt, wie z. B. 4c410523#memusage, und aktualisieren Sie die Zeile wiederholt. Diese Art von Vorgang überlädt die Tabellenreihe, die die häufig verwendete Zeile speichert. Sie kann auch dazu führen, dass eine Zeile ihr Größenlimit überschreitet, weil die vorherigen Werte der Spalte Speicherplatz beanspruchen, bis die Zellen während der automatischen Speicherbereinigung entfernt werden.

Speichern Sie stattdessen jeden neuen Lesevorgang in einer neuen Zeile. Im Beispiel zur Speichernutzung kann jeder Zeilenschlüssel die Geräte-ID, den Messwerttyp und einen Zeitstempel enthalten, sodass die Zeilenschlüssel etwa so aussehen: 4c410523#memusage#1423523569918. Diese Strategie ist effizient, weil es in Bigtable nicht länger dauert, eine neue Zeile zu erstellen als eine neue Zelle. Zusätzlich können Sie durch diese Strategie schnell Daten aus einem speziellen Zeitraum lesen, indem Sie die passenden Start- und Endschlüssel berechnen.

Für Werte, die sich sehr häufig ändern, wie zum Beispiel ein Zähler, der sich hunderte Male pro Minute aktualisiert, ist es am besten, die Daten auf Anwendungsebene im Speicher zu lassen und periodisch neue Zeilen in Bigtable zu schreiben.

Hashwerte Durch das Hashing eines Zeilenschlüssels können Sie nicht mehr von den Vorteilen der natürlichen Sortierreihenfolge von Bigtable profitieren, sodass Zeilen nicht so gespeichert werden können, wie es für Abfragen optimal wäre. Aus diesem Grund ist es durch das Hashing von Werten schwieriger, das Key Visualizer-Tool zu verwenden, um Probleme mit Bigtable zu beheben. Verwenden Sie für Nutzer lesbare Werte anstelle von Hash-Werten.

Werte werden als Rohbyte ausgegeben und nicht als für Menschen lesbare Strings. Rohbyte eignen sich gut für Spaltenwerte. Verwenden Sie zur Verbesserung der Lesbarkeit und Fehlerbehebung jedoch Stringwerte in Zeilenschlüsseln.

Besondere Anwendungsfälle

Möglicherweise haben Sie ein einzigartiges Dataset, auf das beim Entwerfen eines Schemas für die Speicherung in Bigtable besonderes Augenmerk gelegt werden muss. In diesem Abschnitt werden einige, aber nicht alle unterschiedlichen Arten von Bigtable-Daten sowie einige empfohlene Speicherpraktiken beschrieben.

Zeitbasierte Daten

Schließen Sie einen Zeitstempel als Teil Ihres Zeilenschlüssels ein, wenn Sie häufig Daten nach dem Zeitpunkt der Aufzeichnung abrufen müssen.

Ein Beispiel: Ihre Anwendung zeichnet einmal pro Sekunde für eine große Anzahl Maschinen leistungsbezogene Daten wie CPU- und Speicherauslastung auf. Ihr Zeilenschlüssel für diese Daten könnte eine Kennzeichnung für die Maschine mit einem Zeitstempel für die Daten kombinieren (z. B. machine_4223421#1425330757685). Denken Sie daran, dass die Zeilenschlüssel lexikografisch sortiert sind.

Verwenden Sie keinen Zeitstempel allein oder am Anfang eines Zeilenschlüssels, da dadurch sequenzielle Schreibvorgänge auf einen einzelnen Knoten verschoben werden, wodurch ein Hotspot entsteht.

Wenn Sie in der Regel die am kürzesten zurückliegenden Aufzeichnungen zuerst abrufen, können Sie einen umgekehrten Zeitstempel im Zeilenschlüssel verwenden. Dazu ziehen Sie den Zeitstempel vom Maximalwert Ihrer Programmiersprache für lange Ganzzahlen ab (in Java, java.lang.Long.MAX_VALUE). Mit einem umgekehrten Zeitstempel werden die Aufzeichnungen von der letzten bis zur ersten geordnet.

Informationen zum Arbeiten mit Zeitachsendaten finden Sie unter Schemadesign für Zeitachsendaten.

Mehrinstanzenfähigkeit

Zeilenschlüsselpräfixe bieten eine skalierbare Lösung für einen Anwendungsfall mit erforderlicher Mehrinstanzenfähigkeit. In einem solchen Szenario werden ähnliche Daten mit dem gleichen Datenmodell für mehrere Clients gespeichert. Die Verwendung einer Tabelle für alle Mandanten ist die leistungsstärkste Methode für das Speichern und Zugreifen auf Daten mehrerer Mandanten.

Angenommen, Sie speichern und verfolgen den Bestellverlauf für eine Reihe von Unternehmen. Dabei können Sie Ihre eindeutige ID für jedes Unternehmen als Zeilenschlüsselpräfix nutzen. Alle Daten für einen Mandanten werden in zusammenhängenden Zeilen in derselben Tabelle gespeichert, und Sie können anhand des Zeilenschlüsselpräfixes abfragen oder filtern. Wenn dann ein Unternehmen nicht mehr zu Ihren Kunden gehört und Sie die Bestellverlaufsdaten löschen müssen, die Sie für das Unternehmen gespeichert haben, können Sie dafür den Zeilenbereich löschen, für den der Zeilenschlüsselpräfix dieses Kunden verwendet wird.

Wenn Sie beispielsweise die Mobiltelefondaten der Kunden altostrat und examplepetstore speichern, können Sie folgende Zeilenschlüssel erstellen. Wenn dann altostrat nicht mehr Ihr Kunde ist, werden alle Zeilen mit dem Zeilenschlüsselpräfix altostrat gelöscht.

        altostrat#phone#4c410523#20190501
        altostrat#phone#4c410523#20190502
        altostrat#tablet#a0b41f74#20190501
        examplepetstore#phone#4c410523#20190502
        examplepetstore#tablet#a6b81f79#20190501
        examplepetstore#tablet#a0b81f79#20190502

Wenn Sie dagegen die Daten für ein Unternehmen in einer eigenen Tabelle speichern, besteht die Gefahr von Leistungs- und Skalierungsproblemen. Außerdem wird dann oft ungewollt die Grenze von Bigtable von 1.000 Tabellen pro Instanz überschritten. Nachdem eine Instanz dieses Limit erreicht hat, können Sie in Bigtable keine weiteren Tabellen in der Instanz erstellen.

Datenschutz

Verwenden Sie möglichst keine personenidentifizierbare Informationen (PII) oder Nutzerdaten in Zeilenschlüsseln oder Spaltenfamilien-IDs, es sei denn, Ihr Anwendungsfall erfordert dies. Zeilenschlüssel und Spaltenfamilien sind sowohl Daten als auch Metadaten. Anwendungen, die diese als Metadaten verwenden, z. B. zur Verschlüsselung oder für das Logging, können sie versehentlich Nutzern zugänglich machen, die keinen Zugriff auf private Daten haben sollen.

Domainnamen

Große Bereich von Domainnamen

Sollten Sie Daten über Entitäten speichern, die als Domainnamen dargestellt werden können, ist es sinnvoll, als Zeilenschlüssel einen umgekehrten Domainnamen zu verwenden (z. B. com.company.product). Dies ist besonders dann zu empfehlen, wenn die Daten in den einzelnen Zeilen sich häufiger mit denen in benachbarten Zeilen überschneiden. In diesem Fall kann Bigtable Ihre Daten besser komprimieren.

Im Gegensatz dazu können Standarddomainnamen, die nicht umgekehrt werden, so sortiert werden, dass zusammengehörige Daten an einem Ort gruppiert werden. Dies kann zu einer weniger effizienten Komprimierung und zu weniger effizienten Lesevorgängen führen.

Diese Vorgehensweise funktioniert außerdem am besten, wenn Ihre Daten über viele verschiedene umgekehrte Domainnamen verteilt sind.

Betrachten Sie zur Veranschaulichung dieses Punkts die folgenden Domainnamen, die automatisch in lexikografischer Reihenfolge von Bigtable sortiert werden:

      drive.google.com
      en.wikipedia.org
      maps.google.com

Das ist nicht sinnvoll für den Anwendungsfall, in dem Sie alle Zeilen für google.com abfragen möchten. Betrachten Sie im Gegensatz dazu dieselben Zeilen, in denen die Domainnamen umgekehrt wurden:

      com.google.drive
      com.google.maps
      org.wikipedia.en

Im zweiten Beispiel werden die zugehörigen Zeilen automatisch so sortiert, dass sie einfach als Bereich von Zeilen abgerufen werden können.

Wenige Domainnamen

Wenn Sie davon ausgehen, dass nur eine oder eine kleine Anzahl von Domainnamen gespeichert werden sollen, sollten Sie andere Werte für Ihren Zeilenschlüssel verwenden. Andernfalls werden Schreibvorgänge unter Umständen auf einen einzelnen Knoten im Cluster übertragen. Dies kann einerseits zu Heißlaufen führen und andererseits dazu, dass Ihre Zeilen zu groß werden.

Wechselnde oder unsichere Abfragen

Wenn Sie nicht immer dieselben Abfragen für Ihre Daten ausführen oder sich nicht sicher sind, wie Ihre Abfragen aussehen sollen, können Sie alle Daten für eine Zeile in einer Spalte speichern, anstatt in mehreren Spalten. Dabei verwenden Sie ein Format, mit dem Sie die einzelnen Werte später einfach extrahieren können, z. .B. das binäre Protokollpufferformat oder das JSON-Format.

Der Zeilenschlüssel ist immer noch sorgfältig entworfen, um sicherzustellen, dass Sie die benötigten Daten abrufen können, aber jede Zeile hat normalerweise nur eine Spalte, die alle Daten für die Zeile in einem einzigen protobuf enthält.

Das Speichern der Daten als protobuf-Nachricht in einer Spalte, anstatt sie auf mehrere Spalten zu verteilen, hat Vor- und Nachteile. Zu den Vorteilen gehören:

  • Da die Daten weniger Speicherplatz verbrauchen, fallen weniger Kosten an.
  • Sie bewahren sich eine bestimmte Flexibilität, da Sie sich nicht auf Spaltenfamilien und Spaltenqualifizierer festlegen.
  • Ihre Leseanwendung muss das Tabellenschema nicht „kennen“.

Einige Nachteile sind:

  • Die protobuf-Nachrichten müssen nach dem Lesen aus Bigtable deserialisiert werden.
  • Sie können die Daten in protobuf-Nachrichten nicht mehr mit Filtern abrufen.
  • Sie können BigQuery nicht verwenden, um föderierte Abfragen für Felder in protobuf-Nachrichten auszuführen, nachdem diese aus Bigtable gelesen wurden.

Nächste Schritte