Tabellendesign

Erfahren Sie, wie Sie Tabellen in Oracle NoSQL Database Cloud Service entwerfen und konfigurieren.

Tabelle

Eine Tabelle ist eine Sammlung von Zeilen, wobei jede Zeile einen Datensatz enthält. Jede Tabellenzeile besteht aus Schlüssel- und Datenfeldern, die beim Erstellen einer Tabelle definiert werden. Darüber hinaus verfügt eine Tabelle über eine bestimmte Speicherkapazität, unterstützt einen definierten maximalen Lese- und Schreibdurchsatz und weist eine maximale Größe auf.

Machen Sie sich mit den folgenden Konzepten vertraut, bevor Sie eine Tabelle in Oracle NoSQL Database Cloud Service entwerfen:

  • Tabellenfelder: Tabellen werden mit einer DDL (Data Definition Language) erstellt, die die Datentypen und Primärschlüssel für die Tabelle definiert. Oracle NoSQL Database Cloud Service unterstützt mehrere Datentypen, darunter mehrere numerische Typen, Zeichenfolgen, Binärdaten, Zeitstempel, Zuordnungen, Arrays, Datensätze und einen speziellen JSON-Typ, der gültige JSON-Daten enthalten kann. Eine Anwendung kann Datentypen für die Tabellenfelder anhand des Datenmodells auswählen. Unter Unterstützte Datentypen finden Sie eine komplette Liste der in Oracle NoSQL Database Cloud Service unterstützten Datentypen.

    Weitere Informationen zu Tabellenfeldern finden Sie unter Tabellenfelder.

  • Primärschlüssel und Shard-Schlüssel: Jede Tabelle muss mindestens ein Feld aufweisen, das als Primärschlüssel festgelegt ist. Diese Festlegung findet beim Erstellen der Tabelle statt und kann nach dem Erstellen der Tabelle nicht mehr geändert werden. Ein Primärschlüssel identifiziert jede Zeile in der Tabelle eindeutig. Im einfachsten Fall wird mit einem Primärschlüssel eine bestimmte Zeile abgerufen, die geprüft oder geändert wird.

    Shard-Schlüssel geben an, welche Primärschlüsselfelder hinsichtlich der Shard-Speicherung eine Bedeutung haben. Das heißt, Zeilen mit übereinstimmenden Werten in allen Shard-Schlüsseln werden garantiert im selben Shard gespeichert. Diese Shard-Speicherung ist für einige Vorgänge relevant, bei denen eine Atomarität der Ergebnisse wahrscheinlich ist.

    Weitere Informationen finden Sie unter Primärschlüssel und Shard-Schlüssel.

  • Indizes: Indizes bieten eine alternative Möglichkeit, Tabellenzeilen abzurufen. Normalerweise rufen Sie Tabellenzeilen mit dem Primärschlüssel ab. Indem Sie einen Index erstellen, können Sie Zeilen effizienter basierend auf Feldern abrufen, die nicht Bestandteil des Primärschlüssels sind. Indizes bieten mehr Abfragemöglichkeiten, verbrauchen jedoch sowohl Speicher- als auch Durchsatzressourcen.

    Weitere Informationen zum Erstellen eines Index finden Sie unter Tabellen und Indizes erstellen.

  • Kapazität: Beim Erstellen einer Tabelle geben Sie auch den Durchsatz und die Speicherressourcen an, die für die Tabelle verfügbar sind. Lese- und Schreibvorgänge für die Tabelle werden durch den von Ihnen festgelegten Lese- und Schreibdurchsatz begrenzt. Der Speicherplatz, den die Tabelle belegen kann, wird durch die Speicherkapazität begrenzt.

    Unter Kapazität schätzen wird erläutert, wie Sie die Kapazität schätzen, die Sie für die Tabelle angeben müssen.

    Unter Kapazität verwalten wird beschrieben, wie Sie die Kapazität Ihrer Tabelle verwalten können.

  • Gültigkeitsdauer (TTL): Mit der Gültigkeitsdauer können Sie einen automatischen Ablauf der Tabellenzeilen festlegen. Die Gültigkeitsdauer gibt an, wie lange Daten in der Tabelle gültig sind. Daten, die den Timeoutwert für den Ablauf erreicht haben, können nicht mehr abgerufen werden und werden bei Lesevorgängen nicht mehr angezeigt.

    Weitere Informationen finden Sie unter Gültigkeitsdauer.

  • Identity-Spalten: Identity-Spalten sind ein besonderer Spaltentyp, bei dem Werte automatisch von Oracle NoSQL Database Cloud Service zugewiesen werden. Diese Werte werden von einem Sequenzgenerator generiert. Identitätsspalten werden in der NoSQL Database Cloud Service-Konsole nicht unterstützt. Weitere Einzelheiten zu Identitätsspalten finden Sie unter Identitätsspalte in SQL-Referenz für Oracle NoSQL Database. Weitere Informationen zum Zugriff auf Identitätsspalten aus einer Oracle NoSQL Database Cloud Service-Anwendung finden Sie unter IDENTITY-Werte programmgesteuert einfügen in Erste Schritte mit NoSQL Database-Tabellen-Java-Treiber.
  • Tabellenlebenszyklen: Wenn Tabellen erstellt, geändert oder gelöscht werden, durchlaufen sie unterschiedliche Status des Tabellenlebenszyklus.

    Weitere Informationen zum Lebenszyklus einer Tabelle finden Sie unter Tabellenstatus und -lebenszyklen.

