问题描述
我是Cassandra的新手,主键中有一些新手级别的问题。
- 每个记录的主键是否应该唯一? (我的猜测不是。) 详细说明。假设我的桌子是这样的
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
-
如果主键不是每个记录一个,那么主键可以拆分为多个分区吗?
-
一个分区可以有多个主键吗?
-
主键本身是决定选择分区还是主键的hashCode用于选择分区?
-
将分区视为文件是否公平?
解决方法
在某些情况下,主键和分区键是相同的,但并不总是相同,这取决于主键的数量。数据是基于分区键分配的,分区键在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>将分区视为文件是否公平?
这取决于您的数据模型。