それはちょっと不自然かもしれませんが、cassandraには一意である主キーがありますか?たとえば、次の表で:
CREATE TABLE users (
name text,
surname text,
age int,
adress text,
PRIMARY KEY(name, surname)
);
それでは、私のデータベースに、同じ名前と姓で異なる年齢の2人をデータベースに含めることが可能である場合はどうでしょうか。つまり、同じ主キーです。
はい、主キーは一意である必要があります。そうしないと、重複するキーを使用してクエリを実行したときに、どの行を返すかを知る方法がありません。
あなたのケースでは、同じ名前または同じ姓を持つ2つの行を持つことができますが、両方を持つことはできません。
定義により、主キーは一意である必要があります。だからといって、目標を達成できないということではありません。アプローチ/用語を変更するだけです。
まず、name + surnameを主キーにするという目標を緩めると、次のことができます。
CREATE TABLE users ( name text, surname text, age int, address text, PRIMARY KEY((name, surname),age) );
insert into users (name,surname,age,address) values ('name1','surname1',10,'address1');
insert into users (name,surname,age,address) values ('name1','surname1',30,'address2');
select * from users where name='name1' and surname='surname1';
name | surname | age | address
-------+----------+-----+----------
name1 | surname1 | 10 | address1
name1 | surname1 | 30 | address2
一方、アドレスも共有されていることを確認したい場合は、おそらくユーザーのレコードに年齢のコレクションを格納するだけです。これは次の方法で実現できます。
CREATE TABLE users2 ( name text, surname text, age set<int>, address text, PRIMARY KEY(name, surname) );
insert into users2 (name,surname,age,address) values ('name1','surname1',{10,30},'address2');
select * from users2 where name='name1' and surname='surname1';
name | surname | address | age
-------+----------+----------+----------
name1 | surname1 | address2 | {10, 30}
したがって、実際に達成する必要があることに戻ります。上記の例があなたにいくつかのアイデアを与えることを願っています。
主キーは一意です。データモデルでは、(名前、姓)の組み合わせごとに1つの年齢しか持つことができません。
はい、上記のコメントで述べたように、名前、姓、年齢を含む複合キーを使用して目標を達成できますが、それでも問題は解決しません。むしろ、新しい列userIDの追加を検討し、それを主キーにすることができます。したがって、名前、姓、年齢が重複している場合でも、データモデルを再確認する必要はありません。
CREATE TABLE users (
userId int,
name text,
surname text,
age int,
adress text,
PRIMARY KEY(userid)
);
具体的には、パーティションキーは一意である必要があると述べます。
Cassandraは、パーティションを含むノードを見つけることができるハッシュを計算できるように、すべてのパーティションキー列を必要とします。
パーティションキーは、Apache Cassandra=データベースでのレコードの一意性を示すだけでなく、特別な用途があります。
制約チェックがないため、同じパーティションキーを何度も挿入してもエラーにはなりません。
等価検索を実行するクエリは、パーティションキーに含める必要があります。
参考文献
https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause