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