Cassandra 卡桑德拉数据模型改进
我遇到了这个问题,我就是不知道该怎么办,所以假设我保留这些用户操作:Cassandra 卡桑德拉数据模型改进,cassandra,data-modeling,Cassandra,Data Modeling,我遇到了这个问题,我就是不知道该怎么办,所以假设我保留这些用户操作: 喜欢 评论 分享 上传 以此类推,列表中大约有20个动作,现在我想到的最好的策略是创建一个CF,我们称之为user\u动作,然后使用复合行(我想这就是它们的名称) 因此,行将由用户id:action组成,现在我想有些人会问,为什么不将所有用户操作存储在一行中?这是我最大的问题,因为我希望用户有一个选项来选择用户希望看到的,当用户说他想查看他的朋友或他自己在过去做了什么 所以,假设用户想看看他的朋友喜欢什么,我所需要做的就是
- 喜欢
- 评论
- 分享
- 上传
user\u动作,然后使用复合行(我想这就是它们的名称)
因此,行将由用户id:action
组成,现在我想有些人会问,为什么不将所有用户操作存储在一行中?这是我最大的问题,因为我希望用户有一个选项来选择用户希望看到的,当用户说他想查看他的朋友或他自己在过去做了什么
所以,假设用户想看看他的朋友喜欢什么,我所需要做的就是得到所有这些喜欢的行,很简单吧
但是,如果用户想查看所有内容(这是默认选项),那么我需要进行~20
查询,我想这可以通过一些流量实现,但是如果我每秒有100k次读取,这意味着100k*20,这听起来很可怕
但我看不到任何其他方法,因为如果我将所有内容存储在一行中,当cassandra不支持WHERE
时,我如何查询单个操作
顺便说一下,我正在使用php
和phpcassa
lybrary。您最终需要对操作信息进行分页
此外,您还希望能够对按事件日期排序的数据进行分页,并筛选用户希望看到的操作类型。我建议如下:
- 每个动作类型一行
- 键是userId+actionType
- 列名为[dateinteger+EventId]
- 列值是序列化为单个字符串的事件对象
您可以使用与用户选择的操作相对应的userId+actionType列表来查询数据。并对列名进行切片以对结果分页,或按日期范围进行筛选
我认为这种方法比对所有用户操作使用单行更好,因为您可以轻松地按日期排序记录,还可以选择要查询的操作类型。使用单行,您必须在按操作类型或按日期排序记录之间进行选择
此外,这比为每个操作事件创建一行更好(IMO),因为您需要创建二级索引来正确查询数据。您最终需要对操作信息进行分页
此外,您还希望能够对按事件日期排序的数据进行分页,并筛选用户希望看到的操作类型。我建议如下:
- 每个动作类型一行
- 键是userId+actionType
- 列名为[dateinteger+EventId]
- 列值是序列化为单个字符串的事件对象
您可以使用与用户选择的操作相对应的userId+actionType列表来查询数据。并对列名进行切片以对结果分页,或按日期范围进行筛选
我认为这种方法比对所有用户操作使用单行更好,因为您可以轻松地按日期排序记录,还可以选择要查询的操作类型。使用单行,您必须在按操作类型或按日期排序记录之间进行选择
此外,这比为每个操作事件创建一行更好(IMO),因为您需要创建二级索引来正确查询数据。您可以按名称范围(即:BA…到BZ…)查询列并获得行切片。此外,您可以在一个请求中获得多个键。@1但这不是一回事吗?我的意思是,我仍然需要为每个人做20片action@lstern哦,我的天,你是对的,我怎么可能忘记多把钥匙。。。但我仍然不太了解他们,我的意思是我知道这会更快,但多少?这真的是正确的方法吗?您可能想知道,您可能需要对数据进行分页(20个最新的喜好,等等)。您可以按名称范围(即:BA…到BZ…)查询列,并获得行切片。此外,您可以在一个请求中获得多个键。@1但这不是一回事吗?我的意思是,我仍然需要为每个人做20片action@lstern哦,我的天,你是对的,我怎么可能忘记多把钥匙。。。但我仍然不太了解他们,我的意思是我知道这会更快,但多少?这真的是正确的方法吗?你可能会想,你可能需要分页数据(20个最新的喜欢,等等)是的,我认为这是正确的方法,正如我刚才在聊天中提到的,为分页制作正确的列切片有点困难,但是我想我可以从这里找到答案:)是的,我认为这是正确的方法,正如我刚才在聊天中提到的,要为分页制作正确的列片段有点困难,但我想我可以从这里找到答案:)