以下の key
タイプの違いを理解するために、ネット上の記事を読んでいます。しかし、私には理解するのが難しいようです。例題があれば、より理解が深まると思います。
primary key,
partition key,
composite key
clustering key
これには多くの混乱がありますので、できるだけ簡単に説明します。
主キーとは、テーブルからデータを取得するために使用される1つ以上の列を示す一般的な概念です。
主キーは SIMPLE で、インラインで宣言することもできます。
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
つまり、1つのカラムで作られているということです。
しかし、主キーは、より多くのカラムから生成される COMPOSITE (別名 COMPOUND) にすることもできます。
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
主キーがCOMPOSITEの場合、キーの最初の部分"はPARTITION KEY(この例ではkey_part_oneがパーティションキー)と呼ばれ、キーの2番目の部分はCLUSTERING KEY(この例ではkey_part_two)と呼ばれます。
**パーティション・キーとクラスタリング・キーの両方をより多くのカラムで作成することができます。
create table stackoverflow_multiple (
k_part_one text,
k_part_two int,
k_clust_one text,
k_clust_two int,
k_clust_three uuid,
data text,
PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)
);
これらの名前の背後には ...
さらに詳しい使用方法については、DATASTAX DOCUMENTATION</a>をご覧ください。
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
テーブルの内容。
key | data
----+------
han | solo
COMPOSITE/COMPOUND KEYは、"wide rows"を取得することができます(つまり、クラスタリング・キーが定義されていても、パーティション・キーだけでクエリを実行できます)。
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';
テーブルの内容。
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
しかし、すべてのキー(パーティションとクラスタリングの両方)を使ってクエリを行うことができます。
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
クエリの出力。
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
重要な注意: パーティション・キーは、where句
を使用したクエリを実行するために必要な最小の指定子です。
以下のような複合パーティション・キーを持っている場合は
例: PRIMARY KEY((col1, col2), col10, col4))
。
パーティション・キーを定義する2つの列であるcol1とcol2の両方を少なくとも渡すことによってのみ、クエリを実行することができます。クエリを作成するための一般的なルールは、少なくともすべてのパーティションキーカラムを渡さなければならず、その後、オプションで各クラスタリングキーを設定された順序で追加することができます。
つまり、有効なクエリは以下の通りです。(セカンダリインデックスを除く)
無効です。
ご参考になれば幸いです。
承認されたものとして要約の回答を追加するとかなり長くなります。"row"と"column"という用語は、CQLの文脈で使われており、Cassandraが実際にどのように実装されているかではありません。
例を挙げます。
:パーティション・キーは
a` です。PRIMARY KEY (a, b)
:パーティションキーは a
で、クラスタリングキーは b
です。PRIMARY KEY ((a, b))
:複合パーティションキーは (a, b)
です。PRIMARY KEY (a, b, c)
:パーティションキーは a
で、複合クラスタリングキーは (b, c)
です。PRIMARY KEY ((a, b), c)
:複合パーティション・キーは (a, b)
, クラスタリング・キーは c
です。PRIMARY KEY ((a, b), c, d)
:複合パーティション・キーは (a, b)
で、複合クラスタリング・キーは (c, d)
です。CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
CQLでは、PRIMARY KEYで定義されるカラムの順番が重要です。キーの最初のカラムはパーティション・キーと呼ばれ、同じパーティション・キーを共有するすべての行(実際にはテーブル全体でも)が同じ物理ノードに格納されるという特性を持っています。また、特定のテーブルで同じパーティションキーを共有する行の挿入/更新/削除は、アトミックかつ分離して実行されます。複合パーティション・キー、つまり複数の列で構成されるパーティション・キーを持つことは可能で、どの列がパーティション・キーを構成するかを定義するために余分な括弧を使用します。
**パーティションリングとクラスタリング PRIMARY KEYの定義は、パーティション・キーとクラスタリング・カラムの2つの部分で構成されています。前者はストレージエンジンの行キーに対応し、後者は行内のカラムをグループ化するために使用されます。
CREATE TABLE device_check (
device_id int,
checked_at timestamp,
is_power boolean,
is_locked boolean,
PRIMARY KEY (device_id, checked_at)
);
ここでは、device_id がパーティション・キーで、checked_at がクラスタ・キーです。
パーティション・キーだけでなく、複数のクラスター・キーを持つこともできますが、これは宣言に依存します。