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 |
---|---|
|
Eine Folge von null oder mehr Byte. |
FIXED_BINARY |
Ein Bytearray mit fester Größe. |
|
Ein Datentyp mit einem von zwei möglichen Werten: |
|
Eine Gleitkommazahl mit einer Länge von 64 Bit (8 Byte) |
|
Eine Gleitpunktnummer mit einer Länge von 32 Bit (4 Byte) |
|
Eine Ganzzahl mit einer Länge von 64 Bit ( 8 Byte). |
|
Eine Ganzzahl mit einer Länge von 32 Bit (4 Byte). |
|
Eine Folge von Unicode-Zeichen. |
|
Eine mit Vorzeichen versehene Dezimalzahl mit beliebiger Gesamtstellenzahl. |
|
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. |
|
Eine Enumeration, als Array von Zeichenfolgen dargestellt. |
|
Eine sortierte Collection mit null oder mehr typisierten Elementen. Arrays, die nicht als JSON definiert sind, können keine 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. |
|
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. |
|
Eine feste Collection aus Schlüssel/Element-Paaren, wobei alle Schlüssel Zeichenfolgen sind. Alle Schlüssel in einem Datensatz müssen eindeutig sein. |
|
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.
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
oderproductID
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.
Tabellenstatus | Beschreibung |
---|---|
|
Die Tabelle wird gerade erstellt. Sie kann noch nicht verwendet werden. |
|
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
|
|
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. |
|
Die Tabelle wird gerade gelöscht und kann nicht aufgerufen werden (egal, zu welchem Zweck). |
|
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. |