Utilisation des API pour créer une table Singleton

La table est la structure de base qui contient les données des utilisateurs. Vous utilisez une commande SQL (énoncé CREATE TABLE) ou des commandes d'API TableRequest pour créer une nouvelle table.

Vous pouvez également utiliser la console Oracle NoSQL Cloud Infrastructure(OCI) ou l'interface de ligne de commande OCI (OCI-cli) pour créer une table dans NDCS.

Directives pour créer une table :

Créer une table :

Utiliser des commandes SQL

Vous pouvez utiliser la commande CREATE TABLE dans SQL pour créer des tables NoSQL.

La section suivante met en évidence différentes options qui peuvent être utilisées lors de la création d'une TABLE à l'aide de l'instruction LDD CREATE TABLE.

Exemple 1 : Créez une table d'application de suivi des bagages des compagnies aériennes qui contient les informations sur les bagages des passagers d'un système aérien.

CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)

Dans le schéma ci-dessus, vous utilisez l'énoncé CREATE TABLE pour définir une TABLE BaggageInfo. Le numéro de billet du passager, ticketNo, est la clé primaire du tableau. Les champs fullName, gender, contactPhone et confNo (numéro de réservation) stockent les informations du passager, qui font partie du schéma fixe. La colonne bagInfo est un tableau JSON sans schéma, qui représente les informations de suivi des bagages enregistrés d'un passager.

Pour plus de détails sur l'application de suivi des bagages des compagnies aériennes, voir Application de suivi des bagages des compagnies aériennes.

Exemple 2 : Créez une table de service de médias en continu avec un champ JSON pour suivre l'activité courante de l'abonné.

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

Dans le schéma ci-dessus, vous utilisez l'énoncé CREATE TABLE pour créer une TABLE stream_acct. L'ID compte de l'abonné, champ acct_id, est la clé primaire dans ce tableau. Les champs profile_name, account_expiry stockent les détails de consultation, qui font partie d'un schéma fixe. La colonne acct_data est un champ JSON sans schéma, qui stocke les détails des expositions consultées par un abonné.

Pour plus de détails sur l'application de service de médias en continu, voir Service de médias en continu - Magasin de profils d'utilisateur persistants

Vous spécifiez également une valeur de durée de vie, après laquelle les lignes expirent automatiquement et ne sont plus disponibles. La valeur de durée de vie doit être en heures ou en jours. Dans ce schéma, les lignes de la table expirent après 5 jours.

Exemple 3 : Créez une table de service de médias en continu avec diverses définitions de schéma fixe.

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)
)

Dans le schéma ci-dessus, vous définissez une variation du schéma fixe en incluant le champ acct_data comme type de données RECORD.

Un enregistrement est un ensemble ordonné d'une ou de plusieurs paires clé-élément. Les clés d'un enregistrement doivent être des chaînes et les éléments associés peuvent être de types de données différents. Les champs d'un enregistrement font partie du schéma fixe et vous ne pourrez pas les ajouter ou les supprimer. Dans l'exemple ci-dessus, les champs firstName, lastName, country et shows sont les clés de l'enregistrement acct_data. La définition d'un enregistrement est utile lorsque vous souhaitez stocker des données dans le cadre d'un jeu de données plus volumineux. Vous pouvez insérer/mettre à jour/extraire l'ensemble du sous-ensemble d'un enregistrement à l'aide des expressions d'étape de champ.

Vous pouvez également imbriquer les enregistrements comme suit :

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)
)

Le champ shows est un type RECORD imbriqué utilisé pour suivre les détails des présentations affichées.

Exemple 4 : Créez une table de service de médias en continu en tant que structure de table hiérarchique.

Dans les schémas suivants, vous créez une table stream_acct en tant que table parent et une table acct_data en tant que table enfant :

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))

Avec la définition de table parent-enfant ci-dessus, le service de médias en continu peut prendre en charge plusieurs profils d'utilisateur sous un seul abonnement.

Vous définissez la table acct_data en tant que table enfant avec une clé primaire profile_id pour identifier le profil d'un utilisateur. En plus de définir une clé primaire pour la table, la table acct_data hérite implicitement de la colonne de clé primaire acct_id de sa table stream_acct parent.

Vous pouvez définir plusieurs tables enfants sous la même table parent stream_acct. Vous pouvez définir davantage de tables enfants pour la table acct_data. Toutes les tables de la hiérarchie ont la même colonne de clé de partition, qui est spécifiée dans l'instruction de création de table de la table parent la plus élevée de la hiérarchie. Dans cet exemple, la clé primaire acct_id de la table parent est également la clé de partition pour les tables stream_acct et acct_data.

