スキーマに基づいて、複合主キーまたは複合行キーを持つ列ファミリーを効果的に作成しています。これが意味することは、複合キーの各コンポーネントを、厳密な等価関係を持つ最後のコンポーネントを除いて制限する必要があるということです。複合キーの最後のコンポーネントは、不等式と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
し、クエリを実行する他の列でセカンダリ インデックスを使用します。