我对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
这些数据是如何存储的?有2行还是1行。
如果两个,那么如何使用相同的密钥来存在多个行? 如果一个用key = 1的记录,用户从“user1”到“user1000”,那么它是否意味着它有一行key = 1和1000列包含每个用户的名字?
有人可以解释背景情况吗?感谢。
答案 0 :(得分:11)
所以,在经过reading an article(谢谢)建议的更多和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 |
-------------------------------------
知道很明显,将任何具有大量唯一值(并且正在增长)的列添加到组合键中并不是一个好主意,因为它将存储在一行中。如果在复合主键中有多个这样的列,那就更糟了。
更新:稍后我找到this blog post by Aaron Morton,而不是更详细地解释相同内容。