Exemple 5 : Créez une table de service de médias en continu avec la clé primaire en tant que colonne IDENTITY.

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 4 INCREMENT BY 1 NO CYCLE),
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)

Dans cet exemple, vous créez la table stream_acct avec les mêmes champs définis dans l'exemple 2. Toutefois, le schéma définit la clé primaire acct_id en tant que colonne IDENTITY. Lorsque vous définissez une colonne IDENTITY comme GENERATED BY DEFAULT AS IDENTITY, le système génère automatiquement les valeurs de la colonne IDENTITY si vous n'en fournissez pas. Le système commence à générer les valeurs acct_id à partir de 4, incrémentant de 1. Ainsi, les valeurs de la colonne acct_id seront 4, 5, 6… et ainsi de suite jusqu'à la valeur maximale du type de données LONG. Comme le schéma définit l'option NO CYCLE, le système génère une exception après la valeur maximale car il a atteint la fin du générateur de séquences.

Exemple 6 : Créez une table de service de médias en continu avec clé primaire comme type de données UUID.

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id STRING AS UUID GENERATED BY DEFAULT,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)

Dans cet exemple, vous créez la table stream_acct avec les mêmes champs définis dans l'exemple 2. Toutefois, le schéma définit la clé primaire acct_id comme un type de données UUID, GENERATED BY DEFAULT. Le système génère automatiquement une valeur pour la colonne UUID si vous n'en fournissez pas une. L'avantage potentiel de la définition de la clé primaire en tant que type de données UUID est que le système garantit l'unicité des colonnes IDENTITY uniquement dans un magasin de données NoSQL d'une région. Le type de données UUID génère un identificateur unique global pour les enregistrements d'une table couvrant plusieurs régions.

Tables de collecte JSON

Exemple 7 : Créez une table de service de médias en continu en tant que table de collection JSON.

Dans l'énoncé CREATE TABLE suivant, vous créez la TABLE stream_acct en tant que TABLE de collection JSON :

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
PRIMARY KEY(acct_id)) AS JSON COLLECTION

Cette table de collection JSON inclut acct_id comme champ de clé primaire. Il n'est pas nécessaire de fournir d'autre champ que le champ de clé primaire dans la commande LDD.

Lorsque vous insérez des données dans cette table, la table de collection JSON considère automatiquement les champs insérés autres que le champ acct_id comme des champs JSON. Vous pouvez utiliser cette table de collection JSON pour stocker et récupérer des données de diffusion TV uniquement sous forme de documents.

Exemple 8 : Créez une table d'application de magasinage en tant que table de collection JSON.

L'énoncé CREATE TABLE suivant définit une TABLE storeAcct, qui est une TABLE de collection JSON créée pour une application de magasinage. Cette table inclut contactPhone comme champ de clé primaire de la chaîne de type.

CREATE TABLE storeAcct(
contactPhone string,
primary key(contactPhone)) AS JSON COLLECTION

Utilisation de l'API TableRequest

Vous pouvez utiliser l'API TableRequest pour créer des tables NoSQL.

La classe TableRequest est utilisée pour créer des tables. L'exécution des opérations spécifiées par cette demande est asynchrone. Il s'agit d'opérations potentiellement de longue durée. TableResult est retourné par les opérations TableRequest et encapsule l'état de la table. Voir Informations de référence sur l'API de la trousse SDK Java pour Oracle NoSQL pour plus de détails sur la classe TableRequest et ses méthodes.

Téléchargez le code complet CreateTable.java à partir des exemples ici.

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);
}

Note : Les limites de table s'appliquent uniquement à Oracle NoSQL Database Cloud Service. Si des limites sont définies pour une base de données NoSQL sur place, elles sont ignorées silencieusement.

Création d'une table enfant : Vous utilisez la même classe TableRequest et les mêmes méthodes pour exécuter un énoncé LDD afin de créer une table enfant.

Lors de la création d'une table enfant :

  • Vous devez spécifier le nom complet de la table (name_parent_table.name_child_table)

  • Les limites de table n'ont pas besoin d'être définies explicitement car une table enfant hérite des limites d'une table parent.

Téléchargez le code complet TableJoins.java à partir des exemples pour comprendre comment créer une table parent-enfant ici.

Création d'une table de collection JSON :

La table de collection JSON inclut des documents avec un ou plusieurs champs de clé primaire et des champs JSON. L'exemple suivant crée une table stream_acct en tant que table de collection JSON :

