第4章 Oracle NoSQL Database表および索引の概要

目次

表の定義
子表の定義
サポートされている表データ型
レコード・フィールド
既存のAvroスキーマを使用した表の定義
表のエボリューション
表操作コマンド
索引の作成
索引操作コマンド

Oracle NoSQL Database表APIは、Oracle NoSQL Databaseクライアント・アプリケーションのコーディング方法として推奨されています。ユーザーは表メタファを使用してデータを操作できます。表メタファでは、データは複数列のデータに編成されます。このAPIでは無限の数のサブ表がサポートされています。表に対する問合せの速度を向上する索引を作成することもできます。

注意

表APIとキー/値APIの両方を使用する混合クライアントがストアにアクセスする場合、キーの衝突の可能性を避ける必要があります。

表の作成、削除およびエボリューションは、コマンドライン・インタフェース(CLI)を使用して行われます。表の各列でサポートされるデータ型など、表を定義するにはCLIを使用します。CLIを使用して索引を定義することもできます。CLIを使用して表を作成した後、表APIを使用して、その表に格納されたデータの読取りおよび書込みを実行します。

表の定義

Oracle NoSQL Databaseクライアントがストア内の表の読取りまたは書込みを実行する前に、コマンドライン・インタフェース(CLI)を使用して表を作成する必要があります。CLIを使用して対話形式で表を定義することもできますが、企業環境で使用する表定義を作成する場合には困難を伴います。コードを開発環境からテスト環境または本番環境に移行する際の誤字を避けるために、スクリプトを使用して表定義を実行することをお薦めします。

CLIスクリプトは、1つのテキスト・ファイル(1行に1つのコマンド)に含まれる一連のCLIコマンドです。スクリプトを実行するには、CLIを起動してloadコマンドを使用します。

たとえば、行ごとに4つの列(itemcount1count2およびpercentage)があるmyTableという名前の表を使用するとします。この表を作成するには、CLIにログインしてtable createadd-fieldprimary-keyおよびplan add-tableコマンドを対話形式で使用します。これらのすべてのコマンドを、次のような1つのプレーン・テキスト・ファイルにまとめることもできます。

## Enter into table creation mode
## This enters into a submode for the CLI, which offers
## commands specifically used to define tables.
table create -name myTable
## Now add the fields
add-field -type STRING -name item
add-field -type STRING -name description
add-field -type INTEGER -name count
add-field -type DOUBLE -name percentage
## A primary key must be defined for every table
## Here, we will define field 'item' as the primary key.
primary-key -field item
## Exit table creation mode, returning to the 
## main CLI commands.
exit
## Add the table to the store. Use the -wait flag to
## force the script to wait for the plan to complete
## before doing anything else.
plan add-table -name myTable -wait 

注意

主キーは、このマニュアルではまだ説明していない概念です。主キーの機能および使用方法の詳細は、「主キーとシャード・キーの設計」を参照してください。

スクリプトを実行するには、CLIを起動してloadコマンドを使用します。前述のスクリプトをcreateTable.txtという名前のファイルに配置したとします。

> java -Xmx256m -Xms256m \
-jar KVHOME/lib/kvstore.jar runadmin -host <hostName> \
-port <port> -store <storeName>
kv-> load -file createTable.txt
Table myTable built
Executed plan 8, waiting for completion...
Plan 8 ended successfully

kv-> 

注意

前述の例では、安全でないストアに接続していることを前提としています。安全なストアを使用している場合、CLIの起動時に認証する必要があります。そのためには、-admin-securityコマンドライン・オプションを使用します。

このようにすべての表および索引の操作を実行することで、開発/テスト/本番のデプロイメント・サイクル全体で一貫したストア環境を確保できます。

子表の定義

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

親表を取得しても子表は取得されません。同様に、子表を取得しても親表は取得されません。

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

