Utilizzo delle API per creare una tabella Singleton

La tabella è la struttura di base per contenere i dati utente. Utilizzare un comando SQL (istruzione CREATE TABLE) o i comandi API TableRequest per creare una nuova tabella.

È inoltre possibile utilizzare la console Oracle NoSQL Cloud Infrastructure (OCI) o l'interfaccia della riga di comando OCI (OCI-cli) per creare una tabella in NDCS.

Linee guida per la creazione di una tabella:
  • La definizione della tabella deve includere almeno una definizione di campo ed esattamente una definizione di chiave primaria. Per ulteriori informazioni sulla definizione della chiave primaria, vedere Crea tabella.
  • La definizione del campo specifica il nome della colonna, il relativo tipo di dati, se la colonna è annullabile o meno, un valore predefinito facoltativo, se la colonna è una colonna IDENTITY e un commento facoltativo. Tutti i campi (diversi dalla chiave primaria) sono annullabili per impostazione predefinita.
  • La sintassi per la specifica della chiave primaria (key_definition) specifica le colonne della chiave primaria della tabella come elenco ordinato di nomi di campo.
  • Il valore TTL (Time-To-Live) viene utilizzato per calcolare l'ora di scadenza di una riga. Le righe scadute non vengono incluse nei risultati della query e vengono rimosse automaticamente dalla tabella da Oracle NoSQL Database. Se si specifica un valore TTL durante la creazione della tabella, viene applicato come TTL predefinito per ogni riga inserita in questa tabella.

Uso dei comandi SQL

È possibile utilizzare il comando CREATE TABLE in SQL per creare le tabelle NoSQL.

Nella sezione seguente vengono evidenziate le diverse opzioni che è possibile utilizzare durante la creazione di una tabella mediante l'istruzione CREATE TABLE DDL.

Esempio 1: creare una tabella dell'applicazione di tracciamento dei bagagli delle compagnie aeree che contiene le informazioni sui bagagli dei passeggeri in un sistema aereo.
CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)

Nello schema precedente, è possibile utilizzare l'istruzione CREATE TABLE per definire una tabella BaggageInfo. Il numero del biglietto del passeggero, ticketNo, è la chiave primaria della tabella. I campi fullName, gender, contactPhone e confNo (numero prenotazione) memorizzano le informazioni del passeggero, che fanno parte di uno schema fisso. La colonna bagInfo è un array JSON senza schema, che rappresenta le informazioni di tracciamento del bagaglio registrato di un passeggero.

Per ulteriori dettagli sull'applicazione di tracciamento dei bagagli delle compagnie aeree, vedere Applicazione di tracciamento dei bagagli delle compagnie aeree.

Esempio 2: creare una tabella del servizio di streaming multimediale con un campo JSON per tenere traccia dell'attività corrente del sottoscrittore.
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

Nello schema precedente, è possibile utilizzare l'istruzione CREATE TABLE per creare una tabella stream_acct. Il campo ID account sottoscrittore acct_id è la chiave primaria in questa tabella. I campi profile_name e account_expiry memorizzano i dettagli del visualizzatore, che fanno parte dello schema fisso. La colonna acct_data è un campo JSON senza schema, che memorizza i dettagli degli spettacoli visualizzati da un sottoscrittore.

Per ulteriori dettagli sull'applicazione del servizio multimediale in streaming, vedere Streaming Media Service - Area di memorizzazione profili utente persistente.

È inoltre possibile specificare un valore TTL, dopo il quale le righe scadono automaticamente e non sono più disponibili. Il valore TTL deve essere espresso in ORE o GIORNI. In questo schema, le righe della tabella scadono dopo 5 giorni.

Esempio 3: creare una tabella del servizio di streaming multimediale con varie definizioni di schema fisso.
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)
)
Nello schema precedente, è possibile definire una variazione dello schema fisso includendo il campo acct_data come tipo di dati RECORD.

