1

row_key の一部のみを使用して行にアクセスできるようにするスキーマを作成しようとしています。たとえば、キーの形式は user_id:machine_os:machine_arch です。

行キーの例: 12242:"windows2000":"x86"

ドキュメントから、これにより userid=12242 を持つすべての行をクエリできるのか、それとも "wi​​ndows2000" を持つすべての行をクエリできるのか理解できませんでした

これを達成するための実行可能な方法はありますか?

ありがとう、

ヤディド

4

1 に答える 1

1

スキーマに基づいて、複合主キーまたは複合行キーを持つ列ファミリーを効果的に作成しています。これが意味することは、複合キーの各コンポーネントを、厳密な等価関係を持つ最後のコンポーネントを除いて制限する必要があるということです。複合キーの最後のコンポーネントは、不等式とIN関係を使用できますが、1 番目と 2 番目のコンポーネントは使用できません。

さらに、何らかの種類のフィルタリングを利用する場合は、3 つの部分すべてを指定する必要があります。これが必要になるのは、パーティション キーのすべての部分がないと、コーディネーター ノードはクラスター内のどのノードにデータが存在するかがわからないためです (Cassandra はパーティション キーを使用してレプリカとデータの配置を決定することに注意してください)。

事実上、これは次のいずれも実行できないことを意味します。

select * from datacf where user_id = 100012; # missing 2nd and 3rd key components
select * from datacf where user_id = 100012; and machine_arch = 'x86'; # missing 3rd key component
select * from datacf where machine_arch = 'x86'; # you have to specify the 1st
select * from datacf where user_id = 100012 and machine_arch in ('x86', 'x64'); # nope, still want 3rd

ただし、次のようなクエリを実行できます。

select * from datacf where user_id = 100012 and machine_arch = 'x86'
   and machine_os = "windows2000"; # yes! all 3 parts are there

select * from datacf where user_id = 100012 and machine_os = "windows2000"
   and machine_arch in ('x86', 'x64'); # the last part of the key can use the 'IN' or other equality relations

最初の質問に答えるために、既存のデータ モデルでは、userid = 12242「windows2000」がmachine_os.

実行するクエリの種類を正確に教えていただければ、それに応じてテーブルを設計するお手伝いができると思います。通常、Cassandra データ モデルは、データ検索の観点から見たときにうまく機能します。簡単に言うと、主キーとしてのみ使用user_idし、クエリを実行する他の列でセカンダリ インデックスを使用します。

于 2013-10-03T18:35:36.507 に答える