## Enter into table creation mode
table create -name myTable
## Now add the fields
add-field -type STRING -name itemCategory
add-field -type STRING -name description
## A primary key must be defined for every table
## Here, we will define field 'itemCategory' as the primary key.
primary-key -field itemCategory
## Exit table creation mode
exit
## Add the table to the store. Use the -wait flag to
## force the script to wait for the plan to complete
## before doing anything else.
plan add-table -name myTable -wait 

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

## Enter into table creation mode
## This 'table create' will fail if 'plan add-table -name myTable'
## is not run first.
table create -name myTable.myChildTable
## Now add the fields
add-field -type STRING -name itemSKU
add-field -type STRING -name itemDescription
add-field -type FLOAT -name price
add-field -type INTEGER -name inventoryCount
## Define the primary key
primary-key -field itemSKU
## Exit table creation mode
exit
## Add the table to the store.
plan add-table -name myTable.myChildTable -wait 

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

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

Oracle NoSQL Database表の列ごとにスキーマを指定します。このスキーマは、単純なデータ型にすることも、複雑なデータ型にすることもできます。

サポートされている単純なデータ型は次のとおりです。

  • Boolean

  • Double

  • Float

  • Integer

  • Long

  • Javaバイト配列

  • Java文字列

サポートされている複雑なデータ型は、実際には非原子的であり、クラス・オブジェクトとして操作されます。場合によっては、これによりOracle NoSQL Databaseはいくつかのデータ制限(最小データ値や最大データ値など)を満たすことができます。複雑なデータ型は次のとおりです。

  • Array

    値の配列。配列全体で一貫した値タイプを使用する必要はありません。

  • Enum

    文字列の配列として表される列挙。

  • Fixed Binary

    単純なバイナリ型。

  • Map

    すべてのエントリが1つの型に制約される、順序のないマップ型。

レコード・フィールド

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

子表を使用する短所は、親表とは別のレコードとして内部的に格納される点です。つまり、子表の作成/更新/削除は複数のI/O要求を表すため、パフォーマンスに制約のあるアプリケーションにとって重要であるということです。

下位データの非常に単純な要件があり、下位データのフィールドに索引付けをしない場合、子表のかわりにレコード・フィールドを使用できます。つまり、子表で必要な複数のI/Oを回避できます。短所は、レコード・フィールドに含まれるフィールドに索引付けできないという点です。

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

add-record-fieldを使用してレコード・フィールドを作成します。これにより、表を作成するときに実行するのと同じように終了する必要があるCLI内の特別なサブモードが開始されます。

## Enter into table creation mode
table create -name myContactsTable
## Now add the fields
add-field -type STRING -name uid
add-field -type STRING -name surname
add-field -type STRING -name familiarName
add-field -type STRING -name homePhone
add-field -type STRING -name workPhone

## Create a record field. This puts us into a new submode.
add-record-field -name homeAddress
add-field -type STRING -name street 
add-field -type STRING -name city
add-field -type STRING -name state
add-field -type INTEGER -name zip -min 00000 -max 99999
### Exit record field creation mode
exit

## Add a second record field
add-record-field -name workAddress
add-field -type STRING -name street 
add-field -type STRING -name city
add-field -type STRING -name state
add-field -type INTEGER -name zip -min 00000 -max 99999
### Exit record field creation mode
exit

## A primary key must be defined for every table
primary-key -field uid
## Exit table creation mode
exit
## Add the table to the store. Use the -wait flag to
## force the script to wait for the plan to complete
## before doing anything else.
plan add-table -name myContactsTable -wait 

レコード・フィールドの配列を作成することもできます。これにより、フィールドごとに無制限の数の住所フィールドを作成できます。

## Enter into table creation mode
table create -name myContactsTable
## Now add the fields
add-field -type STRING -name uid
add-field -type STRING -name surname
add-field -type STRING -name familiarName
add-field -type STRING -name homePhone
add-field -type STRING -name workPhone

## Create an array field. This puts us into a new submode.
add-array-field -name addresses

## Create a record field for the array.
## This puts us into a new submode.
add-record-field -name address
add-field -type ENUM -name addressType -enum-values home,work,other
add-field -type STRING -name street
add-field -type STRING -name city
add-field -type STRING -name state
add-field -type INTEGER -name zip -min 00000 -max 99999
### Exit record field creation mode
exit

