Cassandra 集群键唯一性

use*_*656 0 cassandra cassandra-2.0 cassandra-3.0

Cassandra权威指南一书中说分区键和聚簇键的组合保证了数据库中的唯一记录...我理解分区键是保证记录唯一性的键 - 记录所在的节点被储存了。聚类键用于记录的排序。有人可以帮助我理解这一点吗?感谢并抱歉提出这个问题...

Ers*_*soy 6

  • 单个分区键(没有集群键)必须primary key是唯一的。
  • A partition key+clustering key必须是唯一的,但这并不意味着分区键或集群键必须单独唯一。

您可以插入

  • (a,b)(第一条记录)
  • (a,c)(与第一条记录相同的分区键)
  • (d,b)(与第一条记录相同的聚类键)

当您再次插入 (a,b) 时,它将更新现有主键的非主键值。

在下面的示例中userid, 是分区键,date是集群键。

cqlsh:play> CREATE TABLE example (userid int, date int, name text, PRIMARY KEY (userid, date));
cqlsh:play> INSERT INTO example (userid, date, name) VALUES (1, 20200530, 'a');
cqlsh:play> INSERT INTO example (userid, date, name) VALUES (1, 20200531, 'a');
cqlsh:play> INSERT INTO example (userid, date, name) VALUES (2, 20200531, 'a');
cqlsh:play> SELECT * FROM example;

 userid | date     | name
--------+----------+------
      1 | 20200530 |    a
      1 | 20200531 |    a
      2 | 20200531 |    a

(3 rows)
cqlsh:play> INSERT INTO example (userid, date, name) VALUES (2, 20200531, 'b');
cqlsh:play> SELECT * FROM example;

 userid | date     | name
--------+----------+------
      1 | 20200530 |    a
      1 | 20200531 |    a
      2 | 20200531 |    b

(3 rows)
cqlsh:play>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案的第一部分是错误的。“主键”(与 RDBMS 中相同,表中的每一行都必须有唯一的主键)是“分区键”+“聚集列”。“分区键”(对于每行来说不是唯一的,并且在 RDBMS 中不存在)仅用于决定分区中的行将存储在哪个节点上。 (2认同)