Unterstützte Datentypen

Oracle NoSQL Database Cloud Service unterstützt viele gängige Datentypen.

Datentyp Beschreibung

BINARY

Eine Folge von null oder mehr Byte.

FIXED_BINARY Ein Bytearray mit fester Größe.

BOOLEAN

Ein Datentyp mit einem von zwei möglichen Werten: TRUE oder FALSE.

DOUBLE

Eine Gleitkommazahl mit einer Länge von 64 Bit (8 Byte)

FLOAT

Eine Gleitpunktnummer mit einer Länge von 32 Bit (4 Byte)

LONG

Eine Ganzzahl mit einer Länge von 64 Bit ( 8 Byte).

INTEGER

Eine Ganzzahl mit einer Länge von 32 Bit (4 Byte).

STRING

Eine Folge von Unicode-Zeichen.

NUMBER

Eine mit Vorzeichen versehene Dezimalzahl mit beliebiger Gesamtstellenzahl.

TIMESTAMP

Ein Zeitpunkt mit einer Gesamtstellenzahl. Die Gesamtstellenzahl wirkt sich auf die Speichergröße und -nutzung aus. TIMESTAMP-Daten werden in UTC (Koordinierte Weltzeit) gespeichert und verwaltet.

ENUM

Eine Enumeration, als Array von Zeichenfolgen dargestellt. ENUM-Werte sind symbolische IDs (Token). Sie werden als kleiner ganzzahliger Wert gespeichert, der eine bestimmte Position in der Enumerationsreihenfolge darstellt.

ARRAY

Eine sortierte Collection mit null oder mehr typisierten Elementen. Arrays, die nicht als JSON definiert sind, können keine NULL-Werte enthalten.

Als JSON deklarierte Arrays können ein beliebiges gültiges JSON-Format enthalten, einschließlich des speziellen Werts NULL, der für JSON relevant ist.

MAP

Eine nicht sortierte Collection mit null oder mehr Schlüssel/Element-Paaren, wobei alle Schlüssel Zeichenfolgen sind und alle Elemente denselben Typ aufweisen. Alle Schlüssel müssen eindeutig sein. Die Schlüssel/Element-Paare werden als Felder bezeichnet, wobei die Schlüssel Feldnamen und die zugeordneten Elemente Feldwerte darstellen. Feldwerte können unterschiedliche Typen aufweisen, Zuordnungen dürfen jedoch keine NULL-Feldwerte enthalten.

RECORD

Eine feste Collection aus Schlüssel/Element-Paaren, wobei alle Schlüssel Zeichenfolgen sind. Alle Schlüssel in einem Datensatz müssen eindeutig sein.

JSON

Beliebige gültige JSON-Daten.

Tabellenfelder

Erfahren Sie, wie Sie Daten unter Verwendung von Tabellenfeldern entwerfen und konfigurieren.

Eine Anwendung kann schemalose Tabellen verwenden, bei denen eine Zeile aus Schlüsselfeldern und einem einzelnen JSON-Datenfeld besteht. Eine schemalose Tabelle bietet Flexibilität hinsichtlich der Daten, die in einer Zeile gespeichert werden können.

Alternativ kann die Anwendung Tabellen mit festem Schema verwenden, bei denen sämtliche Tabellenfelder als bestimmte Typen definiert sind.

