2017-04-06 53 views
1

我有一個數據建模問題的情況下,數據需要通過可以修改的鍵排序。 所以,說我們有一個用戶表Cassandra排序和一個不斷變化的集羣密鑰

{ 
    dept_id text, 
    user_id text, 
    user_name text, 
    mod_date timestamp 
    PRIMARY KEY (dept_id,user_id) 
} 

現在我可以查詢卡桑德拉由dept_id爲獲得所有用戶。

如果我想查詢獲取部門中的所有用戶,按mod_date排序,該怎麼辦?

所以,一個辦法是

{ 
    dept_id text, 
    mod_date timestamp, 
    user_id text, 
    user_name text, 
    PRIMARY KEY (dept_id, mod_date,user_id) 
} 

但是,mod_date的每一次變化的用戶名進行更新。所以它不能成爲集羣密鑰的一部分。

嘗試1:
不要更新行,而是爲每一個更新創造新的紀錄。

所以,說爲用戶foo記錄是像下面 {'dept_id1',TimeStamp1','user_id1','foo'} ,然後更名爲「巴」,然後到「巴茲」。 在這種情況下,我們添加另一行表,所以它看起來像

{'dept_id1',TimeStamp3','user_id1','baz'} 
{'dept_id1',TimeStamp2','user_id1','bar'} 
{'dept_id1',TimeStamp1','user_id1','foo'} 

現在,我們可以得到所有用戶在一個部門,由mod_date排序,但它提出了一個不同的問題。

返回的數據被複制

嘗試2: 添加另一列識別很像一個鏈表

{ 
    dept_id text, 
    mod_date timestamp, 
    user_id text, 
    user_name text, 
    next_record text 
    PRIMARY KEY (dept_id,mod_date,user_id) 
} 

每次更新發生它的頭記錄添加一行並還增加了新的記錄的PK。

{'dept_id1',TimeStamp3','user_id1','baz','HEAD'} 
{'dept_id1',TimeStamp2','user_id1','bar','dept_id1#TimeStamp3'} 
{'dept_id1',TimeStamp1','user_id1','foo','dept_id1#TimeStamp2'} 

並且還將一個二級索引添加到'next_record'列。

現在我可以支持其中的dept_id =從用戶獲得所有用戶的部門,由mod_date排序由

SELECT * ':部門' AND next_record = 'HEAD' 爲了 通過mod_date。

但它看起來相當複雜的解決方案,也許我失去了一些東西,一個簡單的解決方案..

另一種選擇是刪除和插入,但對高頻率的變化,我認爲卡桑德拉有墓碑的問題。

建議/意見反饋。 謝謝!

+0

您使用哪個cassandra版本?另一件事你的主鍵是'dept_id,user_id,mod_date',所以你的數據按照user_id排序,然後mod_date在dept_id下排序? –

+0

謝謝。我更新了問題以反映所需的排序順序。 user_id只是噪音問題。我希望希望問題的意圖是明確的。我正在使用Cassandra 2.2.x – factotum

回答

0

正如我所看到的,最簡單的方法是對應用程序(客戶端代碼)端的用戶進行排序。您使用dept作爲分區鍵,這意味着一個部門中的所有用戶都可以處理一個cassandra節點,因此一個部門中沒有多個用戶,並且可以在應用程序端快速排序此用戶。

相關問題