Cassandra中的分区键,组合键和集群键之间的区别?

我一直在网上阅读文章,了解以下keytypes之间的差异。 但是我觉得很难把握。 例子一定会帮助理解更好。

 primary key, partition key, composite key clustering key 

周围有很多困惑,我会尽量简化。

主键是表示用于从表中检索数据的一个或多个列的一般概念。

主键可能很简单

  create table stackoverflow ( key text PRIMARY KEY, data text ); 

这意味着它是由一个单一的列。

但主键也可以是COMPOSITE (又名COMPOUND ),由更多列生成。

  create table stackoverflow ( key_part_one text, key_part_two int, data text, PRIMARY KEY(key_part_one, key_part_two) ); 

COMPOSITE主键的情况下,键的“第一部分”被称为PARTITION KEY (在这个例子中, key_part_one是分区键),而键的第二部分是CLUSTERING KEYkey_part_two

请注意,分区和集群密钥可以由多个列组成

  create table stackoverflow ( 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) ); 

在这些名字后面…

  • 分区密钥负责跨节点进行数据分发。
  • 集群密钥负责分区内的数据sorting。
  • 主键相当于单个字段键表中的分区键
  • 复合/复合键只是一个多列键

更多使用信息: DATASTAX DOCUMENTATION


编辑由于进一步的要求
小的用法和内容的例子
SIMPLE KEY:

 insert into stackoverflow (key, data) VALUES ('han', 'solo'); select * from stackoverflow where key='han'; 

表内容

 key | data ----+------ han | solo 

COMPOSITE / COMPOUND KEY可以检索“宽行”

 insert into stackoverflow (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player'); insert into stackoverflow (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player'); select * from stackoverflow where key_part_one = 'ronaldo'; 

表内容

  key_part_one | key_part_two | data --------------+--------------+-------------------- ronaldo | 9 | football player ronaldo | 10 | ex-football player 

但是你可以用所有的键来查询…

 select * from stackoverflow 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))

您可以执行查询只传递至lesscol1和col2,这是定义分区键的2列。 进行查询的“一般”规则是必须至less传递所有分区键列,然后可以按照它们设置的顺序添加每个键。

所以有效的查询是( 不包括二级索引

  • col1和col2
  • col1和col2和col10
  • col1和col2以及col10和col 4

无效:

  • col1和col2和col4
  • 任何不包含col1和col2的东西

希望这可以帮助。

添加一个可接受的答案是相当长的。 术语“行”和“列”用于CQL的上下文中,而不是Cassandra实际上如何实现。

  • 主键唯一标识一行。
  • 组合键是由多列形成的键。
  • 分区键是查找一组行(即分区)的主要查找。
  • 群集密钥是不是分区密钥的主密钥的一部分(并且定义了分区内的sorting)。

例子:

  • PRIMARY KEY (a) :分区键是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)

在cassandra中,主键,分区键,复合键,集群键之间的区别总是有些混乱。所以我将在下面进行解释,并相互关联。 我们使用CQL(Cassandra查询语言)进行Cassandra数据库访问。 注意: – 答案是根据Cassandra的更新版本。 首要的关键 :-

在卡桑德拉有两种不同的方式来使用主键。

 CREATE TABLE Cass ( id int PRIMARY KEY, name text ); 

 Create Table Cass ( id int, name text, PRIMARY KEY(id) ); 

在CQL中,为PRIMARY KEY定义列的顺序很重要。 密钥的第一列被称为具有共享相同分区密钥的所有行的分区密钥(实际上甚至跨表)存储在同一物理节点上。 另外,对于给定的表共享相同的分区键的行上的插入/更新/删除是primefaces上和隔离地执行的。 请注意,可能有一个复合分区键,即由多个列组成的分区键,使用额外的括号来定义哪些列形成分区键。

分区和集群 PRIMARY KEY定义由两部分组成:分区键和集群列。 第一部分映射到存储引擎行键,而第二部分用于将行组成列。

 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是cluster_key。

我们可以有多个集群密钥以及依赖于声明的分区密钥。

在数据库devise中,复合键是一组不是最小的超级键。

组合键是一个包含复合键和至less一个不是超级键的属性的集合

给定表:雇员{employee_id,名字,姓氏}

可能的超级键是:

 {employee_id} {employee_id, firstname} {employee_id, firstname, surname} 

{employee_id}是唯一最小的超级键,这也使得它成为唯一的候选键 – 因为{firstname}和{surname}不能保证唯一性。 由于主键被定义为select的候选键,并且在这个例子中只存在一个候选键,{employee_id}是最小的超级键,唯一的候选键和唯一可能的主键。

复合键的详尽清单是:

 {employee_id, firstname} {employee_id, surname} {employee_id, firstname, surname} 

唯一的组合键是{employee_id,firstname,surname},因为该键包含一个复合键({employee_id,firstname})和一个不是超级键({surname})的属性。