2012-03-06 15 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