2013-07-17 79 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