Oracle NoSQL Database表APIは、Oracle NoSQL Databaseクライアント・アプリケーションのコーディング方法として推奨されています。ユーザーは表メタファを使用してデータを操作できます。表メタファでは、データは複数列のデータに編成されます。このAPIでは無限の数のサブ表がサポートされています。表に対する問合せの速度を向上する索引を作成することもできます。
表APIとキー/値APIの両方を使用する混合クライアントがストアにアクセスする場合、キーの衝突の可能性を避ける必要があります。
Oracle NoSQL Databaseクライアントがストア内の表の読取りまたは書込みを実行する前に、表を作成する必要があります。実行方法はいくつかありますが、このマニュアルでは表DDL文を使用する方法を中心に説明します。これらの文はコマンドライン・インタフェース(CLI)を使用してストアに送信できますが、推奨される方法はプログラムでストアに送信する方法です。この項では、両方のメソッドについて説明します。
表の定義に使用するDDL言語は、「表のデータ定義言語概要」で説明しています。この項ではDDL言語の使用方法の概要を示します。
初歩的な例として、myTableという名前の表を使用し、各行には次の4つの列があるとします: item、count1、count2およびpercentage。この表を作成するには、次の文を使用します。
CREATE TABLE myTable ( item STRING, description STRING, count INTEGER, percentage DOUBLE, PRIMARY KEY (item) // Every table must have a primary key )
主キーは、このマニュアルではまだ説明していない概念です。主キーの機能および使用方法の詳細は、「主キーとシャード・キーの設計」を参照してください。
ストアに表定義を追加するには、KVStore.execute()またはKVStore.executeSync()メソッドを使用してプログラムで追加できます。(後者のメソッドは文を同期的に実行します。)これらのメソッドを使用するために、ストアとの接続を確立する必要があります。これは、「KVStoreハンドル」で説明しています。
次に例を示します。
package kvstore.basicExample;
import oracle.kv.FaultException;
import oracle.kv.StatementResult;
import oracle.kv.KVStore;
import oracle.kv.table.TableAPI;
...
// kvstore open omitted
TableAPI tableAPI = kvstore.getTableAPI();
ExecutionFuture future = null;
StatementResult result = null;
String statement = null;
public void createTable() {
TableAPI tableAPI = store.getTableAPI();
StatementResult result = null;
String statement = null;
try {
/*
* Add a table to the database.
* Execute this statement asynchronously.
*/
statement =
"CREATE TABLE myTable (" +
"item STRING," +
"description STRING," +
"count INTEGER," +
"percentage DOUBLE," +
"PRIMARY KEY (item))"; // Required"
result = store.executeSync(statement);
displayResult(result, statement);
} catch (IllegalArgumentException e) {
System.out.println("Invalid statement:\n" + e.getMessage());
} catch (FaultException e) {
System.out.println
("Statement couldn't be executed, please retry: " + e);
}
}
private void displayResult(StatementResult result, String statement) {
System.out.println("===========================");
if (result.isSuccessful()) {
System.out.println("Statement was successful:\n\t" +
statement);
System.out.println("Results:\n\t" + result.getInfo());
} else if (result.isCancelled()) {
System.out.println("Statement was cancelled:\n\t" +
statement);
} else {
/*
* statement was not successful: may be in error, or may still
* be in progress.
*/
if (result.isDone()) {
System.out.println("Statement failed:\n\t" + statement);
System.out.println("Problem:\n\t" +
result.getErrorMessage());
} else {
System.out.println("Statement in progress:\n\t" +
statement);
System.out.println("Status:\n\t" + result.getInfo());
}
}
}
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表の列ごとにスキーマを指定します。このスキーマはオブジェクトとしてハンドリングされるプリミティブ・データ型または複合データ型にできます。
サポートされるデータ型は次のようになります。
Array
すべてが同じ型の値の配列。
Binary
事前決定されている固定サイズのないJavaバイト配列として実装されています。
Boolean
Double
Enum
文字列の配列として表される列挙。
Fixed Binary
固定サイズ・バイナリ型(Javaバイト配列)は、各レコードが同じサイズのバイナリ・データを扱うために使用されます。データとともに長さを格納する必要がある無制限バイナリ・フィールドより使用するストレージが少なく済みます。
Float
Integer
Long
Map
すべてのエントリが1つの型に制約される、順序のないマップ型。
Record
次の項を参照してください。
Java文字列
「子表の定義」で説明したように、下位情報(連絡先データベースの住所、在庫システムのベンダー連絡先情報など)を保持する子表を作成できます。その際に、子表に無限の数の行を作成し、子表の行のフィールドに索引を付けることができます。
ただし、下位データを編成するために子表は必要ありません。下位データの非常に単純な要件があり、下位データのフィールドに索引付けをしない場合、子表のかわりにレコード・フィールドを使用できます。一般的に、各親表の行にレコードの固定の少数のインスタンスのみが必要な場合、子表のかわりにレコード・フィールドを使用できます。簡単なケース以外では、子表を使用してください。(簡単なケースでも子表を使用することにデメリットはないことに注意してください。)
レコード・フィールドを使用する際に前提となるのは、管理する既知の固定数レコードがあるということです(レコードを配列として編成しない場合)。たとえば、連絡先データベースの場合、子表を使用すると、ユーザーごとに無制限の数の住所を関連付けることができます。レコードを使用すると、サポートされている住所(自宅、勤務先など)のレコード・フィールドを作成することで、固定数の住所を関連付けることができます。
次に例を示します。
CREATE TABLE myContactsTable (
uid STRING,
surname STRING,
familiarName STRING,
homePhone STRING,
workPhone STRING,
homeAddress RECORD (street STRING, city STRING, state STRING,
zip INTEGER CHECK(zip >= 00000 and zip <= 99999)),
workAddress RECORD (street STRING, city STRING, state STRING,
zip INTEGER CHECK(zip >= 00000 and zip <= 99999)),
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 CHECK(zip >= 00000 and zip <= 99999))),
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)
)
これを実行する場合、子表は親表の主キーを継承することに注意してください。この簡単なケースでは、子表の主キーは実際にはitemCategoryとitemSKUの2つのフィールドです。これにはいくつかの悪影響があります。その1つは、子表を取得するときに親の主キー・フィールドが取得されるという点です。詳細は、「子表の取得」を参照してください。
生産後のある時点でアプリケーションを更新する必要がある場合、新しいフィールドを使用するため、または使用しなくなった既存のフィールドを削除するために表も更新する必要がある可能性が高くなります。ALTER TABLE文を使用してこれを実行します。この文の詳細は、「表定義の変更」を参照してください。
フィールドが主キー・フィールドの場合は削除できないことに注意してください。表の展開中は主キー・フィールドを追加することもできません。
表はすでにストアにすでに追加されている場合のみ展開できます。
たとえば、次の文は前の項で作成した表を展開します。これらは、APIまたはCLIを使用して次から次へとストアに送信されることに注意してください。
ALTER TABLE myInventory.itemDetails (ADD salePrice FLOAT)
ALTER TABLE myInventory.itemDetails (DROP inventoryCount)