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

f8rj6qna  于 2021-06-09  发布在  Cassandra
关注(0)|答案(2)|浏览(392)

我是新来Cassandra和有几个初级水平的问题,在主键。
每个记录的主键应该是唯一的吗(我的猜测是不可能的。假设我的table是这个样子

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

我猜我可以有多行具有相同的 user_id 如果主键不是每个记录一个,那么可以将主键拆分到多个分区中吗?
分区可以有多个主键吗?
是主键本身决定选择分区,还是主键的哈希码用于选择分区?
把分区看作一个文件公平吗?

6l7fqoea

6l7fqoea1#

1> 每个记录的主键应该是唯一的吗(我的猜测是不可能的。假设我的table是这个样子

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

每个记录/行的主键应该是唯一的。在您提到的示例中,用户id只能有一条记录。要允许多行具有相同的用户id,必须引入区分键。这个密钥在cassandra中称为集群密钥,它构成主键的一部分。
主键是(分区键和群集键)的组合。分区键由cassandra用来查找分区/记录。如果在数据模型中定义了聚类键,那么它将用于区分不同的行。如果在您的案例中没有定义集群键,那么数据库中将只保留一条记录。
在下面的示例中,您可以拥有生活在不同状态的相同用户id记录。这里的主键是(用户id,状态)的组合。user\u id是分区密钥,state是集群密钥。

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

我猜我可以有多个具有相同用户id的行
如上所述,如果您定义一个集群键,那么您可以有多个具有相同用户id的行,否则在您引用的示例中,这是不可能的。
2> 如果主键不是每个记录一个,那么可以将主键拆分到多个分区中吗?
主键不能跨多个分区拆分。如上所述,主键的分区键部分将始终指向唯一分区。
3> 分区可以有多个主键吗?
在我引用的示例中,(1,rj),(1,gj)可以是指向分区键值1所指向的单个分区的可能主键。因此,在这种意义上,一个分区可以有多个主键。
4> 是主键本身决定选择分区,还是主键的哈希码用于选择分区?
分区键(主键的一部分)的hashcode用于获取分区
5> 把分区看作一个文件公平吗?
这将取决于您的数据模型。

hl0ma9xz

hl0ma9xz2#

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

相关问题