2014-01-26 71 views
0

我是Casssandra的新手,我覺得難以實現數據模型。定義Cassandra datamodel的難度

我已經面臨很多問題來設計一個表。

之前我提到的表定義,我想告訴你,我們必須檢索和更新記錄

select * from email where username='suresh' and inactive='N' and type='outbound' 
    order by insert_ts desc allow filtering; 
update email set inactive='Y' where username='suresh' and inactive='N' 
    and id=101; 

要創建一個表,我應該遵循所有卡桑德拉定義的規則的方式。我面臨的問題,同時爲表

指標如果我創建這樣

PRIMARY KEY(username, inactive,type,insert_ts); 

我能夠檢索記錄,但是當我做更新,我得到錯誤說主鍵「主鍵部分在設置中找到「錯誤。

如果我創建主鍵和像下面

PRIMARY KEY(username, type,insert_ts); 
Secondary index = inactive; 

我能夠做的更新,但是當我找回,我得到錯誤說

「二級索引將不會被使用ORDER BY子句允許」次級鍵

我創建使用定製列表的電子郵件表像

Create table email(id int, username varchar, comment text, 
    inactive boolean, insert_ts timestamp, type varchar, 
PRIMARY KEY(<<some columns yet to decide>>)); 

請建議我如何創建滿足我的查詢郵件表。

回答

0

根據您的信息,inactive不應該是主鍵的一部分,因爲它是您打算隨時間而改變而不創建新行的一部分。以此作爲基本假設,您需要使用PRIMARY KEY(username, type, insert_ts);

您將無法同時使用二級索引進行篩選並使用ORDER BY [anything]。查詢引擎從2.0.3開始不允許這樣做。兩種緩解方法是可能的:

1)不要使inactive成爲索引,並且不要使用它進行過濾。

鑑於你的例子,inactive似乎是一個低基數值(Y或N),並且此外,你是在時間(您限制兩者的由username和/或id查詢)操縱幾行。因此,就結果數量而言,從查詢中省略inactive應該不昂貴。使用SELECT時,您可以在客戶端上過濾inactive行。

2)請勿使用ORDER BY時間戳。

和上面一樣,除了在客戶端上進行篩選之外,您現在負責在客戶端進行排序。

應該根據您的數據和使用情況來決定哪種緩解更合適。我的直覺是,#1是最好的方式,因爲你引入了極低的基數,可能經常更新索引,看起來似乎是相當邊際的附加便利。

0

感謝您的回覆。

根據你的建議,我明白應該從主鍵中刪除具有低基數的非活動列。我很好,我會在客戶端進行不活躍的過濾。但是,在客戶端過濾insert_ts不會解決我的問題,因爲該表中將存在數千個電子郵件記錄。

Create table email(id int, username varchar, comment text, 
    inactive boolean, insert_ts timestamp, type varchar, 
PRIMARY KEY(username,type,insert_ts, id)) 
With Clustering(Type ASC, insert_ts desc, id asc); 

此外,我想在主鍵添加ID列,因爲我們有100卡桑德拉的限制,顯示的電子郵件記錄的要求有限制條款需要過濾的照顧,我可以使用的值id找到下一個100條記錄。

例如:

Select * from email where username='suresh' and type='outbound' 
    order by type,insert_ts desc, id 
Limit 101; 

在這種情況下,我知道101的記錄ID,我用它來要求它需要獲取下100個記錄。

我希望我能理解。如果你看到任何差距,請給我建議。

+0

從你迄今爲止提供的內容來看,你應該沒有問題根據insert_ts進行​​過濾或排序。因爲在插入行後它永遠不會改變,所以可以將它添加到主鍵中,然後按照原始帖子中的第一個SELECT查詢在WHERE或ORDER BY中使用它(唯一的區別是,您不會在WHERE中無效)。 –

+0

至於id,我不認爲你需要額外的列來做你想做的。只需存儲主鍵(username + type + insert_ts)的最後一個返回值並將該值用於分頁,而不需要額外的列。有關詳細信息,請參閱此答案:http://stackoverflow.com/questions/11832886/cassandra-cql-method-for-paging-through-all-rows。 –