我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。

primary key,
partition key, 
composite key 
clustering key

当前回答

主键:像在许多数据库中一样,它是一个表中的唯一键,本质上它意味着,对于表中的任何两条记录,主键不能相同。数据库,在这种情况下,Cassandra的设计是为了确保这个条件在所有情况下都成立。因此,如果您尝试以PK1作为主键来编写记录,如果已经存在具有相同键PK1的记录,那么它将被覆盖,否则将创建一条新记录。

Partition Key: It is a construct of distributed databases(where data of a single table is divided into multiple parts called partitions). Partitions are then distributed across nodes using a distribution strategy(usually, hash of partition key) to get infinite scaling capabilities. Having said that, partition key is a set of columns of a record that decides which partition this record will belong to. And hence, partition key decides the physical location of a record across distributed cluster of nodes.

聚类键:聚类键决定特定分区中记录的顺序。因此,如果一个分区中有10K条记录,聚类键将决定这些10K以排序方式物理存储的顺序。

例子:

假设您在Cassandra中有一个表,用于存储电子商务网站的销售事件。

[order_id, item_id, quantity, amount, payment_id, status, order_time, PRIMARY KEY( (order_id, item_id), order_time)] with clustering ORDER BY (order_time DESC);

这里,

主键是((order_id, item_id), order_time),它将决定表中记录的唯一性。

分区键是(order_id, item_id),该元组的哈希值将决定该记录的分区和它在分布式集群上的位置。

Clustering Key是order_time,对于特定分区,记录将按照order_time降序排列。因此,如果您对特定分区执行Limit 1 cql查询,您将始终获得具有最大时间戳的记录。

复合键是指表的主键不是单列,而是多列。

主键是分区键和集群键的组合。

其他回答

主键:由分区键[和可选的集群键(或列)]组成 分区键:通过“分区键”的哈希值确定数据在集群中的具体节点

聚类键:用于对每个分区(或负责节点及其副本)中的数据进行排序。

复合主键:如上所述,聚类键在主键中是可选的。如果没有提到它们,它就是一个简单的主键。如果提到了集群键,则它是复合主键。

组合分区键:只使用一列作为分区键,可能会导致行宽问题(取决于用例/数据建模)。因此,分区键有时被指定为多个列的组合。

对于查询中哪些是强制的,哪些是可以跳过的等等,尝试将Cassandra想象成一个巨大的HashMap会有所帮助。在HashMap中,你不能在没有Key的情况下检索值。

在这里,分区键扮演该键的角色。因此,每个查询都需要指定它们。没有这个卡桑德拉就不知道该搜索哪个节点。

集群键(列,可选)有助于在Cassandra找到负责特定Partition键的特定节点(及其副本)后进一步缩小查询搜索范围。

由于已接受的答案相当长,所以添加一个摘要答案。术语“行”和“列”是在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)。

免责声明:这是特定于DynamoDB的答案,但这些概念也适用于Cassandra,因为两者都是NoSQL数据库。

创建表时,除表名外,还必须指定表的主键。主键唯一地标识表中的每个项,因此没有两个项可以具有相同的键。

DynamoDB支持两种不同的主键:

分区键-一个简单的主键,由一个称为分区键的属性组成。

DynamoDB使用分区键的值作为内部哈希函数的输入。散列函数的输出决定了项目将存储在其中的分区(DynamoDB内部的物理存储)。

在只有一个分区键的表中,不能有两个项具有相同的分区键值。

分区键和排序键——称为组合主键,这种类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键。

DynamoDB使用分区键值作为内部哈希函数的输入。散列函数的输出决定了项目将存储在其中的分区(DynamoDB内部的物理存储)。具有相同分区键值的所有项存储在一起,按排序键值排序。

在具有分区键和排序键的表中,两个项可能具有相同的分区键值。但是,这两个项必须具有不同的排序键值。

复合主键在查询数据时提供了额外的灵活性。例如,如果只提供Artist的值,DynamoDB将检索该艺术家的所有歌曲。为了只检索特定艺术家的歌曲子集,可以为artist提供一个值,同时为SongTitle提供一系列值。

注意:一个项目的分区键也称为它的哈希值 属性。术语哈希属性派生自内部 在DynamoDB中均匀分布数据项的哈希函数 分区,基于其分区键值。

项的排序键也称为它的范围属性。术语range属性来源于DynamoDB将具有相同分区键的项物理地存储在一起的方式,按排序键值排序。

参考资料- https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

值得注意的是,在关系世界(复合键)中,您可能会更多地使用这些类似的概念。

示例-假设您必须找到最近加入用户组x的最后N个用户,在这种情况下,如果读取占优势,您将如何有效地完成此工作?就像这样(来自Cassandra官方指南):

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)

Here, partitioning key is compound itself and the clustering key is a joined date. The reason why a clustering key is a join date is that results are already sorted (and stored, which makes lookups fast). But why do we use a compound key for partitioning key? Because we always want to read as few partitions as possible. How putting join_date in there helps? Now users from the same group and the same join date will reside in a single partition! This means we will always read as few partitions as possible (first start with the newest, then move to older and so on, rather than jumping between them).

事实上,在极端情况下,您还需要使用join_date的散列,而不是单独使用join_date—因此,如果您查询最近3天,通常这些散列共享相同的散列,因此可以从同一个分区使用!

主键:像在许多数据库中一样,它是一个表中的唯一键,本质上它意味着,对于表中的任何两条记录,主键不能相同。数据库,在这种情况下,Cassandra的设计是为了确保这个条件在所有情况下都成立。因此,如果您尝试以PK1作为主键来编写记录,如果已经存在具有相同键PK1的记录,那么它将被覆盖,否则将创建一条新记录。

Partition Key: It is a construct of distributed databases(where data of a single table is divided into multiple parts called partitions). Partitions are then distributed across nodes using a distribution strategy(usually, hash of partition key) to get infinite scaling capabilities. Having said that, partition key is a set of columns of a record that decides which partition this record will belong to. And hence, partition key decides the physical location of a record across distributed cluster of nodes.

聚类键:聚类键决定特定分区中记录的顺序。因此,如果一个分区中有10K条记录,聚类键将决定这些10K以排序方式物理存储的顺序。

例子:

假设您在Cassandra中有一个表,用于存储电子商务网站的销售事件。

[order_id, item_id, quantity, amount, payment_id, status, order_time, PRIMARY KEY( (order_id, item_id), order_time)] with clustering ORDER BY (order_time DESC);

这里,

主键是((order_id, item_id), order_time),它将决定表中记录的唯一性。

分区键是(order_id, item_id),该元组的哈希值将决定该记录的分区和它在分布式集群上的位置。

Clustering Key是order_time,对于特定分区,记录将按照order_time降序排列。因此,如果您对特定分区执行Limit 1 cql查询,您将始终获得具有最大时间戳的记录。

复合键是指表的主键不是单列,而是多列。

主键是分区键和集群键的组合。