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

Vla*_*kov 10 cql cassandra

我对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
Run Code Online (Sandbox Code Playgroud)

这些数据是如何存储的?有2行还是1行.

如果两个,那么如何使用相同的密钥有多个行?如果一个用key = 1的记录,用户从"u​​ser1"到"user1000",那么它是否意味着它有一行key = 1和1000列包含每个用户的名字?

有人可以解释背景上发生了什么吗?谢谢.

Vla*_*kov 11

所以,在挖掘了一点并阅读Lyuben Todorov建议的文章(谢谢)后,我找到了我的问题的答案.

Cassandra将数据存储在称为行的数据结构中,这与关系数据库完全不同.行有一个独特的键.

现在,我的例子中发生了什么...在表格中Note我有一个复合键定义为PRIMARY KEY (key, user).只有此键的第一个元素充当行键,它被称为分区键.在内部,此键的其余部分用于构建复合列.

在我的例子中

 key | user  | name
-----+-------+-------
   1 | user1 | name1
   1 | user2 | name1
Run Code Online (Sandbox Code Playgroud)

这将在Cassandra中以一行表示

-------------------------------------
|   | user1:name    | user2:name    |
| 1 |--------------------------------
|   | name1         | name1         |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)

已经知道很明显,将任何具有大量唯一值(并且不断增长)的列添加到组合键中并不是一个好主意,因为它将存储在一行中.如果在复合主键中有多个这样的列,那就更糟了.

更新:后来我发现Aaron Morton撰写的这篇博文并没有详细解释相同内容.