2012-01-16 49 views
0

我要打兩個族查詢一次......我使用的卡桑德拉 - CQL寶石鋼軌和我的專欄系列包括:卡桑德拉CQL樣的Multiget的

用戶
以下
追隨者
USER_COUNT
MESSAGE_COUNT
消息

現在我想從用戶關注的人得到的所有消息。是否有一種cassandra-cql的multiget,或者是否有其他可能性,通過更改數據模型來獲取這種數據?

回答

2

我會把你當前的數據模型稱爲傳統的實體/關係設計。這對使用SQL數據庫是有意義的。當你有一個關係數據庫時,你依靠連接來構建跨多個實體的視圖。

Cassandra沒有任何執行連接的能力。因此,不要基於實體和關係建模數據,而應根據您打算如何查詢它進行建模。對於'用戶所關注的人的所有消息'的示例,您可能有一個列家族,其中rowkey是用戶標識,列是來自用戶所關注人員的所有消息(其中列名是時間戳+用戶ID和值爲消息):

RowKey        Columns 
------------------------------------------------------------------- 
|  | TimeStamp0:UserA | TimeStamp1:UserB | TimeStamp2:UserA | 
| UserID |------------------|------------------|------------------| 
|  | Message   | Message   | Message   | 
------------------------------------------------------------------- 

你可能還需要一列族的所有特定用戶寫郵件(我假設該消息被廣播到所有用戶,而不是給一個特定用戶):

RowKey     Columns 
-------------------------------------------------------- 
|  | TimeStamp0 | TimeStamp1 | TimeStamp2  | 
| UserID |------------|------------|-------------------| 
|  | Message | Message | Message   | 
-------------------------------------------------------- 

現在,當您創建新消息時,您需要將其插入多個位置。但是當你需要列出用戶關注的人的所有消息時,你只需要從一行中獲取(這很快)。

顯然,如果您支持更新或刪除郵件,則需要在存在郵件副本的任何地方執行此操作。您還需要考慮當用戶關注或取消關注某人時會發生什麼。這個問題有多種解決方案,您的解決方案將取決於您希望應用程序的行爲方式。

+0

感謝您的回答,我會嘗試一下,但是如何在cassandra-cql中創建這種密鑰(TimeStamp:User)?還是你想過一些ruby字符串操作來綁定該鍵名?我有一種與cql一起使用的組合鍵嗎? – user934801 2012-01-16 16:20:10

+2

Cassandra支持複合列名稱,但它尚未通過CQL公開([目前爲1.1版本的目標](https://issues.apache.org/jira/browse/CASSANDRA-2474))。所以你可以使用thrift接口,或者你可以使用列名稱的時間戳,然後使用你喜歡的格式(json,協議緩衝區等)在正文中序列化user_id +消息。 – psanford 2012-01-16 16:27:40