使用 API 建立單一表格
表格是存放使用者資料的基本結構。您可以使用 SQL 命令 (CREATE TABLE 敘述句) 或 TableRequest API 命令來建立新表格。
您也可以使用 Oracle NoSQL Cloud Infrastructure (OCI) 主控台或 OCI 命令行介面 (OCI-cli) 在 NDCS 中建立表格。
- 表格定義必須至少包含一個欄位定義與一個主索引鍵定義。如需主索引鍵定義的詳細資訊,請參閱建立表格。
- 欄位定義會指定資料欄的名稱、其資料類型、資料欄是否可為空值、選擇性預設值、資料欄是否為 IDENTITY 資料欄及選擇性註解。依預設,所有欄位 (PRIMARY KEY 除外) 都可為空值。
- 主索引鍵設定 (key_definition) 的語法指定表格的主索引鍵資料欄作為排序的欄位名稱清單。
- 存留時間 (TTL) 值用於計算資料列的到期時間。到期的資料列不會包含在查詢結果中,最終會由 Oracle NoSQL Database 自動從表格移除。如果您在建立表格時指定 TTL 值,它會套用作為插入此表格之每個資料列的預設 TTL。
使用 SQL 命令
您可以在 SQL 中使用 CREATE TABLE 命令來建立 NoSQL 表格。
下節標示使用 CREATE TABLE DDL 敘述句建立表格時可以使用的不同選項。
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 陣列,代表乘客入住行李的追蹤資訊。
有關航空公司行李追蹤申請的詳情,請參閱航空公司行李追蹤申請。
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 欄位,儲存訂閱者檢視的顯示詳細資訊。
如需串流媒體服務應用程式的詳細資訊,請參閱串流媒體服務 - 永久使用者設定檔存放區。
您也會指定 TTL 值,在此值之後,資料列就會自動到期且不再提供使用。TTL 值必須為 HOURS 或 DAYS。在此綱要中,表格的資料列會在 5 天後到期。
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 資料類型,以定義固定綱要的變化。
記錄是一或多個索引鍵 - 項目組的排序集合。記錄中的索引鍵必須是字串,且關聯的項目可以是不同的資料類型。記錄中的欄位是固定結構的一部分,您將無法新增或移除這些欄位。在上述範例中,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))使用上面的父項 - 子項表格定義,串流媒體服務可支援單一訂閱下的多個使用者設定檔。
您可以將 acct_data 表格定義為主索引鍵為 profile_id 的子項表格,以識別使用者的設定檔。除了定義表格的主索引鍵之外,acct_data 表格會隱含地繼承其父項 stream_acct 表格的 acct_id 主索引鍵資料欄。
您可以在相同的 stream_acct 父項表格底下定義多個子項表格。您可以進一步定義 acct_data 表格的子項表格。階層中的所有表格都具有相同的分區索引鍵資料欄,此資料欄是在階層中最高父項表格的 create table 敘述句中指定。在此範例中,父項表格的主索引鍵 acct_id 也是 stream_acct 和 acct_data 表格的分區索引鍵。
相關主題
使用 TableRequest API
您可以使用 TableRequest API 來建立 NoSQL 表格。
TableRequest 類別是用來建立表格。此要求所指定的作業執行非同步。這些作業可能會長時間執行。TableResult 會從 TableRequest 作業傳回,並且會封裝表格的狀態。請參閱 Oracle NoSQL Java SDK API Reference ,瞭解 TableRequest 類別及其方法的詳細資訊。
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 資料庫設定限制,則會忽略這些限制。建立子項表格:您可以使用相同的 TableRequest 類別和方法來執行 DDL 敘述句來建立子項表格。
- 您必須指定表格的完整名稱 (name_parent_table.name_child_table)
- 因為子項表格繼承父項表格的限制,所以未明確設定表格限制。
從範例下載完整程式碼 TableJoins.java,瞭解如何在此處建立父項子項表格。
borneo.TableRequest 類別是用來建立表格。對 borneo.NoSQLHandle.table_request() 的所有呼叫都是非同步的,因此必須檢查結果並呼叫 borneo.TableResult.wait_for_completion() 以等待作業完成。請參閱 Oracle NoSQL Python SDK API Reference ,瞭解 table_request 及其方法的詳細資訊。
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 資料庫設定限制,則會忽略這些限制。建立子項表格:您可以使用相同的 TableRequest 類別和方法來執行 DDL 敘述句來建立子項表格。
- 您必須指定表格的完整名稱 (name_parent_table.name_child_table)。
- 因為子項表格繼承父項表格的限制,所以未明確設定表格限制。
Download the full code TableJoins.py from the examples here.
TableRequest 類別是用來建立表格。TableRequest 指定的作業執行非同步。這些作業可能會長時間執行。此要求是用來作為 Client.DoTableRequest() 作業的輸入,它會傳回可用來輪詢的 TableResult,直到表格達到所需的狀態為止。請參閱 Oracle NoSQL Go SDK API Reference ,瞭解 TableRequest 類別各種方法的詳細資訊。
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 資料庫設定限制,則會忽略這些限制。建立子項表格:您可以使用相同的 TableRequest 類別和方法來執行 DDL 敘述句來建立子項表格。
- 您必須指定表格的完整名稱 (name_parent_table.name_child_table)。
- 因為子項表格繼承父項表格的限制,所以未明確設定表格限制。
Download the full code TableJoins.go from the examples here.
您可以使用 tableDDL 方法建立表格。此方法為非同步,而且會傳回 TableResult 的 Promise。TableResult 是包含 DDL 作業狀態的純 JavaScript 物件,例如其 TableState、名稱、綱要及其 TableLimits。如需方法詳細資訊,請參閱 NoSQLClient 類別。
tableDDL 方法採用 TableDDLOpt 物件作為第二個選擇性引數。建立表格時,您必須指定其 TableLimits 作為 opt 引數的一部分。TableLimits 指定表格的最大傳輸量和儲存容量作為讀取單位、寫入單位和儲存 GB 的大小。
從此處的範例下載完整的 JavaScript 程式碼 CreateTable.js,以及從此處的範例下載完整的 TypeScript 程式碼 CreateTable.ts 。
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);建立子項表格:您可以使用相同的 TableRequest 類別和方法來執行 DDL 敘述句來建立子項表格。
- 您必須指定表格的完整名稱 (name_parent_table.name_child_table)
- 因為子項表格繼承父項表格的限制,所以未明確設定表格限制。
從此處的範例下載完整的 JavaScript 程式碼 TableJoins.js,以及從此處的範例下載完整的 TypeScript 程式碼 TableJoins.ts 。
若要建立表格,請使用 ExecuteTableDDLAsync 或 ExecuteTableDDLWithCompletionAsync 方法。這兩種方法都會傳回 Task<TableResult>。TableResult 執行處理包含 DDL 作業的狀態,例如 TableState 和表格綱要。如需這些方法的詳細資訊,請參閱 Oracle NoSQL Dotnet SDK API Reference 。
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 資料庫設定限制,則會忽略這些限制。建立子項表格:您可以使用相同的 TableRequest 類別和方法來執行 DDL 敘述句來建立子項表格。
- 您必須指定表格的完整名稱 (name_parent_table.name_child_table)
- 因為子項表格繼承父項表格的限制,所以未明確設定表格限制。
Download the full code TableJoins.cs from the examples here.