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つの列(item
、count1
、count2
およびpercentage
)があるmyTable
という名前の表を使用するとします。この表を作成するには、CLIにログインしてtable create
、add-field
、primary-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
これを実行する場合、子表は親表の主キーを継承することに注意してください。この簡単なケースでは、子表の主キーは実際にはitemCategory
とitemSKU
の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
フィールドを作成する場合、この情報を子表の形式で管理する必要があります。
キー/値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
キー/値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.
を使用して作成または展開されていないすべての表をリストします。