APIを使用したシングルトン表の作成
表は、ユーザー・データを保持するための基本構造です。SQLコマンド(CREATE TABLE文)またはTableRequest APIコマンドを使用して、新しい表を作成します。
Oracle NoSQL Cloud Infrastructure(OCI)コンソールまたはOCIコマンドライン・インタフェース(OCI-cli)を使用して、NDCSに表を作成することもできます。
表作成時のガイドライン:
-
表定義には、少なくとも1つのフィールド定義と、正確に1つの主キー定義を含める必要があります。主キー定義の詳細は、表の作成を参照してください。
-
フィールド定義は、列の名前、データ型、列がNULL可能かどうか、オプションのデフォルト値、列がIDENTITY列かどうかおよびオプションのコメントを指定します。デフォルトでは、すべてのフィールド(PRIMARY KEY以外)はnull値可能です。
-
主キー仕様の構文(key_definition)は、表の主キー列をフィールド名の順序付きリストとして指定します。
-
存続時間(TTL)値は、行の有効期限を計算するために使用されます。期限切れになった行は問合せ結果に含まれず、最終的にOracle NoSQL Databaseによって表から自動的に削除されます。表の作成時にTTL値を指定すると、この表に挿入されるすべての行のデフォルトのTTLとして適用されます。
表の作成:
SQLコマンドの使用
SQLでCREATE TABLEコマンドを使用して、NoSQL表を作成できます。
次の項では、CREATE TABLE DDL文を使用して表を作成するときに使用できる様々なオプションについて説明します。
例1:航空会社システム内の乗客の手荷物情報を保持する航空会社手荷物追跡アプリケーション表を作成します。
CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)
前述のスキーマでは、CREATE TABLE文を使用してBaggageInfo表を定義します。乗客のチケット番号ticketNoは、表の主キーです。fullName、gender、contactPhoneおよびconfNo (予約番号)フィールドには、固定スキーマの一部である乗客の情報が格納されます。bagInfo列は、乗客のチェックイン手荷物の追跡情報を表すスキーマレスJSON配列です。
航空会社の手荷物追跡アプリケーションの詳細は、「航空会社の手荷物追跡アプリケーション」を参照してください。
例2: JSONフィールドを使用してストリーミング・メディア・サービス表を作成し、サブスクライバの現在のアクティビティを追跡します。
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
前述のスキーマでは、CREATE TABLE文を使用してstream_acct表を作成します。サブスクライバのアカウントIDであるacct_idフィールドは、この表の主キーです。フィールドprofile_name、account_expiryには、固定スキーマの一部であるビューア詳細が格納されます。acct_data列は、サブスクライバが表示した表示の詳細を格納するスキーマレスJSONフィールドです。
ストリーミング・メディア・サービス・アプリケーションの詳細は、Streaming Media Service - Persistentユーザー・プロファイル・ストアを参照してください
また、TTL値も指定すると、行が自動的に期限切れになり、使用できなくなります。TTL値は、HOURSまたはDAYSのいずれかである必要があります。このスキーマでは、表の行は5日後に期限切れになります。
例3:様々な固定スキーマ定義を使用して、ストリーミング・メディア・サービス表を作成します。
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)
)
前述のスキーマでは、acct_dataフィールドをRECORDデータ型として含めることで、固定スキーマのバリエーションを定義します。
レコードは、1つ以上のキーと項目のペアの順序付けられたコレクションです。レコード内のキーは文字列である必要があり、関連アイテムは異なるデータ型にすることができます。レコードのフィールドは固定スキーマの一部であるため、追加または削除できません。前述の例では、フィールドfirstName、lastName、countryおよびshowsがacct_dataレコードのキーです。レコードの定義は、データをより大きなデータ・セットの一部として格納する場合に便利です。フィールド・ステップ式を使用して、レコード内のサブセット全体を挿入/更新/フェッチできます。
次のようにレコードをネストすることもできます。
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)
)
showsフィールドは、表示された表示の詳細を追跡するために使用されるネストされたRECORD型です。
例4:ストリーミング・メディア・サービス表を階層表構造として作成します。
次のスキーマでは、stream_acct表を親表として、acct_data表を子表として作成します。
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))
前述の親子表定義では、ストリーミング・メディア・サービスは、1つのサブスクリプションで複数のユーザー・プロファイルをサポートできます。
acct_data表は、ユーザーのプロファイルを識別するための主キーprofile_idを持つ子表として定義します。acct_data表は、表の主キーの定義に加えて、その親stream_acct表のacct_id主キー列を暗黙的に継承します。
同じstream_acct親表の下に複数の子表を定義できます。acct_data表の子表をさらに定義できます。階層内のすべての表には同じシャード・キー列があり、これは階層内の最上位の親表の作成文で指定されます。この例では、親表の主キーacct_idは、stream_acct表およびacct_data表のシャード・キーでもあります。
TableRequest APIの使用
TableRequest APIを使用して、NoSQL表を作成できます。
TableRequestクラスは、表を作成するために使用します。このリクエストで指定された操作の実行は非同期です。これらは、長時間実行される可能性がある操作です。TableResultは、TableRequest操作から返され、表の状態をカプセル化します。TableRequestクラスおよびそのメソッドの詳細は、Oracle NoSQL Java SDK APIリファレンスを参照してください。
こちらにあるサンプル中からフル・コードCreateTable.javaをダウンロードします。
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);
}
ノート:表の制限は、Oracle NoSQL Database Cloud Serviceに対してのみ適用されます。オンプレミスのNoSQL Databaseの場合に制限が設定されていると、それらは暗黙的に無視されます。
子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。
子表の作成中:
-
表のフルネーム(name_parent_table.name_child_table)を指定する必要があります
-
子表が親表の制限を継承するため、表の制限を明示的に設定する必要はありません。
親子表の作成方法を理解するには、こちらでサンプルの一部からフル・コードTableJoins.javaをダウンロードします。
borneo.TableRequestクラスは、表を作成するために使用します。borneo.NoSQLHandle.table_request()へのすべてのコールは非同期であるため、結果を確認し、borneo.TableResult.wait_for_completion()をコールして操作が完了するまで待機する必要があります。table_requestとそのメソッドの詳細は、Oracle NoSQL Python SDK APIリファレンスを参照してください。
こちらにあるサンプル中からフル・コードCreateTable.pyをダウンロードします。
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()))
ノート:表の制限は、Oracle NoSQL Database Cloud Serviceに対してのみ適用されます。オンプレミスのNoSQL Databaseの場合に制限が設定されていると、それらは暗黙的に無視されます。
子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。
子表の作成中:
-
表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
-
子表が親表の制限を継承するため、表の制限を明示的に設定する必要はありません。
こちらのサンプルの中からフル・コードTableJoins.pyをダウンロードします。
TableRequestクラスは、表を作成するために使用します。TableRequestで指定された操作の実行は非同期です。これらは、長時間実行される可能性がある操作です。このリクエストは、Client.DoTableRequest()操作の入力として使用されます。これにより、表が目的の状態に達するまでポーリングするために使用できる、TableResultが返されます。TableRequestクラスの様々なメソッドの詳細は、Oracle NoSQL Go SDK APIリファレンスを参照してください。
こちらにあるサンプル中からフル・コードCreateTable.goをダウンロードします。
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
}
ノート:表の制限は、Oracle NoSQL Database Cloud Serviceに対してのみ適用されます。オンプレミスのNoSQL Databaseの場合に制限が設定されていると、それらは暗黙的に無視されます。
子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。
子表の作成中:
-
表のフルネーム(name_parent_table.name_child_table)を指定する必要があります。
-
子表が親表の制限を継承するため、表の制限を明示的に設定する必要はありません。
こちらにあるサンプル中からフル・コードTableJoins.goをダウンロードします。
tableDDLメソッドを使用して表を作成できます。このメソッドは非同期です。このメソッドでは、TableResultのPromiseが返されます。TableResultは、DDL操作のステータス(そのTableState、名前、スキーマ、そのTableLimitsなど)を含むプレーンなJavaScriptオブジェクトです。メソッドの詳細は、NoSQLClientクラスを参照してください。
tableDDLメソッドは、TableDDLOptオブジェクトを2番目のオプション引数として取ります。表を作成する場合は、opt引数の一部としてTableLimitsを指定する必要があります。TableLimitsでは、読取りユニット、書込みユニットおよびストレージのギガバイトの量として、表の最大スループットおよびストレージ容量が指定されます。
Download the full JavaScript code CreateTable.js from the examples here and the full TypeScript code CreateTable.ts from the examples here.
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);
}
前述のコールが返されると、結果にその操作の最終状態が反映されます。または、完全なオプションを使用するには、前述のtry-catchブロック内のコードを次のコード・サンプルに置き換えます。
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);
子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。
子表の作成中:
-
表のフルネーム(name_parent_table.name_child_table)を指定する必要があります
-
子表が親表の制限を継承するため、表の制限を明示的に設定する必要はありません。
Download the full JavaScript code TableJoins.js from the examples here and the full TypeScript code TableJoins.ts from the examples here.
表を作成するには、メソッドExecuteTableDDLAsyncまたはExecuteTableDDLWithCompletionAsyncを使用します。これら両方のメソッドで、Task<TableResult>が返されます。TableResultインスタンスには、DDL操作のステータス(TableStateや表スキーマなど)が含まれます。これらのメソッドの詳細は、Oracle NoSQL Dotnet SDK APIリファレンスを参照してください。
こちらにあるサンプル中からフル・コードCreateTable.csをダウンロードします。
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);
}
ノート:表の制限は、Oracle NoSQL Database Cloud Serviceに対してのみ適用されます。オンプレミスのNoSQL Databaseの場合に制限が設定されていると、それらは暗黙的に無視されます。
子表の作成:同じTableRequestクラスおよびメソッドを使用して、DDL文を実行して子表を作成します。
子表の作成中:
-
表のフルネーム(name_parent_table.name_child_table)を指定する必要があります
-
子表が親表の制限を継承するため、表の制限を明示的に設定する必要はありません。
こちらにあるサンプル中からフル・コードTableJoins.csをダウンロードします。