Singleton-Tabellen mit APIs erstellen
Die Tabelle ist die grundlegende Struktur für Benutzerdaten. Mit einem SQL-Befehl (CREATE TABLE-Anweisung) oder TableRequest-API-Befehlen können Sie eine neue Tabelle erstellen.
Sie können auch die Oracle NoSQL Cloud Infrastructure-(OCI-)Konsole oder die OCI-Befehlszeilenschnittstelle (OCI-cli) verwenden, um eine Tabelle in NDCS zu erstellen.
- Die Tabellendefinition muss mindestens eine Felddefinition und genau eine Primärschlüsseldefinition enthalten. Weitere Informationen zur Primärschlüsseldefinition finden Sie unter Tabelle erstellen.
- Die Felddefinition gibt den Namen der Spalte, ihren Datentyp, ob die Spalte auf Null gesetzt werden kann oder nicht, einen optionalen Standardwert an, unabhängig davon, ob die Spalte eine IDENTITY-Spalte und ein optionaler Kommentar ist. Alle Felder (außer dem PRIMARY KEY) können standardmäßig auf Null gesetzt werden.
- Die Syntax für die Primärschlüsselspezifikation (key_definition) gibt die Primärschlüsselspalten der Tabelle als geordnete Liste mit Feldnamen an.
- Der Time-to-Live-(TTL-)Wert wird zur Berechnung der Ablaufzeit einer Zeile verwendet. Abgelaufene Zeilen werden nicht in die Abfrageergebnisse aufgenommen und schließlich von Oracle NoSQL Database automatisch aus der Tabelle entfernt. Wenn Sie beim Erstellen der Tabelle einen TTL-Wert angeben, gilt dieser als Standard-TTL für jede in diese Tabelle eingefügte Zeile.
SQL-Befehle verwenden
Sie können den Befehl CREATE TABLE in SQL verwenden, um NoSQL-Tabellen zu erstellen.
Im folgenden Abschnitt werden verschiedene Optionen hervorgehoben, die beim Erstellen einer Tabelle mit der CREATE TABLE DDL-Anweisung verwendet werden können.
CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)Im obigen Schema verwenden Sie die Anweisung CREATE TABLE, um eine BaggageInfo-Tabelle zu definieren. Die Ticketnummer des Passagiers, ticketNo, ist der Primärschlüssel der Tabelle. Die Felder fullName, gender, contactPhone und confNo (Reservierungsnummer) speichern die Passagierinformationen, die Teil eines festen Schemas sind. Die Spalte bagInfo ist ein schemaloses JSON-Array, das die Verfolgungsinformationen des eingecheckten Gepäcks eines Passagiers darstellt.
Weitere Informationen zur Anwendung zur Verfolgung von Fluggepäck finden Sie unter Anwendung zur Verfolgung von Fluggepäck.
CREATE TABLE stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)USING TTL 5 DAYSIm obigen Schema verwenden Sie die Anweisung CREATE TABLE, um eine Tabelle stream_acct zu erstellen. Die Account-ID des Abonnenten, Feld acct_id, ist der Primärschlüssel in dieser Tabelle. Die Felder profile_name, account_expiry speichern die Viewership-Details, die Teil eines festen Schemas sind. Die Spalte acct_data ist ein schemaloses JSON-Feld, in dem die Details der von einem Abonnenten angezeigten Anzeigen gespeichert werden.
Weitere Informationen zur Streaming Media Service-Anwendung finden Sie unter Streaming Media Service - Persistenter Benutzerprofilspeicher.
Außerdem geben Sie einen TTL-Wert an, nach dem die Zeilen automatisch ablaufen und nicht mehr verfügbar sind. Der TTL-Wert muss Stunden oder Tage sein. In diesem Schema verfallen die Zeilen der Tabelle nach 5 Tagen.
CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data RECORD (
firstName STRING,
lastName STRING,
country STRING,
shows JSON
),
PRIMARY KEY(acct_id)
)Im obigen Schema definieren Sie eine Variation des festen Schemas, indem Sie das Feld acct_data als RECORD-Datentyp aufnehmen.
Ein Datensatz ist eine geordnete Sammlung von mindestens einem Schlüssel/Element-Paar. Die Schlüssel in einem Datensatz müssen Zeichenfolgen sein, und die zugeordneten Elemente können unterschiedliche Datentypen aufweisen. Die Felder in einem Datensatz sind Teil des festen Schemas, und Sie können sie nicht hinzufügen oder entfernen. Im obigen Beispiel sind die Felder firstName, lastName, country und shows die Schlüssel für den Datensatz acct_data. Die Definition eines Datensatzes ist hilfreich, wenn Sie Daten als Teil eines größeren Datensatzes speichern möchten. Mit den Feldschrittausdrücken können Sie die gesamte Teilmenge in einen Datensatz einfügen/aktualisieren/abrufen.
CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data RECORD (
firstName STRING,
lastName STRING,
country STRING,
shows RECORD (
showName STRING,
showId INTEGER,
type JSON,
numSeasons INTEGER,
seriesInfo ARRAY(JSON)
)
),
PRIMARY KEY(acct_id)
)Das Feld shows ist ein verschachtelter RECORD-Typ, mit dem die Details der angezeigten Shows verfolgt werden.
Beispiel 4: Erstellen Sie eine Streaming Media-Servicetabelle als hierarchische Tabellenstruktur.
stream_acct als übergeordnete Tabelle und die Tabelle acct_data als untergeordnete Tabelle:CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
PRIMARY KEY(acct_id)) CREATE TABLE IF NOT EXISTS stream_acct.acct_data(
profile_id INTEGER,
user_name STRING,
firstName STRING,
lastName STRING,
country STRING,
shows JSON,
PRIMARY KEY(profile_id))Mit der obigen Definition der übergeordneten/untergeordneten Tabelle kann der Streaming Media-Service mehrere Benutzerprofile in einem einzigen Abonnement unterstützen.
Sie definieren die Tabelle acct_data als untergeordnete Tabelle mit dem Primärschlüssel profile_id, um das Profil eines Benutzers zu identifizieren. Zusätzlich zur Definition eines Primärschlüssels für die Tabelle erbt die Tabelle acct_data implizit die Primärschlüsselspalte acct_id der übergeordneten Tabelle stream_acct.
Sie können mehrere untergeordnete Tabellen unter derselben übergeordneten Tabelle stream_acct definieren. Sie können weitere untergeordnete Tabellen für die Tabelle acct_data definieren. Alle Tabellen in der Hierarchie haben dieselbe Shard-Schlüsselspalte, die in der Anweisung "Tabelle erstellen" der höchsten übergeordneten Tabelle in der Hierarchie angegeben ist. In diesem Beispiel ist der Primärschlüssel acct_id der übergeordneten Tabelle auch der Shard-Schlüssel für die Tabellen stream_acct und acct_data.
Verwandte Themen
API TableRequest verwenden
Mit der API TableRequest können Sie NoSQL-Tabellen erstellen.
Mit der Klasse TableRequest werden Tabellen erstellt. Die Ausführung der von dieser Anforderung angegebenen Vorgänge ist asynchron. Dies sind möglicherweise Operationen mit langer Ausführungszeit. TableResult wird von TableRequest-Vorgängen zurückgegeben und kapselt den Status der Tabelle. Weitere Informationen zur Klasse TableRequest und ihren Methoden finden Sie unter Oracle NoSQL Java-SDK-API-Referenz.
private static void createTab(NoSQLHandle handle) throws Exception {
String createTableDDL =
"CREATE TABLE IF NOT EXISTS " + tableName +
"(acct_Id INTEGER," +
"profile_name STRING," +
"account_expiry TIMESTAMP(1) ," +
"acct_data JSON, " +
"PRIMARY KEY(acct_Id))";
TableLimits limits = new TableLimits(20, 20, 1);
TableRequest treq = new TableRequest()
.setStatement(createTableDDL)
.setTableLimits(limits);
TableResult tres = handle.tableRequest(treq);
/* The request is async,
* so wait for the table to become active.
*/
tres.waitForCompletion(handle, 60000,1000);
System.out.println("Created Table: " + tableName);
}Hinweis:
Tabellenlimits gelten nur für Oracle NoSQL Database Cloud Service. Wenn Limits für eine On-Premise-Datenbank NoSQL festgelegt sind, werden sie stillschweigend ignoriert.Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung auszuführen und eine untergeordnete Tabelle zu erstellen.
- Sie müssen den vollständigen Namen der Tabelle angeben (name_parent_table.name_child_table)
- Tabellenlimits müssen nicht explizit festgelegt werden, da eine untergeordnete Tabelle die Grenzen einer übergeordneten Tabelle erbt.
Laden Sie den vollständigen Code TableJoins.java aus den Beispielen herunter, um hier zu erfahren, wie Sie eine Tabelle mit übergeordneten/untergeordneten Elementen erstellen.
Mit der Klasse borneo.TableRequest wird eine Tabelle erstellt. Alle Aufrufe von borneo.NoSQLHandle.table_request() sind asynchron. Daher müssen Sie das Ergebnis prüfen und borneo.TableResult.wait_for_completion() aufrufen, um auf den Abschluss des Vorgangs zu warten. Weitere Informationen zu table_request und den zugehörigen Methoden finden Sie unter Oracle NoSQL Python-SDK-API-Referenz.
def create_table(handle):
statement = '''create table if not exists
stream_acct (acct_Id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(1),
acct_data JSON,
primary key(acct_Id))'''
request = TableRequest().set_statement(statement)
.set_table_limits(TableLimits(20, 10, 1))
table_result = handle.do_table_request(request, 40000, 3000)
table_result.wait_for_completion(handle, 40000, 3000)
if (table_result.get_state() == State.ACTIVE):
print('Created table: stream_acct')
else:
raise NameError('Table stream_acct is in an unexpected state ' +
str(table_result.get_state()))Hinweis:
Tabellenlimits gelten nur für Oracle NoSQL Database Cloud Service. Wenn Limits für eine On-Premise-Datenbank NoSQL festgelegt sind, werden sie stillschweigend ignoriert.Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung auszuführen und eine untergeordnete Tabelle zu erstellen.
- Sie müssen den vollständigen Namen der Tabelle (name_parent_table.name_child_table) angeben.
- Tabellenlimits müssen nicht explizit festgelegt werden, da eine untergeordnete Tabelle die Grenzen einer übergeordneten Tabelle erbt.
Laden Sie den vollständigen Code TableJoins.py aus den Beispielen hier herunter.
Mit der Klasse TableRequest wird eine Tabelle erstellt. Die Ausführung von Vorgängen, die mit TableRequest angegeben werden, ist asynchron. Dies sind möglicherweise Operationen mit langer Ausführungszeit. Diese Anforderung wird als Eingabe eines Client.DoTableRequest()-Vorgangs verwendet, der eine TableResult zurückgibt, die zum Polling verwendet werden kann, bis die Tabelle den gewünschten Status erreicht. Weitere Informationen zu den verschiedenen Methoden der Klasse TableRequest finden Sie in der Oracle NoSQL Go-SDK-API-Referenz.
func createTable(client *nosqldb.Client, err error, tableName string)(){
// Creates a table
stmt := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s ("+
"acct_Id INTEGER," +
"profile_name STRING," +
"account_expiry TIMESTAMP(1) ," +
"acct_data JSON, " +
"PRIMARY KEY(acct_Id))",tableName)
tableReq := &nosqldb.TableRequest{
Statement: stmt,
TableLimits: &nosqldb.TableLimits{
ReadUnits: 20,
WriteUnits: 20,
StorageGB: 1,
},
}
tableRes, err := client.DoTableRequest(tableReq)
if err != nil {
fmt.Printf("cannot initiate CREATE TABLE request: %v\n", err)
return
}
// The create table request is asynchronous,
// wait for table creation to complete.
_, err = tableRes.WaitForCompletion(client, 60*time.Second, time.Second)
if err != nil {
fmt.Printf("Error finishing CREATE TABLE request: %v\n", err)
return
}
fmt.Println("Created table: ", tableName)
return
}Hinweis:
Tabellenlimits gelten nur für Oracle NoSQL Database Cloud Service. Wenn Limits für eine On-Premise-Datenbank NoSQL festgelegt sind, werden sie stillschweigend ignoriert.Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung auszuführen und eine untergeordnete Tabelle zu erstellen.
- Sie müssen den vollständigen Namen der Tabelle (name_parent_table.name_child_table) angeben.
- Tabellenlimits müssen nicht explizit festgelegt werden, da eine untergeordnete Tabelle die Grenzen einer übergeordneten Tabelle erbt.
Laden Sie den vollständigen Code TableJoins.go aus den Beispielen hier herunter.
Sie können eine Tabelle mit der Methode tableDDL erstellen. Diese Methode ist asynchron und gibt eine Zusage von TableResult zurück. TableResult ist ein einfaches JavaScript-Objekt, das den Status des DDL-Vorgangs enthält, wie TableState, Name, Schema und TableLimits. Details zur Methode finden Sie in der Klasse NoSQLClient.
Die Methode tableDDL nimmt das Objekt TableDDLOpt als zweites optionales Argument an. Wenn Sie eine Tabelle erstellen, müssen Sie deren TableLimits als Teil des opt-Arguments angeben. TableLimits gibt den maximalen Durchsatz und die maximale Speicherkapazität für die Tabelle als Menge an Leseeinheiten, Schreibeinheiten und Gigabyte Speicher an.
Laden Sie den vollständigen JavaScript-Code CreateTable.js aus den Beispielen hier und den vollständigen TypeScript-Code CreateTable.ts aus den Beispielen hier herunter.
import {NoSQLClient, TableState } from 'oracle-nosqldb';
const client = new NoSQLClient('config.json');
const TABLE_NAME = 'stream_acct;
async function createTable(handle) {
const createDDL = `CREATE TABLE IF NOT EXISTS
${TABLE_NAME} (acct_Id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(1),
acct_data JSON,
primary key(acct_Id))`;
/* For Provisioned Capacity specify read units, write units, and storage limit as shown below*/
/* For On-demand Capacity - set only the storage limit and specify the mode as shown here.
* { storageGB: 25, mode: CapacityMode.ON_DEMAND };
*/
let res = await handle.tableDDL(createDDL, {
complete: true,
tableLimits: {
readUnits: 20,
writeUnits: 20,
storageGB: 1
}
});
console.log('Created table: ' + TABLE_NAME);
}
const createDDL = `CREATE TABLE IF NOT EXISTS
${TABLE_NAME} (acct_Id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(1),
acct_data JSON,
primary key(acct_Id))`;
let res = await client.tableDDL(createDDL, {complete: true,});
console.log('Created table: ' + TABLE_NAME);Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung auszuführen und eine untergeordnete Tabelle zu erstellen.
- Sie müssen den vollständigen Namen der Tabelle angeben (name_parent_table.name_child_table)
- Tabellenlimits müssen nicht explizit festgelegt werden, da eine untergeordnete Tabelle die Grenzen einer übergeordneten Tabelle erbt.
Laden Sie den vollständigen JavaScript-Code TableJoins.js aus den Beispielen hier und den vollständigen TypeScript-Code TableJoins.ts aus den Beispielen hier herunter.
Um eine Tabelle zu erstellen, verwenden Sie eine der Methoden ExecuteTableDDLAsync oder ExecuteTableDDLWithCompletionAsync. Beide Methoden geben Task<TableResult> zurück. Die TableResult-Instanz enthält den Status des DDL-Vorgangs, wie TableState und das Tabellenschema. Weitere Informationen zu diesen Methoden finden Sie in der Oracle NoSQL Dotnet-SDK-API-Referenz.
private static async Task createTable(NoSQLClient client){
// Create a table
var sql =
$@"CREATE TABLE IF NOT EXISTS
{TableName}(acct_Id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(1),
acct_data JSON,
primary key(acct_Id))";
var tableResult = await client.ExecuteTableDDLAsync(sql,
new TableDDLOptions{TableLimits = new TableLimits(20, 20, 1)});
// Wait for the operation completion
await tableResult.WaitForCompletionAsync();
Console.WriteLine(" Created table: ",tableResult.TableName);
}Hinweis:
Tabellenlimits gelten nur für Oracle NoSQL Database Cloud Service. Wenn Limits für eine On-Premise-Datenbank NoSQL festgelegt sind, werden sie stillschweigend ignoriert.Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung auszuführen und eine untergeordnete Tabelle zu erstellen.
- Sie müssen den vollständigen Namen der Tabelle angeben (name_parent_table.name_child_table)
- Tabellenlimits müssen nicht explizit festgelegt werden, da eine untergeordnete Tabelle die Grenzen einer übergeordneten Tabelle erbt.
Laden Sie den vollständigen Code TableJoins.cs aus den Beispielen hier herunter.