API를 사용하여 단일 테이블 생성

테이블은 유저 데이터를 보유하는 기본 구조입니다. SQL 명령(CREATE TABLE 문) 또는 TableRequest API 명령을 사용하여 새 테이블을 생성합니다.

또한 Oracle NoSQL Cloud Infrastructure(OCI) 콘솔 또는 OCI 명령행 인터페이스(OCI-cli)를 사용하여 NDCS에서 테이블을 생성할 수도 있습니다.

테이블 생성을 위한 지침:

테이블 생성:

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, contactPhoneconfNo(예약 번호) 필드는 고정 스키마의 일부인 승객의 정보를 저장합니다. 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 user profile store를 참조하십시오.

또한 행이 자동으로 만료되어 더 이상 사용할 수 없는 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 데이터 유형으로 포함하여 고정 스키마의 변형을 정의합니다.

레코드는 하나 이상의 키-항목 쌍으로 구성된 정렬된 모음입니다. 레코드의 키는 문자열이어야 하며 연결된 항목의 데이터 유형이 다를 수 있습니다. 레코드의 필드는 고정 스키마의 일부이므로 추가하거나 제거할 수 없습니다. 위 예에서 firstName, lastName, countryshows 필드는 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_idstream_acctacct_data 테이블에 대한 샤드 키입니다.

TableRequest API 사용

TableRequest API를 사용하여 NoSQL 테이블을 생성할 수 있습니다.

TableRequest 클래스는 테이블을 생성하는 데 사용됩니다. 이 요청에 의해 지정된 작업의 실행은 비동기입니다. 이러한 작업은 장시간 실행되는 작업일 수 있습니다. TableResultTableRequest 작업에서 반환되며 테이블의 상태를 캡슐화합니다. TableRequest 클래스 및 해당 메소드에 대한 자세한 내용은 Oracle NoSQL Java SDK API Reference를 참조하십시오.

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 데이터베이스에 대한 제한이 설정된 경우 자동으로 무시됩니다.

하위 테이블 생성: 동일한 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를 참조하십시오.

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 데이터베이스에 대한 제한이 설정된 경우 자동으로 무시됩니다.

하위 테이블 생성: 동일한 TableRequest 클래스 및 메소드를 사용하여 DDL 문을 실행하여 하위 테이블을 생성합니다.

하위 테이블을 생성하는 중:

  • 테이블의 전체 이름(name_parent_table.name_child_table)을 지정해야 합니다.

  • 테이블 제한은 하위 테이블이 상위 테이블의 제한을 상속하므로 명시적으로 설정할 필요가 없습니다.

TableJoins.py 예제를 통해 여기에서 전체 코드를 다운로드하십시오.

TableRequest 클래스는 테이블을 생성하는 데 사용됩니다. TableRequest에 의해 지정된 작업의 실행은 비동기입니다. 이러한 작업은 장시간 실행되는 작업일 수 있습니다. 이 요청은 테이블이 원하는 상태에 도달할 때까지 폴링하는 데 사용할 수 있는 TableResult를 반환하는 Client.DoTableRequest() 작업의 입력으로 사용됩니다. TableRequest 클래스의 다양한 메소드에 대한 자세한 내용은 Oracle NoSQL Go SDK API Reference를 참조하십시오.

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 데이터베이스에 대한 제한이 설정된 경우 자동으로 무시됩니다.

하위 테이블 생성: 동일한 TableRequest 클래스 및 메소드를 사용하여 DDL 문을 실행하여 하위 테이블을 생성합니다.

하위 테이블을 생성하는 중:

  • 테이블의 전체 이름(name_parent_table.name_child_table)을 지정해야 합니다.

  • 테이블 제한은 하위 테이블이 상위 테이블의 제한을 상속하므로 명시적으로 설정할 필요가 없습니다.

TableJoins.go의 전체 코드를 여기에서 다운로드하십시오.

tableDDL 메소드를 사용하여 테이블을 생성할 수 있습니다. 이 메소드는 비동기적이며 TableResult의 Promise를 반환합니다. TableResult는 TableState, 이름, 스키마 및 해당 TableLimits와 같은 DDL 작업의 상태를 포함하는 일반 JavaScript 객체입니다. 메소드 세부 정보는 NoSQLClient 클래스를 참조하십시오.

tableDDL 메소드는 TableDDLOpt 객체를 두번째 선택적 인수로 사용합니다. 테이블을 생성할 때 해당 TableLimits를 opt 인수의 일부로 지정해야 합니다. TableLimits는 읽기 단위, 쓰기 단위 및 기가바이트 스토리지 크기로 테이블의 최대 처리량과 스토리지 용량을 지정합니다.

CreateTable.js 예제를 통해 여기에서 전체 JavaScript 코드와 CreateTable.ts 전체 TypeScript 코드를 여기에서 다운로드하십시오.

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

위의 호출이 반환되면 결과는 작업의 최종 상태를 반영합니다. 또는 complete 옵션을 사용하려면 위의 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)을 지정해야 합니다.

  • 테이블 제한은 하위 테이블이 상위 테이블의 제한을 상속하므로 명시적으로 설정할 필요가 없습니다.

TableJoins.js 예제를 통해 여기에서 전체 JavaScript 코드와 TableJoins.ts의 전체 TypeScript 코드를 여기에서 다운로드하십시오.

테이블을 생성하려면 ExecuteTableDDLAsync 또는 ExecuteTableDDLWithCompletionAsync 메소드 중 하나를 사용합니다. 이 두 메소드는 모두 Task<TableResult>를 반환합니다. TableResult 인스턴스는 TableState 및 테이블 스키마와 같은 DDL 작업의 상태를 포함합니다. 이러한 방법에 대한 자세한 내용은 Oracle NoSQL Dotnet SDK API Reference를 참조하십시오.

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 데이터베이스에 대한 제한이 설정된 경우 자동으로 무시됩니다.

하위 테이블 생성: 동일한 TableRequest 클래스 및 메소드를 사용하여 DDL 문을 실행하여 하위 테이블을 생성합니다.

하위 테이블을 생성하는 중:

  • 테이블의 전체 이름(name_parent_table.name_child_table)을 지정해야 합니다.

  • 테이블 제한은 하위 테이블이 상위 테이블의 제한을 상속하므로 명시적으로 설정할 필요가 없습니다.

TableJoins.cs 예제를 통해 여기에서 전체 코드를 다운로드하십시오.