第3章 レコードの設計に関する考察

目次

キー
キー・コンポーネントとは

Oracle NoSQL Databaseには、キーと値のペアの格納場所であるKVStoreが含まれています。各ペアはデータベースの1つのレコードとみなされ、キーは値の検索に使用されます。キーと値の両方とも、Oracle NoSQL Databaseによる一定の制限の下アプリケーションで定義されます。

KVStore内の各キーは、文字列のリストです。すべてのキーに、1つ以上のメジャー・コンポーネントが必要です。キーは必要に応じてマイナー・コンポーネントを持つこともできます。

レコードの値部分は単純なバイト配列ですが、多くの場合、スキーマの指定にはAvroを使用します。(詳細は、「Avroスキーマ」を参照してください)。値部分は、必要に応じて単純にも複雑にもできます。

非常に簡単な例として、ストアに人に関する情報を含めるとします。次のようにするとします。

これは、Oracle NoSQL Databaseに格納するものの非常に簡単な例です。ただし、パフォーマンスの点から言えば、この例はデータの編成方法として最適ではない場合があります。キーと値の設計方法は、パフォーマンスに大きく影響する可能性があります。

この章の後半で、Oracle NoSQL Databaseのスキーマ設計に関連するパフォーマンスの問題について説明します。

キー

Oracle NoSQL Databaseでは、キーを使用してレコードが編成されます。すべてのレコードは、1つ以上のメジャー・キー・コンポーネントを持ち、必要に応じて1つ以上のマイナー・キー・コンポーネントを持ちます。マイナー・キー・コンポーネントが使用される場合、メジャー・コンポーネントとマイナー・コンポーネントの組合せによってストア内の1つのレコードが一意に識別されます。

キーは、キーのメジャー・コンポーネントに基づき、ハッシュを使用してパーティション間に均等に分散されます。各キーは最低1つのメジャー・コンポーネントを持つ必要がありますが、必要に応じてメジャー・コンポーネントのリストを使用できます。これによって、同じ組合せのメジャー・キー・コンポーネントを共有するレコードが同じパーティション内に必ず含まれることになり、問合せが効率的に行われることを意味します。また、同一のメジャー・キー・コンポーネントを持つレコードは、1つの原子的操作とみなされる複数の操作を使用して操作できます。

メジャー・キー・コンポーネントは、レコードが含まれるパーティションの識別に使用され、各パーティションは1つのレプリケーション・グループに格納されることに注意してください。つまり、メジャー・キー・コンポーネントは、特定のレコードが格納されるレプリケーション・グループの識別に使用されます。メジャー・キー・コンポーネントと実行するデータ・アクセス操作の組合せは、リクエストをサービスするレプリケーション・グループ内のノードの識別に使用されます。特定のデータの格納にどの物理マシンまたはレプリケーション・グループが使用されるかは制御できないことに注意してください。すべてKVドライバによって決定されます。

ただし、レコードがメジャー・キー・コンポーネントに基づいて物理ノードに配置されるということは、メジャー・キー・コンポーネントを共有するキーは1つの操作で効率的に問い合せることができるということです。これは、概念上、1つのパーティションに一緒に格納されているキーが操作される場合、1つの物理データベースが操作されるためです。(実際は、1つのレプリケーション・グループで複数の物理データベースが使用されますが、ストアと対話する際、その複雑性は意識されません。)

各パーティションは1つのレプリケーション・グループに置かれ、ストアには複数のレプリケーション・グループが含まれる可能性があることに注意してください。読取りと書込みの両方のスループット・パフォーマンスが向上するため、これはよいことです。このパフォーマンスの向上を最大限に利用するには、最低パーティションと同じ数の異なるメジャー・キー・コンポーネントが必要です。つまり、1つのメジャー・キー・コンポーネントまたは少数のメジャー・キー・コンポーネント下にすべてのレコードを作成しないでください。そのようにした場合、ストア内のレコードの数が増えるとパフォーマンスのボトルネックになります。

適切に使用すると、マイナー・キー・コンポーネントもパフォーマンスの向上に役立ちますが、その方法を理解するには、レコードの値部分に関連するパフォーマンスの問題を理解する必要があります。それらの問題については、この章の後半で説明します。

キー・コンポーネントとは

キー・コンポーネントは、Java文字列です。比較については、希望のエンコーディングを使用したJava文字列の比較方法を確認してください。

キー・コンポーネントは文字列のため、希望のものにできます。通常は、アプリケーションで特定の命名方法を使用してレコードが論理的に編成されるようにします。

わかりやすく言うと、キー・コンポーネントはファイル・システム・パスの場所のようなものです。スラッシュ("/")で区切られたファイル・システム・パスのようにレコードのコンポーネントを記述することができます。たとえば、レコードの識別に複数のメジャー・コンポーネントを使用し、"Smith"と"Bob"というメジャー・コンポーネントを使用するレコードがあるとします。別のレコードでは"Smith"と"Patricia"が使用されます。3つ目では"Wong"と"Bill"が使用されます。これらのレコードのメジャー・コンポーネントは、次のように記述できます。

/Smith/Bob
/Smith/Patricia
/Wong/Bill 

さらに、各ユーザーについて格納する別の種類の情報があるとします。その場合、マイナー・コンポーネント("birthdate"、"image"、"phonenumber"、"userID"など)を使用して別の種類の情報を指定できます。キー・コンポーネントのマイナー部分は、スラッシュ・ハイフン・スラッシュ(/-/)という特別な区切りでメジャー・コンポーネントと区切られます。

キーをメジャー・キー・コンポーネントとマイナー・キー・コンポーネントに分けると、格納および操作するのは次のようなレコードになります。共通のメジャー・コンポーネントを共有するものは、1つの原子的操作で処理できます。

/Smith/Bob/-/birthdate
/Smith/Bob/-/phonenumber
/Smith/Bob/-/image
/Smith/Bob/-/userID 
/Smith/Patricia/-/birthdate
/Smith/Patricia/-/phonenumber
/Smith/Patricia/-/image
/Smith/Patricia/-/userID 
/Wong/Bill/-/birthdate
/Wong/Bill/-/phonenumber
/Wong/Bill/-/image
/Wong/Bill/-/userID

前述のキーは最も効率的なデータの編成方法を表すものではないことに注意してください。この問題は、次の項で説明します。