わかりましたので、最初にやりたいことは、答えたい質問から始めることです. あなたはそれを行い、基本的には正しい軌道に乗っていると思います...しかし、いくつか微調整する必要があるかもしれません.
開始するには、必ずこの記事を ご覧くださいhttp://opensourceconnections.com/blog/2013/07/24/understanding-how-cql3-maps-to-cassandras-internal-data-structure/ですが、データが実際にデータベースにどのように格納されているかを確認することは依然として役に立ちます。
特に、すべての主キーには潜在的に 2 つの部分があることに注意してください: パーティショニング キーとクラスタリング列 (例: http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/create_table_r ) .html?scroll=reference_ds_v3f_vfk_xj__using-a-composite-partition-key )。
パーティショニング キーは、Cassandra クラスタ内のどのノードが実際にデータを持つかを決定します。クラスタリング列が定義されている場合、基本的にソート順が決定されます。また、使用できる範囲クエリの種類にも影響します。
とはいえ、基本的に、テーブルについて 2 つの質問があります。「国を指定して....」と「場所を指定して...」です。
したがって、このような状況では、次のような主キーを検討することをお勧めします。
(location, country, state, city)
-- location はパーティショニング キー、(country、state、city) はクラスタリング列です (実行できますが、このようなインデックスを使用してSELECT * FROM table WHERE location = X and country = Y
実行することはできません... http://www.datastax.com/をご覧くださいdocumentation/cql/3.0/cql/cql_reference/select_r.html?scroll=reference_ds_d35_v2q_xj__filtering-data-using-whereこれが意味をなさない場合)SELECT * FROM table WHERE location = X and city = Y
そして(country, state, city, location)
-- ここで country はパーティション キーで、(state ,city, location) はクラスタリング列です
以上のことから、最初のテーブルのみを使用して、国に関するセカンダリ インデックスを作成することができるかもしれません。2 つのテーブルを使用するほど高速ではありませんが、確かに可能に思えます。そして、セカンダリインデックスについて考慮したい追加の懸念事項がいくつかあります(例:http://www.datastax.com/documentation/cql/3.0/cql/ddl/ddl_when_use_index_c.html)が、テーブルが記述が頻繁に更新されるか、国のカーディナリティが非常に高くなります。
そうは言っても、最初のケースではロケーションをパーティションキーとして使用し、2 番目のケースでは国をパーティションキーとして使用する 2 つのテーブルを使用することを検討してください。また、最初のインデックスのみを使用し、国のセカンダリ インデックスを作成することも検討してください。後者のオプションは維持しやすいかもしれませんが、それほど速くはありません。ただし、セカンダリ インデックスが妥当であるような問題のように思えます。最終的には、レイテンシの要件に依存すると思います。