2013-07-17 53 views
10

我对Cassandra中的CQL复合行键有点误解。 比方说,我有以下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列包含每个用户的名称?

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

回答

11

所以,在挖了多一点和reading an article建议Lyuben Todorov(谢谢)我找到了我的问题的答案。

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

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

在我的例子

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

这将在卡桑德拉在一排被表示为

------------------------------------- 
| | user1:name | user2:name | 
| 1 |-------------------------------- 
| | name1   | name1   | 
------------------------------------- 

有知道,很明显,这不是一个好主意,用大量添加任何列对复合键的唯一值(和增长),因为它将存储在一行中。更糟糕的是,如果在复合主键中有多个这样的列。

更新:后来我发现this blog post by Aaron Morton比解释更详细的相同。

+1

博客帖子不再存在=( – Highstead

+1

@Highstead更新了该博客文章新地址的链接 – Moonwalkr