0

さまざまな地域/場所を格納するデータ構造があります。地域は都市の一部、都市は州の一部、州は国の一部です。

クエリするいくつかのユースケースは

U1 : 場所を指定して、都市、州、国を取得します。U2 : 国を指定すると、州は都市、地域のリストを取得します

Cassandra に格納されるデータは、読み取りパス用に最適化する必要があることを理解しています。

U1 が {location, city, state, country} になるためのキー

U2 を {country, state, city, location} にするためのキー

2 つの列ファミリーに値を格納する以外に、より良い方法が存在するかどうかを知りたい

4

2 に答える 2

3

わかりましたので、最初にやりたいことは、答えたい質問から始めることです. あなたはそれを行い、基本的には正しい軌道に乗っていると思います...しかし、いくつか微調整する必要があるかもしれません.

開始するには、必ずこの記事を ご覧ください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 つのテーブルを使用することを検討してください。また、最初のインデックスのみを使用し、国のセカンダリ インデックスを作成することも検討してください。後者のオプションは維持しやすいかもしれませんが、それほど速くはありません。ただし、セカンダリ インデックスが妥当であるような問題のように思えます。最終的には、レイテンシの要件に依存すると思います。

于 2014-12-12T17:47:23.627 に答える
1

これはモデル化の正しい方法であり、ログに記録されたバッチを使用して両方のテーブルを一度に更新できます。これはかなり標準的なモデリングです。-- Ryan Svihla - ソリューション アーキテクト - datastax

于 2014-12-14T16:48:34.923 に答える