Cassandra中的分区键,组合键和集群键之间的区别?
我一直在网上阅读文章,了解以下key
types之间的差异。 但是我觉得很难把握。 例子一定会帮助理解更好。
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 KEY ( key_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})的属性。