我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。
primary key,
partition key,
composite key
clustering key
我一直在网上阅读文章,以了解以下关键类型之间的差异。但我似乎很难理解。举例肯定有助于更好地理解。
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查询,您将始终获得具有最大时间戳的记录。
复合键是指表的主键不是单列,而是多列。
主键是分区键和集群键的组合。
其他回答
由于已接受的答案相当长,所以添加一个摘要答案。术语“行”和“列”是在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
主键:像在许多数据库中一样,它是一个表中的唯一键,本质上它意味着,对于表中的任何两条记录,主键不能相同。数据库,在这种情况下,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键的特定节点(及其副本)后进一步缩小查询搜索范围。
简而言之:
分区键只是一行的标识,大多数情况下标识是单列(称为主键),有时是多列的组合(称为组合分区键)。
集群键只是索引和排序。集群键依赖于以下几点:
where子句中除了主键列外还使用哪些列。 如果你有非常大的记录,那么关于什么问题,我可以划分日期,以便于管理。例如,我有一个县100万的人口记录数据。因此,为了便于管理,我基于状态和pincode之后对数据进行了聚类。