/* Create a JSON collection table with an integer primary key */
private static void createTable(NoSQLHandle handle) throws Exception {
    String createTableDDL =
        "CREATE TABLE IF NOT EXISTS " + tableName +
        "(acct_Id INTEGER, PRIMARY KEY(acct_Id)) AS JSON COLLECTION";

    TableRequest treq = new TableRequest().setStatement(createTableDDL);

    System.out.println("Creating table");
    TableResult tres = handle.tableRequest(treq);

    /* The table request is asynchronous, so wait for the table to become active. */
    TableResult.waitForState(handle, tres.getTableName(), TableResult.State.ACTIVE, 60000, 1000);
}

La classe borneo.TableRequest est utilisée pour créer une table. Tous les appels à borneo.NoSQLHandle.table_request() sont asynchrones. Il est donc nécessaire de vérifier le résultat et d'appeler borneo.TableResult.wait_for_completion() pour attendre la fin de l'opération. Voir Informations de référence sur l'API de la trousse SDK Python pour Oracle NoSQL pour plus de détails sur table_request et ses méthodes.

Téléchargez le code complet CreateTable.py à partir des exemples ici.

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()))

Note : Les limites de table s'appliquent uniquement à Oracle NoSQL Database Cloud Service. Si des limites sont définies pour une base de données NoSQL sur place, elles sont ignorées silencieusement.

Création d'une table enfant : Vous utilisez la même classe TableRequest et les mêmes méthodes pour exécuter un énoncé LDD afin de créer une table enfant.

Lors de la création d'une table enfant :

  • Vous devez indiquer le nom complet de la table (name_parent_table.name_child_table).

  • Les limites de table n'ont pas besoin d'être définies explicitement car une table enfant hérite des limites d'une table parent.

Téléchargez le code complet TableJoins.py à partir des exemples ici.

Création d'une table de collection JSON :

La table de collection JSON inclut des documents avec un ou plusieurs champs de clé primaire et des champs JSON. L'exemple suivant crée une table stream_acct en tant que table de collection JSON :

# Create a JSON collection table with an integer primary key
statement = '''CREATE TABLE IF NOT EXISTS stream_acct
               (acct_Id INTEGER, PRIMARY KEY(acct_Id))
               AS JSON COLLECTION'''

print('Creating table: ' + statement)

request = TableRequest().set_statement(statement)

# Wait for 60 seconds, polling every 1 second
result = handle.do_table_request(request, 60000, 1000)
result.wait_for_completion(handle, 60000, 1000)

print('Created table: stream_acct')

La classe TableRequest est utilisée pour créer une table. L'exécution des opérations spécifiées par TableRequest est asynchrone. Il s'agit d'opérations potentiellement de longue durée. Cette demande est utilisée comme entrée d'une opération Client.DoTableRequest(), qui retourne une valeur TableResult qui peut être utilisée pour scruter jusqu'à ce que la table atteigne l'état souhaité. Voir Informations de référence sur l'API de la trousse SDK Oracle NoSQL Go pour plus de détails sur les différentes méthodes de la classe TableRequest.

Téléchargez le code complet CreateTable.go à partir des exemples ici.

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
}

Note : Les limites de table s'appliquent uniquement à Oracle NoSQL Database Cloud Service. Si des limites sont définies pour une base de données NoSQL sur place, elles sont ignorées silencieusement.

Création d'une table enfant : Vous utilisez la même classe TableRequest et les mêmes méthodes pour exécuter un énoncé LDD afin de créer une table enfant.

Lors de la création d'une table enfant :

  • Vous devez indiquer le nom complet de la table (name_parent_table.name_child_table).

  • Les limites de table n'ont pas besoin d'être définies explicitement car une table enfant hérite des limites d'une table parent.

Téléchargez le code complet TableJoins.go à partir des exemples ici.

Création d'une table de collection JSON :

La table de collection JSON inclut des documents avec un ou plusieurs champs de clé primaire et des champs JSON. L'exemple suivant crée une table stream_acct en tant que table de collection JSON :

/* Create a JSON collection table with an integer primary key */

func createTable(client *nosqldb.Client) error {
	tableName := "stream_acct"

	stmt := fmt.Sprintf(
		"CREATE TABLE IF NOT EXISTS %s "+
			"(acct_Id INTEGER, PRIMARY KEY(acct_Id)) "+
			"AS JSON COLLECTION",
		tableName,
	)

	fmt.Println("Creating table:", stmt)

	tableReq := &nosqldb.TableRequest{
		Statement: stmt,
	}

	tableRes, err := client.DoTableRequest(tableReq)
	if err != nil {
		return err
	}

	// Wait for 60 seconds, polling every 1 second.
	_, err = tableRes.WaitForCompletion(
		client,
		60*time.Second,
		time.Second,
	)
	if err != nil {
		return err
	}

	fmt.Println("Created table:", tableName)
	return nil
}

