Cassandra数据模型的改进

时间:2012-11-09 17:33:07

标签: cassandra data-modeling

我遇到过这个问题,而我无法弄清楚要做什么,所以说我保留了这些用户操作:

  • 喜欢
  • 评论
  • 上传

等等,列表转到20个动作,现在我想出的最好的策略是创建一个CF让我们称之为user_actions,然后使用复合行(我认为这是怎么回事他们被称为。)

因此行将由user_id:action组成,现在我想有些人会问为什么不将所有用户操作存储在一行中?那么这是我最大的问题,因为我希望用户有一个选项,可以选择用户想知道他什么时候想要检查他的朋友或他自己过去做过什么。

所以说用户想看看他的朋友喜欢什么,我需要做的就是得到所有这些喜欢的那一行,简单吧?

但是,如果用户想要查看everything(这是默认选项),那么我需要进行~20查询,我想这可能会有点流量,但是,如果我每秒有100k读取意味着100k * 20,那听起来很糟糕......

但我只是看不到任何其他方式,因为如果我将所有内容存储在一行中,当cassandra不支持WHERE时,如何查询个别操作?

顺便说一下,我正在使用phpphpcassa lybrary。

1 个答案:

答案 0 :(得分:1)

您最终需要对动作信息进行分页。

此外,您还希望能够对按事件日期排序的数据进行分页,并过滤用户希望查看的操作类型。我建议如下:

  • 每个操作类型一行。
  • 键是userId + actionType
  • 列名是[dateinteger + EventId]
  • 列值是序列化为单个字符串的事件对象

您可以使用与用户选择的操作对应的userId + actionType列表来查询数据。并对列名称进行切片以对结果进行分页或按日期范围进行过滤。

我认为这种方法比对所有用户操作使用单行更好,因为您可以按日期轻松订购记录,还可以选择要查询的操作类型。使用单行,您必须在按操作类型或按日期排序记录之间进行选择。

此外,这比每个动作事件都有一个行更好(IMO),因为您需要创建二级索引才能正确查询数据。