假设一个拥有数百万用户的社交应用程序&有大约200-300个主题,用户可以发布可以标记最多5个主题的帖子。我对这些数据有两种查询:
对于第一个查询,我可以使用User Columnfamily中的superColumns轻松创建模式(在此超级列中,我可以将用户的所有帖子的postIds存储为列)。
我的问题是如何设计架构以在Cassandra中提供第二个查询?
答案 0 :(得分:3)
虽然Justice的答案可行,但我不喜欢它,因为它需要OrderPreservingPartitioner来执行范围扫描。 OPP有很多与之相关的问题。有关详细信息,请参阅我一直linking to constantly的文章。
相反,我建议这样做:
topic|YYMMDDHH: {TimeUUID: postID, TimeUUID: postID, etc... }
其中“topic | YYMMDDHH”是行键,每列名称是TimeUUID,列值是postID。
要获取任何主题的最新帖子,您可以从该主题的最新行的末尾获得一个切片。如果该行没有足够的列,则可以及时转到上一行,等等。
这有一些不错的属性。首先,如果你不关心一个主题的真正老帖子,只关心相对较新的帖子,你可以定期清除旧行,节省一些空间;这甚至可以通过列TTL完成,这样您就不必再做任何额外的工作了。其次,您的行的大小将受到限制,因为它们每小时都会被拆分。第三,你不需要OPP:)
这样做的一个缺点是,如果有一个非常热门的话题,一个节点一次可能会获得比其他节点更高的流量。
答案 1 :(得分:1)
对于第二个查询,构建一个二级索引列系列,其键为#{topic}:#{unix_timestamp}
。行将具有带有帖子ID的单个列。然后,您可以进行范围扫描。