### Exit array field creation mode
exit

## A primary key must be defined for every table
primary-key -field uid
## Exit table creation mode
exit
## Add the table to the store. Use the -wait flag to
## force the script to wait for the plan to complete
## before doing anything else.
plan add-table -name myContactsTable -wait

注意

埋込みレコード・フィールドを使用する場合、レコード内のフィールドに索引付けすることはできません。索引付けを実行できるのは、最上位レベルのフィールドのみです。したがって、索引を作成、つまりzipフィールドを作成する場合、この情報を子表の形式で管理する必要があります。

既存のAvroスキーマを使用した表の定義

キー/値APIのユーザーは、Avroスキーマを使用してレコード値を記述した可能性があります。現在ストアに存在するAvroスキーマに基づいて表を作成し、そのときに既存のストア・レコードをオーバーレイします。これで、表定義を展開(変更)しないかぎり、表APIとキー/値APIの両方を使用してデータを操作できます。これは、キー/値APIから表APIへの移行を目的としています。

たとえば、ストアに次のAvroスキーマが定義されているとします。

kv-> show schema -name com.example.myItemRecord
{
  "type" : "record",
  "name" : "myItemRecord",
  "namespace" : "com.example",
  "fields" : [ {
    "name" : "itemType",
    "type" : "string",
    "default" : ""
  }, {
    "name" : "itemCategory",
    "type" : "string",
    "default" : ""
  }, {
    "name" : "itemClass",
    "type" : "string",
    "default" : ""
  }, {
    "name" : "itemColor",
    "type" : "string",
    "default" : ""
  }, {
    "name" : "itemSize",
    "type" : "string",
    "default" : ""
  }, {
    "name" : "price",
    "type" : "float",
    "default" : 0.0
  }, {
    "name" : "inventoryCount",
    "type" : "int",
    "default" : 0
  } ]
} 

ここで、このスキーマを使用して表を定義します。表の名前はスキーマの名前に基づいている必要はありません。

kv-> table create -name myItemTable
myItemTable-> add-schema -name com.example.myItemRecord
myItemTable-> show
{
  "type" : "table",
  "name" : "myItemTable",
  "id" : "myItemTable",
  "r2compat" : true,
  "description" : null,
  "shardKey" : [ ],
  "primaryKey" : [ ],
  "fields" : [ {
    "name" : "itemType",
    "type" : "STRING"
  }, {
    "name" : "itemCategory",
    "type" : "STRING"
  }, {
    "name" : "itemClass",
    "type" : "STRING"
  }, {
    "name" : "itemColor",
    "type" : "STRING"
  }, {
    "name" : "itemSize",
    "type" : "STRING"
  }, {
    "name" : "price",
    "type" : "FLOAT",
    "default" : 0.0
  }, {
    "name" : "inventoryCount",
    "type" : "INTEGER"
  } ]
}
myItemTable-> 

この時点で、主キーを定義する必要があります。また、必要に応じて表の場合と同じ方法でシャード・キーも定義します。また、通常の場合と同様にストアに表を追加する必要があります。

myItemTable->primary-key -field itemType -field itemCategory
myItemTable->exit
kv->plan add-table -name myItemTable -wait 

キーのみのエントリと互換性がある表(-r2-compat)

キー/値APIのユーザーは、キーのみを持つストア・エントリを作成した可能性があります。これらのエントリにはスキーマはありません。実際には、どのような種類のデータもありません。この場合、table createコマンドの-r2-compatフラグを使用して、これらのレガシー・エントリと互換性のある表を作成できます。

たとえば、次の形式のキーのみのエントリがあるとします。

/User/<id>

<id>は一意の文字列IDです。次のようにして、このキー・スペースをオーバーレイする表を作成できます。

kv-> table create -name User -r2-compat
User-> add-field -name id -type String
User-> primary-key -field id
User-> exit
Table User built.
kv-> plan add-table -name User -wait 

