我有一個數據建模問題的情況下,數據需要通過可以修改的鍵排序。 所以,說我們有一個用戶表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。
但它看起來相當複雜的解決方案,也許我失去了一些東西,一個簡單的解決方案..
另一種選擇是刪除和插入,但對高頻率的變化,我認爲卡桑德拉有墓碑的問題。
建議/意見反饋。 謝謝!
您使用哪個cassandra版本?另一件事你的主鍵是'dept_id,user_id,mod_date',所以你的數據按照user_id排序,然後mod_date在dept_id下排序? –
謝謝。我更新了問題以反映所需的排序順序。 user_id只是噪音問題。我希望希望問題的意圖是明確的。我正在使用Cassandra 2.2.x – factotum