理解Cassandra中主键和分区之间的关系



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

  1. 主键应该是每个记录唯一的吗?(我猜不会。(详细说明。假设我的桌子是这样的
CREATE TABLE user_action (
user_id int,
action text,
date_of_action date,
PRIMARY KEY (user_id)
)

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

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

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

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

  4. 把分区看作一个文件公平吗?

主键和Partition键在某些情况下是相同的,但并不总是相同,这取决于主键的数量。数据是基于分区密钥分发的,分区密钥在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是分区密钥,state是集群密钥。

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

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

如上所述,如果您定义了一个集群键,则可以有多个具有相同user_id的行,否则对于您引用的示例,这是不可能的。

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

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

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

在我引用的例子中,(1,RJ(、(1,GJ(可能是指向分区键值1所指向的单个分区的主键。因此,从这个意义上说,您可以为一个分区拥有多个主键。

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

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

5>把分区看作一个文件公平吗?

这将取决于您的数据模型。

最新更新