2012-11-09 46 views
1

所以,我碰到这个问题,我只是不知道该怎么做,所以说我保持这些用户操作:Cassandra的数据模型改良效果

  • 喜欢
  • 评论
  • 股份
  • 上传

等等,不胜枚举各地20行动,现在我想出了最好的策略是建立一个单一的CF让我们将其称为user_actions,然后使用复合行(我认为这就是它们的调用方式)。

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

所以说用户想看看他的朋友喜欢什么,我所需要做的就是让所有那些喜欢的那一排,简单的权利?

但是如果用户想要看everything(这是默认选项),那么我需要制作~20查询,那么我想这对小流量来说可以,但是如果我有100k读取每秒意味着100k * 20,这听起来很可怕...

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

顺便说一句我使用的是phpphpcassa lybrary。

+0

您可以通过名称范围(例如:BA ...到BZ ...)查询列并获取行片。 – lstern

+0

另外,您可以在一个请求中获得多个密钥。 – lstern

+0

@lstern但不是同一件事?我的意思是我仍然需要为每个动作制作20片 – Linas

回答

1

您最终需要分页操作信息。

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

  • 每行动类型一行。
  • 关键是用户id +操作类型
  • 列名是[dateinteger + EVENTID]
  • 列的值是序列化到一个字符串的事件对象

可以使用用户id +操作类型列表中查询数据对应于用户选择的动作。然后对列名进行分片以对结果进行分页或按日期范围进行过滤。

我认为这种方法比使用单行处理所有用户操作要好,因为您可以轻松地按日期排序记录,还可以选择要查询的操作类型。使用单个行,您必须按操作类型或按日期排序来选择。

此外,对于每个操作事件,这比(IMO)更好,因为您需要创建二级索引以正确查询数据。

+0

是的,我认为这是正确的做法,就像我刚刚在聊天中提到的那样,为分页制作正确的列片将会有点困难,但我想我可以从这里弄清楚:) – Linas