【问题标题】:Cassandra clustering key uniquenessCassandra 聚类键唯一性
【发布时间】:2020-09-18 13:00:32
【问题描述】:

在 Cassandra 权威指南一书中,据说分区键和集群键的组合保证了数据库中的唯一记录......我理解分区键是保证记录唯一性的那个 - 节点记录存储的位置。聚类键用于对记录进行排序。有人可以帮我理解这一点吗? 感谢和抱歉这个问题......

【问题讨论】:

标签: cassandra cassandra-2.0 cassandra-3.0


【解决方案1】:
  • 单个分区键(没有集群键)是primary key,它必须是唯一的。
  • 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>

【讨论】:

  • 我认为这个答案的第一部分是错误的。 primary key(与 RDBMS 中相同,表中的每一行都必须有一个唯一的主键)是 partition key + clustering columnspartition key(对于每一行来说不是唯一的,并且在 RDBMS 中不存在)仅用于决定分区中的行将存储在哪个节点上。
  • 其实“错”有点刺耳。不过,我认为措辞很混乱。
  • 感谢@phonaputer 的额外解释。我对这个问题所做的评论有一个链接,它涵盖了几乎所有的主键、分区、集群、复合键的情况。由于 OP 没有发现它有用,我试图通过示例以不同的方式回答。
猜你喜欢
  • 2014-11-26
  • 2014-02-11
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2014-03-12
相关资源
最近更新 更多