Cassandra如何存储多列主键(CQL)

10

我对在Cassandra中使用CQL的复合行键有些误解。 假设我有以下内容:

cqlsh:testcql> CREATE TABLE Note (
           ... key int,
           ... user text,
           ... name text
           ... , PRIMARY KEY (key, user)
           ... );
cqlsh:testcql> INSERT INTO Note (key, user, name) VALUES (1, 'user1', 'name1');
cqlsh:testcql> INSERT INTO Note (key, user, name) VALUES (1, 'user2', 'name1');
cqlsh:testcql>
cqlsh:testcql> SELECT * FROM Note;

 key | user  | name
-----+-------+-------
   1 | user1 | name1
   1 | user2 | name1

这些数据是如何存储的?是两行还是一行。

如果是两行,那么有可能出现相同键的多行吗? 如果只有一行,则使用键=1且用户从“user1”到“user1000”的记录是否意味着它将具有一个键为1的行和1000个包含每个用户名称的列?

可以有人解释一下后台正在发生什么吗?谢谢。

1个回答

11
所以,经过进一步的挖掘和Lyuben Todorov建议的阅读文章(谢谢),我找到了我的问题的答案。
Cassandra将数据存储在称为行的数据结构中,这与关系型数据库完全不同。行具有唯一的键。
现在,在我的示例中发生了什么... 在表Note中,我定义了一个复合键,称为PRIMARY KEY (key, user)。只有此键的第一个元素充当行键,并且它被称为分区键。在内部,此键的其余部分用于构建复合列。
在我的示例中
 key | user  | name
-----+-------+-------
   1 | user1 | name1
   1 | user2 | name1

这将在Cassandra中表示为一行:
-------------------------------------
|   | user1:name    | user2:name    |
| 1 |--------------------------------
|   | name1         | name1         |
-------------------------------------

了解到这一点后,很明显将具有大量唯一值(且不断增长)的任何列添加到复合键中都不是一个好主意,因为它将存储在一行中。如果您在复合主键中有多个类似的列,则更糟糕。

更新:后来我发现Aaron Morton的博客文章对此进行了更详细的解释。


1
博客文章已不存在 =( - Highstead
1
@Highstead 更新了博客文章的新地址链接。 - Marius Waldal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接