-r2-compatフラグを使用しない場合、表のエントリに対して生成される基になるキーは、User以外のもので始まります。

既存のAvroスキーマを使用して表を作成する場合、-r2-compatフラグが自動的に使用されることに注意してください。

Avroスキーマを使用して表を生成する場合と同様に、オーバーレイが機能するのは表を展開しない場合のみであることにも注意してください。

表のエボリューション

生産後のある時点でアプリケーションを更新する必要がある場合、新しいフィールドを使用するため、または使用しなくなった既存のフィールドを削除するために表も更新する必要がある可能性が高くなります。そのためには、table evolveおよびplan evolve-tableコマンドを使用します。

フィールドが主キー・フィールドの場合は削除できないことに注意してください。

表を展開できるのは、plan add-tableまたはplan evolve-tableコマンドを使用してストアにすでに追加されている場合のみです。

たとえば、次のスクリプトは前の項で作成した表を展開します。フィールドを追加し、別のフィールドを削除します。また、設計、テストおよび本番環境の一貫性を維持できるようにスクリプトを使用して表を展開します。

## Enter into table evolution mode
table evolve -name myTable
## Add a field
add-field -type STRING -name itemCategory
## Remove a field.
remove-field -name percentage
## Exit table creation mode
exit
plan evolve-table -name myTable -wait 

表操作コマンド

この項では、表の操作に使用するCLIコマンドについて簡単に説明します。この項は宣伝のみを目的としています。

すべてのCLIコマンドの包括的なリストおよびその構文は、「KVStoreコマンド・リファレンス」を参照してください。CLIのhelpコマンドを使用して、すべてのCLIコマンドのコマンド構文を表示することもできます。

  • plan add-table

    作成後、まだ追加されていないストアに表を追加します。table createコマンドを使用して表を作成します。

  • plan evolve-table

    table evolveコマンドを使用して展開されたストアに表を追加します。

  • plan remove-table

    ストアから既存の表を削除します。

  • show tables

    ストアに追加されたすべての表および子表を表示します。

  • table clear

    すべてのスキーマの表を消去します。このコマンドが機能するのは、table createコマンドを使用して作成された後、plan add-tableコマンドを使用してストアに追加されていない表のみです。

  • table create

    表のスキーマを設計できる表作成モードを開始します。このモードは一連のサブコマンドを提供します。

    • add-array-field

      配列を受け入れる表にフィールドを追加します。

    • add-field

      単純な型のデータを受け入れるフィールドを追加します。データの型を指定する必要があります。たとえば、INTEGER、LONG、DOUBLEなどです。

    • add-map-field

      マップを受け入れるフィールドを追加します。

    • add-schema

      指定されたAvroスキーマを使用して表を作成します。

    • cancel

      表の作成を取り消します。これによりメイン管理プロンプトに戻り、表の作成時に実行した作業が中止されます。

    • exit

      表の作成時に実行した作業を保存し、メイン管理プロンプトに戻ります。表作成モードを終了した後、plan add-tableコマンドを発行したストアに表を追加する必要があります。

    • primary-key

      指定されるフィールドは表の主キーです。すべての表には主キーとして指定された少なくとも1つのフィールドが必要です。詳細は、「主キーとシャード・キーの設計」を参照してください。

    • remove-field

      指定されたフィールドを表から削除します。

    • set-description

      表のプレーンテキストの説明を設定します。これは、表の使用目的を表すドキュメントに使用します。

    • shard-key

      表のシャード・キーを設定します。詳細は、「主キーとシャード・キーの設計」を参照してください。

    • show

      表に対して定義されている現在のフィールドを表示します。

  • table evolve

    ストアに追加された表を展開(変更)できます。このコマンドは、table createを使用する場合とほぼ同じ方法でフィールドを追加および削除できる特別なモードを開始します。このコマンドの完了時に、plan evolve-tableコマンドを使用して、展開された表をストアに追加する必要があります。

  • table list

    作成後、plan add-tableまたはplan evolve-table.を使用して作成または展開されていないすべての表をリストします。