了解Cassandra中主键与分区之间的关系

问题描述

我是Cassandra的新手,主键中有一些新手级别的问题。

  1. 每个记录的主键是否应该唯一? (我的猜测不是。) 详细说明。假设我的桌子是这样的
error

我猜我可以有多行具有相同的create table product( productid int,
 description varchar(20) ); 
insert into product (
productid,
description )
Values ( 42,' tv'); ERROR: column "description" of relation "product" does not exist

  1. 如果主键不是每个记录一个,那么主键可以拆分为多个分区吗?

  2. 一个分区可以有多个主键吗?

  3. 主键本身是决定选择分区还是主键的hashCode用于选择分区?

  4. 将分区视为文件是否公平?

解决方法

在某些情况下,主键和分区键是相同的,但并不总是相同,这取决于主键的数量。数据是基于分区键分配的,分区键在Cassandra群集中是唯一的。我在这里没有解释所有场景和概念,但是是的,您应该仔细阅读文档,并确保在阅读下面的链接后可以很快理解所有内容。

https://www.datastax.com/blog/2016/02/most-important-thing-know-cassandra-data-modeling-primary-key

https://docs.datastax.com/en/dse/5.1/cql/cql/cql_using/useCompoundPrimaryKeyConcept.html

,

1>每个记录的主键是否应该唯一? (我的猜测是 不。要详细说明。假设我的桌子看起来像这样

 CREATE TABLE user_action ( user_id int,action text,date_of_action
 date,PRIMARY KEY (user_id) )

每个记录/行的主键应该是唯一的。在您提到的示例中,user_id只能有一条记录。为了允许具有相同user_id的多行,您必须引入一个区分键。该键在Cassandra中称为集群键,它构成主键的一部分。

主键是(分区键和集群键)的组合。 Cassandra使用分区键来查找分区/记录。如果在数据模型中定义了聚簇键,那么它将用于区分不同的行。如果没有根据您的情况定义聚类键,那么数据库中将仅保留一条记录。

在下面的示例中,您可以拥有生活在不同州的相同user_id记录。这里的主键是(user_id,state)的组合。 user_id是分区键,状态是集群键。

CREATE TABLE user_action (
user_id int,state text,date_of_action date,PRIMARY KEY (user_id,state)
)

我猜我可以有多个具有相同user_id的行

如上所述,如果您定义聚类键,则可以有多个具有相同user_id的行,否则在引用的示例中是不可能的。

2>如果主键不是每条记录一个,可以拆分主键 跨多个分区?

主键不能在多个分区上分割。如上所述,主键的分区键部分将始终指向唯一分区。

3>一个分区可以有多个主键吗?

在我引用的示例中,(1,RJ),(1,GJ)可能是指向由分区键值1指向的单个分区的主键。因此,在这种意义上,分区可以有多个主键

4>是由主键本身决定选择分区还是由 用于选择分区的主键的hashCode?​​ p>

分区键(主键的一部分)的哈希码用于获取分区

5>将分区视为文件是否公平?

这取决于您的数据模型。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...