Tabellen mit festem Schema mit typisierten Daten bieten hinsichtlich Durchsetzung und Speichereffizienz höhere Sicherheit. Das Schema dieser Tabellen kann zwar bearbeitet werden, die Tabellenstruktur kann jedoch nicht einfach geändert werden. Eine schemalose Tabelle ist flexibel, und die Tabellenstruktur kann einfach geändert werden.

Schließlich kann eine Anwendung auch eine hybride Datenmodelllösung verwenden, bei der eine Tabelle typisierte Daten und JSON-Datenfelder enthalten kann.

In den folgenden Beispielen wird veranschaulicht, wie Daten für alle drei Ansätze entworfen und konfiguriert werden.

Beispiel 1: Schemalose Tabelle entwerfen

Sie haben mehrere Möglichkeiten, Informationen zu Navigationsmustern in Ihrer Tabelle zu speichern. Eine Möglichkeit besteht darin, eine Tabelle zu definieren, die eine Cookie-ID als Schlüssel verwendet und Zielgruppensegmentierungsdaten als ein einzelnes JSON-Feld speichert.

// schema less, data is stored in a JSON field
CREATE TABLE audience_info (
       cookie_id LONG,
       audience_data JSON,
       PRIMARY KEY(cookie_id))

In diesem Fall kann die Tabelle audience_info ein JSON-Objekt enthalten. Beispiel:

{
  "cookie_id": "",
  "audience_data": {
    "ipaddr" : "10.0.00.xxx",
    "audience_segment: {
       "sports_lover" : "2018-11-30",
       "book_reader" :  "2018-12-01"
    }
  }
}

Die Anwendung verfügt über ein Schlüsselfeld und ein Datenfeld für diese Tabelle. Das Feld audience_data ist so flexibel, dass beliebige Daten gespeichert werden können. Daher können Sie die verfügbaren Typen von Daten einfach ändern.

Beispiel 2: Tabelle mit festem Schema entwerfen

Sie können Informationen zu Navigationsmustern speichern, indem Sie Ihre Tabelle mit eindeutiger deklarierten Feldern erstellen:

// fixed schema, data is stored in typed fields.
CREATE TABLE audience_info(
       cookie_id LONG,
       ipaddr STRING,
       audience_segment RECORD(sports_lover TIMESTAMP(9),
                               book_reader TIMESTAMP(9)),
       PRIMARY KEY(cookie_id));

In diesem Beispiel weist die Tabelle ein Schlüsselfeld und zwei Datenfelder auf. Ihre Daten sind kompakter, und Sie können sicherstellen, dass alle Datenfelder korrekt sind.

Beispiel 3: Hybridtabelle entwerfen

Sie können Informationen zu Navigationsmustern speichern, indem Sie sowohl typisierte Datenfelder als auch JSON-Datenfelder in der Tabelle verwenden.

// mixed, data is stored in both typed and JSON fields.
CREATE TABLE audience_info (
       cookie_id LONG,
       ipaddr STRING,
       audience_segment JSON,
       PRIMARY KEY(cookie_id));

Primärschlüssel und Shard-Schlüssel

Erfahren Sie mehr über den Zweck von Primärschlüsseln und Shard-Schlüsseln beim Entwerfen Ihrer Anwendung.

Primärschlüssel und Shard-Schlüssel sind wichtige Elemente in Ihrem Schema. Mit ihnen können Sie Daten effizient aufrufen und verteilen. Sie erstellen Primärschlüssel und Shard-Schlüssel nur beim Erstellen einer Tabelle. Sie bleiben für die Lebensdauer der Tabelle erhalten und können nicht geändert oder gelöscht werden.

Primärschlüssel

Sie müssen beim Erstellen der Tabelle mindestens eine Primärschlüsselspalte angeben. Ein Primärschlüssel identifiziert jede Zeile in der Tabelle eindeutig. Bei einfachen CRUD-Vorgängen ruft Oracle NoSQL Database Cloud Service bestimmte Zeilen anhand ihrer Primärschlüssel für Lese- oder Bearbeitungsvorgänge ab. Angenommen, eine Tabelle enthält die folgenden Felder:

  • productName

  • productType

  • productLine

Erfahrungsgemäß ist der Produktname wichtig und für jede Zeile eindeutig. Sie legen also productName als Primärschlüssel fest. Anschließend rufen Sie die gewünschten Zeilen basierend auf productName ab. Verwenden Sie in einem solchen Fall eine Anweisung wie diese, um die Tabelle zu definieren.

