表の定義

Oracle NoSQL Databaseクライアントがストア内の表の読取りまたは書込みを実行する前に、まず表を作成する必要があります。実行方法はいくつかありますが、このドキュメントでは表DDL文を使用する方法を中心に説明します。これらの文は、管理コマンドライン・インタフェース(CLI)のexecuteコマンドまたはSQL CLIを使用してストアに直接送信できます。ただし、DDL文をストアにプログラムで送信する方法をお薦めします。この項では、直接的な方法とプログラムによる方法の両方について説明します。

表の定義に使用するDDL言語については、表データ定義言語概要で説明しています。この項では、この言語の使用方法を簡単に説明します。

初歩的な例として、myTableという名前の表を作成し、次の4つの列があるとします: itemdescriptioncountおよびpercentage。表を作成するには、SQL CLIから次の文を使用します。

sql-> CREATE TABLE myTable (
    item STRING,
    description STRING,
    count INTEGER,
    percentage DOUBLE,
    PRIMARY KEY (item) // Every table must have a primary key
); 
Statement completed successfully

注意:

主キーは、まだ説明していない概念です。主キーの機能および使用方法の詳細は、主キーとシャード・キーの設計を参照してください。ここでは、前述の例で示されているように、作成するすべての表に主キーが存在することを確認します。

プログラムによるDDL文の実行

表定義をプログラムでストアに追加するには、Store.executeFuture()またはStore.execute()メソッドを使用します。(後者のメソッドは文を同期的に実行します。)

次に例を示します。

...
    // Store handle configuration and open skipped for brevity
...

store.on('open', function () {

    console.log('Store opened');

    store.execute('CREATE TABLE IF NOT EXISTS myTable (' +
                        'id STRING, ' +
                        'description STRING, ' +
                        'count INTEGER, ' +
                        'percentage DOUBLE, ' +
                        'PRIMARY KEY (item)) ', 
        function(err){
        if (err)
            throw err;
        else {
            console.log('Table creation succeeded.');
            store.close();
        }
      });
}).on('close', function() {
    console.log('Store closed.');
}).on('error', function(error) {
    console.log(error);
});
store.open();

管理CLIからのDDL文の実行

管理CLIのexecuteコマンドを使用してDDL文を実行できます。これはDDL文を同期的に実行します。次に例を示します。

kv-> execute "CREATE TABLE myTable (
> item STRING, 
> description STRING, 
> count INTEGER, 
> percentage DOUBLE, 
> PRIMARY KEY (item))"
Statement completed successfully
kv-> 

サポートされている表データ型

Oracle NoSQL Database表の列ごとにスキーマを指定します。このスキーマはオブジェクトとしてハンドリングされるプリミティブ・データ型または複合データ型にできます。

Oracle NoSQL Database表は、次のデータ型をサポートしています。
データ型 説明
配列 すべてが同じ型の値の配列。
バイナリ 事前決定されている固定サイズのないバイト配列として実装されています。
ブール  
倍精度  
列挙 文字列の配列として表される列挙。
固定バイナリ 事前決定されている固定サイズのないバイト配列として実装されています。
浮動小数  
整数  
Json 任意の有効なJSONデータ。
ロング  
数値 任意の型の数値または任意の値や精度を処理できる数値型。
マップ すべてのエントリが1つの型に制約される、順序のないマップ型。
レコード 次の項を参照してください。
文字列  
タイムスタンプ 日付およびオプションで時間値をカプセル化する絶対タイムスタンプ。

node.jsでは、サポートされているデータ型は次のように処理されます。

Oracle NoSQL Databaseのデータ型 node.jsのデータ型
配列

Javascript配列。配列の使用を参照してください。

バイナリ

Base64でエンコードされたバッファ。バイナリの使用を参照してください。

ブール

Javascriptブール

倍精度

Javascript数値

列挙

Javascript文字列。列挙の使用を参照してください。

固定バイナリ

Base64でエンコードされたバッファ。固定バイナリの使用を参照してください。

浮動小数

Javascript数値

整数

Javascript数値

ロング

Javascript数値

マップ

Javascriptオブジェクト。マップの使用を参照してください。

レコード

Javascriptオブジェクト。埋込みレコードの使用を参照してください。

文字列

Javascript文字列

レコード・フィールド

「子表の定義」で説明したように、下位情報(連絡先データベースの住所、在庫システムのベンダー連絡先情報など)を保持する子表を作成できます。その際に、子表に無限の数の行を作成し、子表の行のフィールドに索引を付けることができます。

ただし、下位データを編成するために子表を作成する必要はありません。下位データの要件が単純な場合には、子表ではなくレコード・フィールドを使用できます。一般的に、各親表の行にレコードの固定の少数のインスタンスのみが必要な場合、子表のかわりにレコード・フィールドを使用できます。簡単なケース以外では、子表を使用してください。

注意:

簡単なケースでも子表を使用することにデメリットはありません。