Un record è una raccolta ordinata di una o più coppie chiave-elemento. Le chiavi in un record devono essere stringhe e gli elementi associati possono essere di tipi di dati diversi. I campi di un record fanno parte dello schema fisso e non sarà possibile aggiungerli o rimuoverli. Nell'esempio precedente, i campi firstName, lastName, country e shows sono le chiavi per il record acct_data. La definizione di un record è utile quando si desidera memorizzare i dati come parte di un set di dati più grande. È possibile inserire/aggiornare/recuperare l'intero subset in un record utilizzando le espressioni dei passi di campo.

È inoltre possibile nidificare i record come indicato di seguito.
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)
)

Il campo shows è un tipo di RECORD nidificato utilizzato per tenere traccia dei dettagli degli spettacoli visualizzati.

Esempio 4: creare una tabella dei servizi multimediali di streaming come struttura gerarchica della tabella.

Negli schemi riportati di seguito è possibile creare una tabella stream_acct come tabella padre e una tabella acct_data come tabella figlio.
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))

Con la definizione di tabella padre-figlio precedente, il servizio di streaming multimediale può supportare più profili utente in una singola sottoscrizione.

La tabella acct_data viene definita come tabella figlio con chiave primaria profile_id per identificare il profilo di un utente. Oltre a definire una chiave primaria per la tabella, la tabella acct_data eredita implicitamente la colonna di chiave primaria acct_id della relativa tabella stream_acct padre.

È possibile definire più tabelle figlio nella stessa tabella padre stream_acct. È possibile definire ulteriormente le tabelle figlio per la tabella acct_data. Tutte le tabelle nella gerarchia hanno la stessa colonna chiave partizione, specificata nell'istruzione di creazione tabella della tabella padre più alta della gerarchia. In questo esempio, la chiave primaria acct_id della tabella padre è anche la chiave partizione per le tabelle stream_acct e acct_data.

Utilizzo dell'API TableRequest

È possibile utilizzare l'API TableRequest per creare tabelle NoSQL.

La classe TableRequest viene utilizzata per creare le tabelle. L'esecuzione delle operazioni specificate da questa richiesta è asincrona. Si tratta di operazioni potenzialmente di lunga durata. TableResult viene restituito dalle operazioni TableRequest e incapsula lo stato della tabella. Per ulteriori dettagli sulla classe TableRequest e sui relativi metodi, vedere Oracle NoSQL Java SDK API Reference.

Scarica il codice completo CreateTable.java dagli esempi qui.
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);
}

Nota

I limiti delle tabelle sono applicabili solo a Oracle NoSQL Database Cloud Service. Se vengono impostati limiti per un database NoSQL on premise, questi vengono ignorati in background.

Creazione di una tabella figlio: utilizzare la stessa classe e gli stessi metodi TableRequest per eseguire l'istruzione DDL e creare una tabella figlio.

Durante la creazione di una tabella figlio:
  • È necessario specificare il nome completo della tabella (name_parent_table.name_child_table)
  • I limiti della tabella non devono essere impostati in modo esplicito poiché una tabella figlio eredita i limiti di una tabella padre.

Scarica il codice completo TableJoins.java dagli esempi per capire come creare una tabella padre-figlio qui.

La classe borneo.TableRequest viene utilizzata per creare una tabella. Tutte le chiamate a borneo.NoSQLHandle.table_request() sono asincrone, pertanto è necessario controllare il risultato e chiamare borneo.TableResult.wait_for_completion() per attendere il completamento dell'operazione. Per ulteriori informazioni su table_request e sui relativi metodi, vedere Oracle NoSQL Python SDK API Reference.

Scarica il codice completo CreateTable.py dagli esempi qui.
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()))

Nota

I limiti delle tabelle sono applicabili solo a Oracle NoSQL Database Cloud Service. Se vengono impostati limiti per un database NoSQL on premise, questi vengono ignorati in background.

Creazione di una tabella figlio: utilizzare la stessa classe e gli stessi metodi TableRequest per eseguire l'istruzione DDL e creare una tabella figlio.

Durante la creazione di una tabella figlio:
  • È necessario specificare il nome completo della tabella (name_parent_table.name_child_table).
  • I limiti della tabella non devono essere impostati in modo esplicito poiché una tabella figlio eredita i limiti di una tabella padre.

Scarica il codice completo TableJoins.py dagli esempi qui.