/* Create a new table called users. */
CREATE TABLE if not exists myProducts 
(
  productName STRING,
  productType STRING,
  productLine INTEGER,
  PRIMARY KEY (productName)
)";

Shard-Schlüssel

Der Hauptzweck von Shard-Schlüsseln besteht darin, Daten zur Effizienzsteigerung über das Oracle NoSQL Database Cloud Service-Cluster zu verteilen und Datensätze mit demselben Shard-Schlüssel zwecks einfacher Referenz und schnellem Zugriff lokal abzulegen. Datensätze mit demselben Shard-Schlüssel werden am selben physischen Speicherort gespeichert und können atomar und effizient aufgerufen werden.

Das Design der Primärschlüssel und Shard-Schlüssel hat Auswirkungen auf die Skalierung und das Erreichen des bereitgestellten Durchsatzes. Beispiel: Wenn Datensätze denselben Shard-Schlüssel verwenden, können Sie mehrere Tabellenzeilen in einem atomaren Vorgang löschen oder eine Teilmenge von Zeilen in der Tabelle in einem einzigen atomaren Vorgang abrufen. Optimal konzipierte Shard-Schlüssel ermöglichen nicht nur die Skalierung, sondern können auch die Performance verbessern, da weniger Zyklen erforderlich sind, um Daten einem einzelnen Shard zuzuweisen oder Daten aus einem einzelnen Shard abzurufen.

Angenommen, Sie geben drei Primärschlüsselfelder an:

PRIMARY KEY (productName, productType, productLine)

Da Ihre Anwendung häufig Abfragen mit den Spalten productName und productType ausführt, empfiehlt es sich, diese Felder als Shard-Schlüssel anzugeben. Die Festlegung als Shard-Schlüssel stellt sicher, dass alle Zeilen für diese beiden Spalten im selben Shard gespeichert werden. Wenn es sich bei diesen beiden Feldern nicht um Shard-Schlüssel handelt, könnten die am häufigsten abgefragten Spalten in einem beliebigen Shard gespeichert werden. Bei der Suche nach allen Zeilen für beide Felder muss in solch einem Fall der gesamte Datenspeicher anstatt nur ein einziges Shard gescannt werden.

Shard-Schlüssel legen die Speicherung im selben Shard fest, um effiziente Abfragen für Schlüsselwerte zu ermöglichen. Da Ihre Daten jedoch für eine optimale Performance auf die Shards verteilt werden sollen, müssen Sie Shard-Schlüssel vermeiden, die wenige eindeutige Werte aufweisen.
Hinweis

Wenn Sie beim Erstellen einer Tabelle keine Shard-Schlüssel angeben, verwendet Oracle NoSQL Database Cloud Service die Primärschlüssel zum Organisieren der Shards.

Wichtige Faktoren beim Auswählen eines Shard-Schlüssels

  • Kardinalität: Bei Feldern mit niedriger Kardinalität (Beispiel: Heimatland eines Benutzers) werden Datensätze in wenigen Shards gruppiert. Diese Shards erfordern ein häufiges Rebalancing der Daten, was die Wahrscheinlichkeit des Auftretens von Problemen aufgrund hochfrequentierter Shards erhöht. Stattdessen sollte jeder Shard-Schlüssel eine hohe Kardinalität aufweisen, mit der der Shard-Schlüssel ein gleichmäßiges Datensatzsegment im Dataset ausdrücken kann. Beispiel: ID-Nummern wie customerID, userID oder productID sind gute Kandidaten für einen Shard-Schlüssel.

  • Atomarität: Nur Objekte mit demselben Shard-Schlüssel können an einer Transaktion teilnehmen. Wenn Sie ACID-Transaktionen benötigen, die mehrere Datensätze umfassen, wählen Sie einen Shard-Schlüssel aus, mit dem Sie diese Anforderung erfüllen können.

Welche Best Practices sind zu befolgen?

  • Gleichmäßige Verteilung von Shard-Schlüsseln: Wenn Shard-Schlüssel gleichmäßig verteilt werden, wird die Kapazität des Systems nicht durch ein einzelnes Shard begrenzt.

  • Isolation von Abfragen: Für höchste Effizienz und Performance müssen Abfragen auf ein bestimmtes Shard ausgerichtet werden. Wenn keine Isolation von Abfragen auf ein einzelnes Shard gegeben ist, wird die Abfrage auf alle Shards angewendet. Dies ist weniger effizient und erhöht die Abfragelatenz.