レコード・フィールドを使用する際に前提となるのは、管理する既知の固定数レコードがあるということです(レコードを配列として編成しない場合)。たとえば、連絡先データベースでは、子表を使用すると、ユーザーごとに無制限の数の住所を関連付けることができます。子表ではなくレコードを使用すると、サポートされている住所(自宅、勤務先など)のレコード・フィールドを作成することで、固定数の住所を関連付けることができます。

次に例を示します。

CREATE TABLE myContactsTable (
    uid STRING,
    surname STRING,
    familiarName STRING,
    homePhone STRING,
    workPhone STRING,
    homeAddress RECORD (street STRING, city STRING, state STRING,
                zip INTEGER),
    workAddress RECORD (street STRING, city STRING, state STRING,
                zip INTEGER),
    PRIMARY KEY(uid)) 

レコード・フィールドの配列を作成することもできます。これにより、フィールドごとに無制限の数の住所フィールドを作成できます。ただし、一般的にこの例では子表を使用してください。

CREATE TABLE myContactsTable (
    uid STRING,
    surname STRING,
    familiarName STRING,
    homePhone STRING,
    workPhone STRING,
    addresses ARRAY(RECORD (street STRING, city STRING, state STRING,
                zip INTEGER))),
    PRIMARY KEY(uid)) 

子表の定義

Oracle NoSQL Database表は、親/子階層に編成できます。作成できる子表の数、および子表をネストできる深さに制限はありません。

デフォルトでは親表を取得しても子表は取得されません。同様に、子表を取得しても親表は取得されません。

子表を作成するには、<parentTableName>.<childTableName>の形式を使用して表に名前を付けます。たとえば、myInventoryという名前の簡単な表があるとします。

CREATE TABLE myInventory (
  itemCategory STRING,
  description STRING,
  PRIMARY KEY (itemCategory) 
) 

次のように、itemDetailsという子表を作成できます。

CREATE TABLE myInventory.itemDetails (
    itemSKU STRING,
    itemDescription STRING,
    price FLOAT,
    inventoryCount INTEGER,
    PRIMARY KEY (itemSKU)
) 

これを実行する場合、子表は親表の主キーを継承することに注意してください。この簡単なケースでは、子表の主キーは実際にはitemCategoryitemSKUの2つのフィールドです。これにはいくつかの悪影響があります。その1つは、子表を取得するときに親の主キー・フィールドが取得されるという点です。詳細は、「子表の取得」を参照してください。

複数リージョン表の定義

複数リージョン表、つまりMR表は、様々なリージョンまたはインストールで保管および保守されるグローバル論理表です。これは、複数のリージョンに存在するread-anywhereおよびwrite-anywhere表です。

フランクフルト、ロンドンおよびダブリンの3つのリージョンを持つOracle NoSQL Databaseについて考えてみます。3つのリージョンすべてについて、ユーザー詳細を格納するUsersという名前の表を作成するには、接続されたグラフ内の各KVStoreにMR表を作成し、その表がまたがるリージョンのリストを指定する必要があります。

たとえば、フランクフルトのリージョンでUsers表を作成し、リモート・リージョンとしてロンドンとダブリンを指定するには、フランクフルトのリージョンから次のコードを実行する必要があります。

CREATE TABLE Users (
  id INTEGER, 
  firstName STRING, 
  lastName STRING, 
  age INTEGER, 
  primary key (id)
) IN REGIONS London, Dublin;

Users表を3つすべてのリージョンのMR表として作成するには、ロンドンおよびダブリンのリージョンでもcreate table文を実行し、そのリモート・リージョンとして他の2つのリージョンを指定する必要があります。

注意:

このプレビュー・リリースのMR表では、TTL機能はサポートされていません。これは、今後のリリースで解除される一時的な制限です。

MR表の詳細は、概要ガイドMR表のライフ・サイクルを参照してください。

表のエボリューション

アプリケーションは長期間使用されるため、多くの場合、表を更新して、新規フィールドを追加したり不要になった既存のフィールドを削除する必要があります。表のエボリューションとは、フィールドを追加または削除したり、デフォルト値などのフィールド・プロパティを変更して、表定義を更新するために使用される用語です。特定の種類の列(IDENTITY列など)を追加して、値を自動的に増やすこともできます。すでにストアに存在する表のみが表のエボリューションの候補となります。

ALTER TABLE文を使用して、表のエボリューションを実行します。表定義の変更を参照してください。

注意:

フィールドが主キー・フィールドである場合、または索引に参加している場合は、フィールドを削除できません。表のエボリューション中は主キー・フィールドを追加することもできません。

たとえば、次の文は前の項で作成した表を展開します。この例では、APIまたはCLIを使用して、各文を連続してストアに送信します。

ALTER TABLE myInventory.itemDetails (ADD salePrice FLOAT)
ALTER TABLE myInventory.itemDetails (DROP inventoryCount)