API를 사용하여 싱글톤 테이블 생성
테이블은 유저 데이터를 보유하기 위한 기본 구조입니다. SQL 명령(CREATE TABLE 문) 또는 TableRequest API 명령을 사용하여 새 테이블을 생성합니다.
Oracle NoSQL Cloud Infrastructure(OCI) 콘솔 또는 OCI 명령행 인터페이스(OCI-cli)를 사용하여 NDCS에서 테이블을 생성할 수도 있습니다.
- 테이블 정의에는 하나 이상의 필드 정의와 정확히 하나의 기본 키 정의가 포함되어야 합니다. 기본 키 정의에 대한 자세한 내용은 테이블 생성을 참조하십시오.
- 필드 정의는 열 이름, 해당 데이터 유형, 열이 널 가능 여부, 선택적 기본값, 열이 IDENTITY 열인지 여부 및 선택적 설명을 지정합니다. 기본적으로 PRIMARY KEY 이외의 모든 필드는 null을 사용할 수 있습니다.
- 기본 키 사양(key_definition)에 대한 구문은 테이블의 기본 키 열을 정렬된 필드 이름 목록으로 지정합니다.
- TTL(Time-To-Live) 값은 행의 만료 시간을 계산하는 데 사용됩니다. 만료된 행은 질의 결과에 포함되지 않으며 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 필드로, 가입자가 보는 쇼의 세부정보를 저장합니다.
스트리밍 매체 서비스 응용 프로그램에 대한 자세한 내용은 Streaming Media Service - Persistent user profile store를 참조하십시오.
또한 행이 자동으로 만료되어 더 이상 사용할 수 없는 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 테이블에 대한 하위 테이블을 추가로 정의할 수 있습니다. 계층의 모든 테이블에는 계층에서 가장 높은 상위 테이블의 테이블 생성 명령문에 지정된 동일한 샤드 키 열이 있습니다. 이 예에서 상위 테이블의 기본 키 acct_id도 stream_acct 및 acct_data 테이블에 대한 샤드 키입니다.
관련 항목
TableRequest API 사용
TableRequest API를 사용하여 NoSQL 테이블을 생성할 수 있습니다.
TableRequest 클래스는 테이블을 생성하는 데 사용됩니다. 이 요청에 의해 지정된 작업의 실행은 비동기입니다. 이러한 작업은 장기적으로 실행될 수 있습니다. TableResult는 TableRequest 작업에서 반환되며 테이블의 상태를 캡슐화합니다. TableRequest 클래스 및 해당 메소드에 대한 자세한 내용은 Oracle NoSQL Java SDK API Reference를 참조하십시오.
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()를 호출해야 합니다. table_request 및 해당 메소드에 대한 자세한 내용은 Oracle NoSQL Python SDK API Reference를 참조하십시오.
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)을 지정해야 합니다.
- 하위 테이블이 상위 테이블의 제한을 상속하므로 테이블 제한을 명시적으로 설정할 필요는 없습니다.
TableJoins.py 예제에서 전체 코드 를 다운로드하십시오.
TableRequest 클래스는 테이블을 생성하는 데 사용됩니다. TableRequest로 지정된 작업의 실행은 비동기입니다. 이러한 작업은 장기적으로 실행될 수 있습니다. 이 요청은 Client.DoTableRequest() 작업의 입력으로 사용되며, 테이블이 원하는 상태에 도달할 때까지 폴링에 사용할 수 있는 TableResult를 반환합니다. TableRequest 클래스의 다양한 메소드에 대한 자세한 내용은 Oracle NoSQL Go SDK API Reference를 참조하십시오.
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)을 지정해야 합니다.
- 하위 테이블이 상위 테이블의 제한을 상속하므로 테이블 제한을 명시적으로 설정할 필요는 없습니다.
TableJoins.go 예제에서 전체 코드 를 다운로드하십시오.
tableDDL 메소드를 사용하여 테이블을 생성할 수 있습니다. 이 메소드는 비동기적이며 Promise TableResult를 반환합니다. TableResult는 TableState, 이름, 스키마 및 TableLimits와 같은 DDL 작업의 상태를 포함하는 일반 JavaScript 객체입니다. 메소드 세부 정보는 NoSQLClient 클래스를 참조하십시오.
tableDDL 메소드는 TableDDLOpt 객체를 두번째 선택적 인수로 사용합니다. 테이블을 생성할 때 해당 TableLimits를 opt 인수의 일부로 지정해야 합니다. 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);
}
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 인스턴스는 TableState 및 테이블 스키마와 같은 DDL 작업의 상태를 포함합니다. 이러한 방법에 대한 자세한 내용은 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)을 지정해야 합니다.
- 하위 테이블이 상위 테이블의 제한을 상속하므로 테이블 제한을 명시적으로 설정할 필요는 없습니다.
TableJoins.cs 예제에서 전체 코드 를 다운로드하십시오.