Unter Tabellen und Indizes erstellen erhalten Sie weitere Informationen zum Zuweisen von Primärschlüsseln und Shard-Schlüsseln mit dem TableRequest-Objekt.

Gültigkeitsdauer

Erfahren Sie, wie Sie Ablaufzeiten für Tabellen und Zeilen mithilfe des TTL-Features angeben.

In vielen Anwendungen werden Daten mit einer begrenzten Nutzungsdauer verwaltet. Die Gültigkeitsdauer (TTL) ist ein Verfahren, mit dem Sie einen Zeitrahmen für Tabellenzeilen festlegen können, nach welchem die Zeilen automatisch ablaufen und nicht mehr verfügbar sind. Sie gibt an, wie lange die Daten in Oracle NoSQL Database Cloud Service verbleiben dürfen. Daten mit erreichter Ablaufzeit können nicht mehr abgerufen werden und werden nicht mehr in Speicherstatistiken angezeigt.

Standardmäßig weist jede erstellte Tabelle einen TTL-Wert von null auf, das heißt, es wird keine Ablaufzeit angegeben. Sie können einen TTL-Wert beim Erstellen einer Tabelle deklarieren. Dabei geben Sie die Gültigkeitsdauer mit einer Zahl an, gefolgt von HOURS oder DAYS. Tabellenzeilen erben den TTL-Wert der Tabelle, in der sie enthalten sind, sofern Sie nicht explizit einen TTL-Wert für Tabellenzeilen festlegen. Wenn Sie einen TTL-Wert für eine Zeile festlegen, wird der TTL-Wert der Tabelle außer Kraft gesetzt. Wenn Sie den TTL-Wert der Tabelle ändern, nachdem für die Zeile ein TTL-Wert festgelegt wurde, wird der TTL-Wert der Zeile beibehalten.

Sie können den TTL-Wert für eine Tabellenzeile jederzeit aktualisieren, bevor die Ablaufzeit der Zeile erreicht wurde. Auf abgelaufene Daten kann nicht mehr zugegriffen werden. Das Verwenden von TTL-Werten ist somit effizienter als das manuelle Löschen von Zeilen, weil das Schreiben eines Datenbanklogeintrags für die Datenlöschung vermieden wird. Abgelaufene Daten werden nach dem Ablaufdatum vom Datenträger gelöscht.

Tabellenstatus und -lebenszyklen

Machen Sie sich mit den verschiedenen Tabellenstatus und deren Bedeutung vertraut (Tabellenlebenszyklusprozess).

Jede Tabelle durchläuft eine Reihe von unterschiedlichen Status von ihrer Erstellung bis zum Löschen. Beispiel: Eine Tabelle im Status DROPPING kann nicht in den Status ACTIVE versetzt werden. Eine Tabelle im Status ACTIVE hingegen kann in den Status UPDATING versetzt werden. Sie können die verschiedenen Tabellenstatus verfolgen, indem Sie den Tabellenlebenszyklus überwachen. In diesem Abschnitt werden die einzelnen Tabellenstatus beschrieben.

Beschreibung von table-state.png folgt

Tabellenstatus Beschreibung

CREATING

Die Tabelle wird gerade erstellt. Sie kann noch nicht verwendet werden.

UPDATING

Die Tabelle wird gerade aktualisiert. Es sind keine weiteren Tabellenänderungen möglich, solange die Tabelle diesen Status aufweist.

In folgenden Fällen befindet sich eine Tabelle im Status UPDATING:

  • Die Tabellenlimits werden geändert
  • Das Tabellenschema wird optimiert
  • Ein Tabellenindex wird hinzugefügt oder gelöscht

ACTIVE

Die Tabelle kann im aktuellen Status verwendet werden. Die Tabelle wurde möglicherweise vor Kurzem erstellt oder geändert, ihr Status ist jetzt jedoch stabil.

DROPPING

Die Tabelle wird gerade gelöscht und kann nicht aufgerufen werden (egal, zu welchem Zweck).

DROPPED

Die Tabelle wurde gelöscht und ist nicht mehr für Lese-, Schreib- oder Abfrageaktivitäten verfügbar.
Hinweis

Nach dem Löschen einer Tabelle kann eine neue Tabelle mit demselben Namen erstellt werden.