Vous pouvez créer une table à l'aide de la méthode tableDDL. Cette méthode est asynchrone et retourne une promesse de TableResult. TableResult est un objet JavaScript brut qui contient le statut de l'opération LDD, notamment son état TableState, son nom, son schéma et ses limites TableLimits. Pour plus de détails sur la méthode, voir la classe NoSQLClient.

La méthode tableDDL prend l'objet TableDDLOpt comme deuxième argument facultatif. Lorsque vous créez une table, vous devez spécifier TableLimits dans le cadre de l'argument opt. TableLimits indique le débit maximal et la capacité de stockage pour la table en tant que quantité d'unités de lecture, d'unités d'écriture et de gigaoctets de stockage.

Téléchargez le code JavaScript complet CreateTable.js à partir des exemples ici et le code TypeScript complet CreateTable.ts à partir des exemples ici.

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);
}

Après le retour de l'appel ci-dessus, le résultat reflétera l'état final de l'opération. Alternativement, pour utiliser l'option complète, remplacez le code dans le bloc try-catch ci-dessus par l'exemple de code suivant.

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);

Création d'une table enfant : Vous utilisez la même classe TableRequest et les mêmes méthodes pour exécuter un énoncé LDD afin de créer une table enfant.

Lors de la création d'une table enfant :

  • Vous devez spécifier le nom complet de la table (name_parent_table.name_child_table)

  • Les limites de table n'ont pas besoin d'être définies explicitement car une table enfant hérite des limites d'une table parent.

Téléchargez le code JavaScript complet TableJoins.js à partir des exemples ici et le code TypeScript complet TableJoins.ts à partir des exemples ici.

Création d'une table de collection JSON :

La table de collection JSON inclut des documents avec un ou plusieurs champs de clé primaire et des champs JSON. L'exemple suivant crée une table stream_acct en tant que table de collection JSON :

/* Create a JSON collection table with an integer primary key */

const client = new NoSQLClient('config.json');
const TABLE_NAME = 'stream_acct';

async function createTable() {
    const createDDL =
        `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} ` +
        `(acct_Id INTEGER, PRIMARY KEY(acct_Id)) ` +
        `AS JSON COLLECTION`;

    console.log('Create table: ' + createDDL);

    try {
        await client.tableDDL(createDDL, {
            complete: true
        });

        console.log('Created table: ' + TABLE_NAME);
    } catch (error) {
        console.error('Table creation failed:', error);
        throw error;
    }
}

Pour créer une table, utilisez l'une des méthodes ExecuteTableDDLAsync ou ExecuteTableDDLWithCompletionAsync. Ces deux méthodes retournent Task<TableResult>. L'instance TableResult contient le statut de l'opération LDD telle que TableState et le schéma de table. Voir Informations de référence sur l'API de la trousse SDK Oracle NoSQL Dotnet pour plus de détails sur ces méthodes.

Téléchargez le code complet CreateTable.cs à partir des exemples ici.

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);
}

Note : Les limites de table s'appliquent uniquement à Oracle NoSQL Database Cloud Service. Si des limites sont définies pour une base de données NoSQL sur place, elles sont ignorées silencieusement.

Création d'une table enfant : Vous utilisez la même classe TableRequest et les mêmes méthodes pour exécuter un énoncé LDD afin de créer une table enfant.

Lors de la création d'une table enfant :

  • Vous devez spécifier le nom complet de la table (name_parent_table.name_child_table)

  • Les limites de table n'ont pas besoin d'être définies explicitement car une table enfant hérite des limites d'une table parent.

Téléchargez le code complet TableJoins.cs à partir des exemples ici.

Création d'une table de collection JSON :

La table de collection JSON inclut des documents avec un ou plusieurs champs de clé primaire et des champs JSON. L'exemple suivant crée une table stream_acct en tant que table de collection JSON :

/* Create a JSON collection table with an integer primary key */

private static async Task CreateTableAsync(NoSQLClient client)
{
    const string tableName = "stream_acct";

    var statement =
        $"CREATE TABLE IF NOT EXISTS {tableName} " +
        "(acct_Id INTEGER, PRIMARY KEY(acct_Id)) " +
        "AS JSON COLLECTION";

    Console.WriteLine($"Creating table: {statement}");

    var result = await client.ExecuteTableDDLAsync(statement);
    await result.WaitForCompletionAsync();

    Console.WriteLine($"Table {tableName} created.");
}