2012-03-06 78 views
1

需要一些幫助來設計通知的數據模型。所以,我想使用Cassandra,並有一個網頁,我想爲用戶f.e存儲通知。 :Cassandra通知功能的數據模型設計

  • 收到一則由
  • 用戶XYZ投您的照片
  • 等...

用戶必須得到最後通知的範圍,刪除單個通知。所以我需要一個最佳模式(50%的讀取與50%的寫入??)。

我下面的想法...(你覺得呢?通過時間戳怎麼樣密鑰的排序):

notifications { 
    john : { 
     111-1123-3242-9202 : {type: 'newmail'; ...; timestamp: 321948293849} 
     555-1123-aaac-ccc3 : {type: 'voted'; ...; timestamp: 321948293433} 
    } 

    anna : {...} 

    ... 
} 

真的在此先感謝!

湯姆

回答

4

我假設 「通知」 是你的CF,和 「John」, 「安娜」 等都是行鍵。

假設每個通知的數據相對較小或永遠不需要更新,我建議您爲列名使用時間戳,並將整個序列化通知(可能爲json)放入列值中。這將使您可以非常高效地獲取最近的N個通知,並且可以輕鬆刪除單個通知。

使用pycassa,取數據查詢和刪除可能是這樣的:

def get_notifications_for(user): 
    cols = notifications_cf.get(user, column_count=10) 
    return map(json.loads, cols.values()) 

def delete_notification(user, notification_timestamp): 
    notifications_cf.remove(user, columns=[notification_timestamp]) 

我這裏假設你已經設置你的比較是LongType(reversed=true),這意味着您的通知將被保存在按時間倒序如果您使用列名稱的時間戳,請按順序。

+0

這是偉大的提示!謝謝 – tomekkup 2012-03-23 11:28:55

+0

嗯...我再次提出一些問題:在此用例中使用Long作爲列類型不安全?理論上可以生成重複的列名稱。我正在使用Hector&Java並使用System.currentTimeInMillis()生成時間。當然,我可以更改爲TimeUUID,但不知道是否需要。 – tomekkup 2012-06-22 13:04:06

+0

是的,如果您擔心碰撞,請改用TimeUUID。這將工作得很好。 – 2012-06-23 04:31:51