什么可能是cassandra架构来提供此查询?

时间:2011-01-04 19:35:32

标签: database database-design schema nosql cassandra

假设一个拥有数百万用户的社交应用程序&有大约200-300个主题,用户可以发布可以标记最多5个主题的帖子。我对这些数据有两种查询:

  1. 查找特定用户的帖子
  2. 查找标记在特定主题上的所有最新帖子。
  3. 对于第一个查询,我可以使用User Columnfamily中的superColumns轻松创建模式(在此超级列中,我可以将用户的所有帖子的postIds存储为列)。

    我的问题是如何设计架构以在Cassandra中提供第二个查询?

2 个答案:

答案 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的单个列。然后,您可以进行范围扫描。