我一直在阅读网络上的文章,以了解以下 key 类型之间的差异 . 但这对我来说似乎很难掌握 . 示例肯定有助于更好地理解 .
key
primary key, partition key, composite key clustering key
简而言之:
Partition Key 对于一行来说只是 identification ,该标识大部分时间是单列(称为 Primary Key ),有时是多列的组合(称为 Composite Partition Key ) .
Cluster key 只不过 Indexing & Sorting . 群集密钥取决于以下几点:
在除主键列之外的where子句中使用哪些列 .
如果您有非常大的记录,那么我可以分配日期以便于管理 . 例如,我有一百万个县人口记录的数据 . 因此,为了便于管理,我基于状态和PIN码后对数据进行聚类等 .
在数据库设计中,复合键是一组非最小的超级键 .
复合键是一个包含复合键和至少一个不是超级键的属性的集合
给定表:员工{employee_id,firstname,surname}
可能的超级键是:
{employee_id} {employee_id, firstname} {employee_id, firstname, surname}
是唯一的最小超级密钥,它也是唯一的候选密钥 - 假设和不保证唯一性 . 由于主键被定义为所选择的候选键,并且在该示例中仅存在一个候选键,因此是最小超级键,唯一候选键和唯一可能的主键 .
复合键的详尽列表是:
{employee_id, firstname} {employee_id, surname} {employee_id, firstname, surname}
唯一的组合键是{employee_id,firstname,surname},因为该键包含复合键({employee_id,firstname})和不是超级键()的属性 .
围绕这个有很多困惑,我会尽量让它变得简单 .
主键是一般概念,用于指示用于从表中检索数据的一个或多个列 .
主键可以是 SIMPLE ,甚至可以内联声明:
create table stackoverflow_simple ( key text PRIMARY KEY, data text );
这意味着它是由一个列组成的 .
但主键也可以是 COMPOSITE (又名 COMPOUND ),由更多列生成 .
create table stackoverflow_composite ( key_part_one text, key_part_two int, data text, PRIMARY KEY(key_part_one, key_part_two) );
在 COMPOSITE 主键的情况下,键的"first part"被称为 PARTITION KEY (在此示例中 key_part_one 是分区键),键的第二部分是 CLUSTERING KEY (在此示例中为 key_part_two )
Please note that the both partition and clustering key can be made by more columns ,这是如何:
create table stackoverflow_multiple ( 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) );
这些名字背后......
Partition Key 负责跨节点的数据分发 .
Clustering Key 负责分区内的数据排序 .
Primary Key 等同于单字段密钥表中的 Partition Key (即 Simple ) .
Composite/Compound Key 只是任何多列键
更多使用信息:DATASTAX DOCUMENTATION
小用法和内容示例SIMPLE KEY:
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo'); select * from stackoverflow_simple where key='han';
table content
key | data ----+------ han | solo
COMPOSITE/COMPOUND KEY 可以检索"wide rows"(即即使您已定义了聚类键,也可以只通过分区键进行查询)
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player'); insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player'); select * from stackoverflow_composite where key_part_one = 'ronaldo';
key_part_one | key_part_two | data --------------+--------------+-------------------- ronaldo | 9 | football player ronaldo | 10 | ex-football player
但您可以使用所有密钥(分区和群集)查询...
select * from stackoverflow_composite where key_part_one = 'ronaldo' and key_part_two = 10;
query output
key_part_one | key_part_two | data --------------+--------------+-------------------- ronaldo | 10 | ex-football player
重要说明:分区键是使用 where clause 执行查询所需的最小说明符 . 如果您有复合分区键,如下所示
where clause
例如: PRIMARY KEY((col1, col2), col10, col4))
PRIMARY KEY((col1, col2), col10, col4))
您只能通过至少传递col1和col2来执行查询,这些是定义分区键的2列 . 要进行查询的“常规”规则是您必须至少传递所有分区键列,然后您可以按照它们设置的顺序可选地添加每个群集键 .
所以有效的查询是( excluding secondary indexes )
col1和col2
col1和col2和col10
col1和col2以及col10和col 4
无效:
col1和col2和col4
任何不包含col1和col2的东西
希望这可以帮助 .
Primary Key :由分区键[和可选的聚类键(或列)组成]Partition Key :分区键的哈希值用于确定群集中用于存储数据的特定节点Clustering Key :用于对每个分区(或负责节点及其副本)中的数据进行排序
Compound Primary Key :如上所述,群集密钥在主密钥中是可选的 . 如果他们不是一个简单的主键 . 如果提到了聚类键,则它是复合主键 .
Composite Partition Key :仅使用一列作为分区键,可能会导致 wide row issues (取决于用例/数据建模) . 因此,分区键有时被指定为多个列的组合 .
Regarding confusion of which one is mandatory ,在查询中可以跳过哪一个,尝试 imagine Cassandra as a giant HashMap 帮助 . 因此,在HashMap中,如果没有Key,则无法检索值 .在这里, Partition keys 扮演那个角色的角色 . 因此每个查询都需要指定它们 . 没有它,Cassandra将不知道要搜索哪个节点 .clustering keys (列,可选)有助于进一步提高在Cassandra发现负责该特定 Partition key 的特定节点(以及它的副本)之后缩小查询搜索范围 .
添加redux答案作为可接受的答案是很长的 . 术语“行”和“列”在CQL的上下文中使用,而不是如何实际实现Cassandra .
主键唯一标识一行 .
复合键是由多列组成的键 .
分区键是查找一组行(即分区)的主查找 .
聚类键是主键的一部分,它不是分区键(并定义了分区内的顺序) .
例子:
PRIMARY KEY (a) :分区键是 a .
PRIMARY KEY (a)
a
PRIMARY KEY (a, b) :分区键为 a ,群集键为 b .
PRIMARY KEY (a, b)
b
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)
(b, c)
PRIMARY KEY ((a, b), c) :复合分区键为 (a, b) ,聚类键为 c .
PRIMARY KEY ((a, b), c)
c
PRIMARY KEY ((a, b), c, d) :复合分区键为 (a, b) ,复合聚类键为 (c, d) .
PRIMARY KEY ((a, b), c, d)
(c, d)
在cassandra中,主键,分区键,复合键,聚类键之间的区别总是会产生一些混乱 . 所以我将在下面解释并与其他人联系起来 . 我们使用CQL(Cassandra查询语言)进行Cassandra数据库访问 . 注意: - 答案是根据Cassandra的更新版本 . Primary Key :-
CREATE TABLE Cass ( id int PRIMARY KEY, name text );
Create Table Cass ( id int, name text, PRIMARY KEY(id) );
在CQL中,为PRIMARY KEY定义列的顺序很重要 . 密钥的第一列称为分区密钥,其具有共享相同分区密钥(实际上甚至跨表)的所有行存储在同一物理节点上的属性 . 此外,对于给定表共享相同分区键的行上的插入/更新/删除是以原子方式单独执行的 . 注意,可以具有复合分区键,即由多列形成的分区键,使用额外的括号组来定义哪些列形成分区键 .
Partitioning and Clustering 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 .
我们可以有多个集群密钥以及依赖于声明的分区密钥 .
值得注意的是,在关系世界(复合键)中,你可能会使用那些更多的类似概念 .
示例 - 假设您必须找到最近加入用户组X的最后N个用户 . 在这种情况下,如果读取占主导地位,您将如何有效地执行此操作?像那样(来自官方Cassandra guide):
CREATE TABLE group_join_dates ( groupname text, joined timeuuid, join_date text, username text, email text, age int, PRIMARY KEY ((groupname, join_date), joined) ) WITH CLUSTERING ORDER BY (joined DESC)
这里, partitioning key 本身就是复合而 clustering key 是一个连接日期 . clustering key 是连接日期的原因是结果已经 sorted (并存储,这使得查找速度很快) . 但为什么我们使用复合键 partitioning key ?因为 we always want to read as few partitions as possible . 如何将 join_date 放在那里有帮助?现在来自同一组和相同加入日期的用户将驻留在一个分区中!这意味着我们将始终尽可能少地读取分区(首先从最新的分区开始,然后转到较旧的分区,依此类推,而不是在它们之间跳转) .
实际上,在极端情况下,您还需要使用join_date的哈希而不是join_date - 这样如果您查询最近3天,那么它们通常会共享相同的哈希,因此可以从同一个分区获得!
7 回答
简而言之:
Partition Key 对于一行来说只是 identification ,该标识大部分时间是单列(称为 Primary Key ),有时是多列的组合(称为 Composite Partition Key ) .
Cluster key 只不过 Indexing & Sorting . 群集密钥取决于以下几点:
在除主键列之外的where子句中使用哪些列 .
如果您有非常大的记录,那么我可以分配日期以便于管理 . 例如,我有一百万个县人口记录的数据 . 因此,为了便于管理,我基于状态和PIN码后对数据进行聚类等 .
在数据库设计中,复合键是一组非最小的超级键 .
复合键是一个包含复合键和至少一个不是超级键的属性的集合
给定表:员工{employee_id,firstname,surname}
可能的超级键是:
是唯一的最小超级密钥,它也是唯一的候选密钥 - 假设和不保证唯一性 . 由于主键被定义为所选择的候选键,并且在该示例中仅存在一个候选键,因此是最小超级键,唯一候选键和唯一可能的主键 .
复合键的详尽列表是:
唯一的组合键是{employee_id,firstname,surname},因为该键包含复合键({employee_id,firstname})和不是超级键()的属性 .
围绕这个有很多困惑,我会尽量让它变得简单 .
主键是一般概念,用于指示用于从表中检索数据的一个或多个列 .
主键可以是 SIMPLE ,甚至可以内联声明:
这意味着它是由一个列组成的 .
但主键也可以是 COMPOSITE (又名 COMPOUND ),由更多列生成 .
在 COMPOSITE 主键的情况下,键的"first part"被称为 PARTITION KEY (在此示例中 key_part_one 是分区键),键的第二部分是 CLUSTERING KEY (在此示例中为 key_part_two )
Please note that the both partition and clustering key can be made by more columns ,这是如何:
这些名字背后......
Partition Key 负责跨节点的数据分发 .
Clustering Key 负责分区内的数据排序 .
Primary Key 等同于单字段密钥表中的 Partition Key (即 Simple ) .
Composite/Compound Key 只是任何多列键
更多使用信息:DATASTAX DOCUMENTATION
小用法和内容示例
SIMPLE KEY:
table content
COMPOSITE/COMPOUND KEY 可以检索"wide rows"(即即使您已定义了聚类键,也可以只通过分区键进行查询)
table content
但您可以使用所有密钥(分区和群集)查询...
query output
重要说明:分区键是使用
where clause
执行查询所需的最小说明符 . 如果您有复合分区键,如下所示例如:
PRIMARY KEY((col1, col2), col10, col4))
您只能通过至少传递col1和col2来执行查询,这些是定义分区键的2列 . 要进行查询的“常规”规则是您必须至少传递所有分区键列,然后您可以按照它们设置的顺序可选地添加每个群集键 .
所以有效的查询是( excluding secondary indexes )
col1和col2
col1和col2和col10
col1和col2以及col10和col 4
无效:
col1和col2和col4
任何不包含col1和col2的东西
希望这可以帮助 .
Primary Key :由分区键[和可选的聚类键(或列)组成]
Partition Key :分区键的哈希值用于确定群集中用于存储数据的特定节点
Clustering Key :用于对每个分区(或负责节点及其副本)中的数据进行排序
Compound Primary Key :如上所述,群集密钥在主密钥中是可选的 . 如果他们不是一个简单的主键 . 如果提到了聚类键,则它是复合主键 .
Composite Partition Key :仅使用一列作为分区键,可能会导致 wide row issues (取决于用例/数据建模) . 因此,分区键有时被指定为多个列的组合 .
Regarding confusion of which one is mandatory ,在查询中可以跳过哪一个,尝试 imagine Cassandra as a giant HashMap 帮助 . 因此,在HashMap中,如果没有Key,则无法检索值 .
在这里, Partition keys 扮演那个角色的角色 . 因此每个查询都需要指定它们 . 没有它,Cassandra将不知道要搜索哪个节点 .
clustering keys (列,可选)有助于进一步提高在Cassandra发现负责该特定 Partition key 的特定节点(以及它的副本)之后缩小查询搜索范围 .
添加redux答案作为可接受的答案是很长的 . 术语“行”和“列”在CQL的上下文中使用,而不是如何实际实现Cassandra .
主键唯一标识一行 .
复合键是由多列组成的键 .
分区键是查找一组行(即分区)的主查找 .
聚类键是主键的一部分,它不是分区键(并定义了分区内的顺序) .
例子:
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的更新版本 . Primary Key :-
在cassandra中有两种不同的方式来使用主键 .
在CQL中,为PRIMARY KEY定义列的顺序很重要 . 密钥的第一列称为分区密钥,其具有共享相同分区密钥(实际上甚至跨表)的所有行存储在同一物理节点上的属性 . 此外,对于给定表共享相同分区键的行上的插入/更新/删除是以原子方式单独执行的 . 注意,可以具有复合分区键,即由多列形成的分区键,使用额外的括号组来定义哪些列形成分区键 .
Partitioning and Clustering PRIMARY KEY定义由两部分组成:分区键和聚类列 . 第一部分映射到存储引擎行键,而第二部分用于对一行中的列进行分组 .
这里device_id是分区键,checked_at是cluster_key .
我们可以有多个集群密钥以及依赖于声明的分区密钥 .
值得注意的是,在关系世界(复合键)中,你可能会使用那些更多的类似概念 .
示例 - 假设您必须找到最近加入用户组X的最后N个用户 . 在这种情况下,如果读取占主导地位,您将如何有效地执行此操作?像那样(来自官方Cassandra guide):
这里, partitioning key 本身就是复合而 clustering key 是一个连接日期 . clustering key 是连接日期的原因是结果已经 sorted (并存储,这使得查找速度很快) . 但为什么我们使用复合键 partitioning key ?因为 we always want to read as few partitions as possible . 如何将 join_date 放在那里有帮助?现在来自同一组和相同加入日期的用户将驻留在一个分区中!这意味着我们将始终尽可能少地读取分区(首先从最新的分区开始,然后转到较旧的分区,依此类推,而不是在它们之间跳转) .
实际上,在极端情况下,您还需要使用join_date的哈希而不是join_date - 这样如果您查询最近3天,那么它们通常会共享相同的哈希,因此可以从同一个分区获得!