Singleton-Tabellen mit APIs erstellen

Die Tabelle ist die grundlegende Struktur zum Speichern von Benutzerdaten. Sie verwenden einen SQL-Befehl (CREATE TABLE-Anweisung) oder TableRequest-API-Befehle, um eine neue Tabelle zu 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.

Richtlinien für die Erstellung einer Tabelle:

Tabelle erstellen:

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.

Beispiel 1: Erstellen Sie eine Anwendungstabelle für die Gepäckverfolgung von Fluggesellschaften, in der Gepäckinformationen von Fluggästen in einem Airline-System gespeichert sind.

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.

Beispiel 2: Erstellen Sie eine Streaming Media-Servicetabelle mit einem JSON-Feld, um die aktuelle Aktivität des Abonnenten zu verfolgen.

CREATE TABLE stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)USING TTL 5 DAYS

Im obigen Schema verwenden Sie die Anweisung CREATE TABLE, um eine stream_acct-Tabelle 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.

Beispiel 3: Erstellen Sie eine Streaming Media-Servicetabelle mit verschiedenen Festschemadefinitionen.

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 acct_data-Datensatz. 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.

Sie können die Datensätze auch wie folgt verschachteln:

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.

In den folgenden Schemas erstellen Sie die Tabelle 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. Neben der 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.

TableRequest-API verwenden

Mit der TableRequest-API können Sie NoSQL-Tabellen erstellen.

Die Klasse TableRequest wird zum Erstellen von Tabellen verwendet. Die Ausführung der von dieser Anforderung angegebenen Vorgänge ist asynchron. Dies sind möglicherweise Vorgänge mit langer Ausführungszeit. TableResult wird von TableRequest-Vorgängen zurückgegeben und kapselt den Status der Tabelle. Weitere Informationen zur TableRequest-Klasse und ihren Methoden finden Sie in der Oracle NoSQL Java SDK-API-Referenz.

Laden Sie den vollständigen Code CreateTable.java aus den Beispielen hier herunter.

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-NoSQL-Datenbank festgelegt sind, werden sie stillschweigend ignoriert.

Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung zum Erstellen einer untergeordneten Tabelle auszuführen.

Beim Erstellen einer untergeordneten Tabelle:

  • 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 Limits einer übergeordneten Tabelle erbt.

Laden Sie den vollständigen Code TableJoins.java aus den Beispielen herunter, um zu erfahren, wie Sie hier eine Tabelle mit über- und untergeordneten Elementen erstellen.

Die Klasse borneo.TableRequest wird zum Erstellen einer Tabelle verwendet. 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 zu warten, bis der Vorgang abgeschlossen ist. Weitere Informationen zu table_request und den Methoden finden Sie in der Oracle NoSQL Python-SDK-API-Referenz.

Laden Sie den vollständigen Code CreateTable.py aus den Beispielen hier herunter.

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-NoSQL-Datenbank festgelegt sind, werden sie stillschweigend ignoriert.

Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung zum Erstellen einer untergeordneten Tabelle auszuführen.

Beim Erstellen einer untergeordneten Tabelle:

  • 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 Limits einer übergeordneten Tabelle erbt.

Laden Sie den vollständigen Code TableJoins.py aus den Beispielen hier herunter.

Die Klasse TableRequest wird zum Erstellen einer Tabelle verwendet. Die Ausführung der mit TableRequest angegebenen Vorgänge ist asynchron. Dies sind möglicherweise Vorgänge 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.

Laden Sie den vollständigen Code CreateTable.go aus den Beispielen hier herunter.

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-NoSQL-Datenbank festgelegt sind, werden sie stillschweigend ignoriert.

Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung zum Erstellen einer untergeordneten Tabelle auszuführen.

Beim Erstellen einer untergeordneten Tabelle:

  • 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 Limits 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 einen Promise von TableResult zurück. TableResult ist ein einfaches JavaScript-Objekt, das den Status des DDL-Vorgangs enthält, wie TableState, Name, Schema und seine TableLimits. Methodendetails finden Sie in der Klasse NoSQLClient.

Die Methode tableDDL verwendet das Objekt TableDDLOpt als zweites optionales Argument. Wenn Sie eine Tabelle erstellen, müssen Sie die zugehörige TableLimits als Teil des Opt-Arguments angeben. Die TableLimits gibt den maximalen Durchsatz und die maximale Speicherkapazität für die Tabelle als Anzahl der 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);
}

Nachdem der obige Aufruf zurückgegeben wurde, spiegelt das Ergebnis den endgültigen Status des Vorgangs wider. Alternativ können Sie den Code im obigen Try-Catch-Block durch das folgende Codebeispiel ersetzen, um die vollständige Option zu verwenden.

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 zum Erstellen einer untergeordneten Tabelle auszuführen.

Beim Erstellen einer untergeordneten Tabelle:

  • 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 Limits einer übergeordneten Tabelle erbt.

Laden Sie den vollständigen JavaScript-Code TableJoins.js aus den Beispielen hier herunter, und den vollständigen TypeScript-Code TableJoins.ts aus den Beispielen hier.

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 von DDL-Vorgängen wie TableState und Tabellenschema. Weitere Informationen zu diesen Methoden finden Sie in der Oracle NoSQL Dotnet SDK-API-Referenz.

Laden Sie den vollständigen Code CreateTable.cs aus den Beispielen hier herunter.

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-NoSQL-Datenbank festgelegt sind, werden sie stillschweigend ignoriert.

Untergeordnete Tabelle erstellen: Sie verwenden dieselbe TableRequest-Klasse und dieselben Methoden, um eine DDL-Anweisung zum Erstellen einer untergeordneten Tabelle auszuführen.

Beim Erstellen einer untergeordneten Tabelle:

  • 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 Limits einer übergeordneten Tabelle erbt.

Laden Sie den vollständigen Code TableJoins.cs aus den Beispielen hier herunter.