La classe TableRequest viene utilizzata per creare una tabella. L'esecuzione delle operazioni specificate da TableRequest è asincrona. Si tratta di operazioni potenzialmente di lunga durata. Questa richiesta viene utilizzata come input di un'operazione Client.DoTableRequest(), che restituisce un valore TableResult che può essere utilizzato per eseguire il polling fino a quando la tabella non raggiunge lo stato desiderato. Per ulteriori dettagli sui vari metodi della classe TableRequest, consulta Oracle NoSQL Go SDK API Reference.

Scarica il codice completo CreateTable.go dagli esempi qui.
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
}

Nota

I limiti delle tabelle sono applicabili solo a Oracle NoSQL Database Cloud Service. Se vengono impostati limiti per un database NoSQL on premise, questi vengono ignorati in background.

Creazione di una tabella figlio: utilizzare la stessa classe e gli stessi metodi TableRequest per eseguire l'istruzione DDL e creare una tabella figlio.

Durante la creazione di una tabella figlio:
  • È necessario specificare il nome completo della tabella (name_parent_table.name_child_table).
  • I limiti della tabella non devono essere impostati in modo esplicito poiché una tabella figlio eredita i limiti di una tabella padre.

Scarica il codice completo TableJoins.go dagli esempi qui.

È possibile creare una tabella utilizzando il metodo tableDDL. Questo metodo è asincrono e restituisce una promessa di TableResult. TableResult è un oggetto JavaScript non codificato che contiene lo stato dell'operazione DDL, ad esempio TableState, nome, schema e TableLimits. Per ulteriori informazioni sul metodo, vedere la classe NoSQLClient.

Il metodo tableDDL accetta l'oggetto TableDDLOpt come secondo argomento facoltativo. Quando si crea una tabella, è necessario specificarne TableLimits come parte dell'argomento opt. Il valore TableLimits specifica la capacità massima di throughput e storage per la tabella come la quantità di unità di lettura, di scrittura e GB di storage.

Scarica il codice JavaScript completo CreateTable.js dagli esempi qui e il codice TypeScript completo CreateTable.ts dagli esempi qui.

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);
}
Dopo il ritorno della chiamata precedente, il risultato rifletterà lo stato finale dell'operazione. In alternativa, per utilizzare l'opzione completa, sostituire il codice nel blocco try-catch sopra con il seguente esempio di codice.
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);

Creazione di una tabella figlio: utilizzare la stessa classe e gli stessi metodi TableRequest per eseguire l'istruzione DDL e creare una tabella figlio.

Durante la creazione di una tabella figlio:
  • È necessario specificare il nome completo della tabella (name_parent_table.name_child_table)
  • I limiti della tabella non devono essere impostati in modo esplicito poiché una tabella figlio eredita i limiti di una tabella padre.

Scarica il codice JavaScript completo TableJoins.js dagli esempi qui e il codice TypeScript completo TableJoins.ts dagli esempi qui.

Per creare una tabella, utilizzare uno dei metodi ExecuteTableDDLAsync o ExecuteTableDDLWithCompletionAsync. Entrambi questi metodi restituiscono Task<TableResult>. L'istanza TableResult contiene lo stato dell'operazione DDL, ad esempio TableState e lo schema di tabella. Per ulteriori dettagli su questi metodi, consulta Oracle NoSQL Riferimento API SDK Dotnet.

Scarica il codice completo CreateTable.cs dagli esempi qui.
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);  
}

Nota

I limiti delle tabelle sono applicabili solo a Oracle NoSQL Database Cloud Service. Se vengono impostati limiti per un database NoSQL on premise, questi vengono ignorati in background.

Creazione di una tabella figlio: utilizzare la stessa classe e gli stessi metodi TableRequest per eseguire l'istruzione DDL e creare una tabella figlio.

Durante la creazione di una tabella figlio:
  • È necessario specificare il nome completo della tabella (name_parent_table.name_child_table)
  • I limiti della tabella non devono essere impostati in modo esplicito poiché una tabella figlio eredita i limiti di una tabella padre.

Scarica il codice completo TableJoins.cs dagli esempi qui.