关于cassandra的时间序列数据的新闻提要

时间:2016-04-22 19:06:28

标签: cassandra time-series data-modeling nosql

我正在制作一个网站,我希望将所有用户的帖子存储在一个表中,并按发布时间排序。我做的cassandra数据模型就是这个

CREATE TABLE Posts(
   ID uuid,
   title text,
   insertedTime timestamp,
   postHour int,
   contentURL text,
   userID text,
   PRIMARY KEY (postHour, insertedTime)
) WITH CLUSTERING ORDER BY (insertedTime DESC);

我面临的问题是,当用户访问帖子页面时,它会通过查询来获取最新的帖子

SELECT * FROM Posts WHERE postHour = ?;

? =当前时间

到目前为止,当用户向下滚动ajax时,请求从服务器获取更多帖子。 Javascript跟踪lastFetched项目的postHour,并在请求新帖子时将其与cassandra PagingState一起发送回服务器。

但是当用户向下滚动时,此方法将查询多个分区。 我想知道这个模型是否能顺利运行,是否还有其他模型可以遵循。

有人请指出我正确的方向。 谢谢。

1 个答案:

答案 0 :(得分:2)

这是一个好的开始,但有一些指示:

  1. 您可能需要的不仅仅是postHour作为分区键。我猜你不想把所有帖子存储在一起,然后翻阅它们。你在这之后可能是:

    PRIMARY KEY ((postYear, postMonth, postDay, postHour), insertedTime)
    
  2. 但仍然存在问题。您的PRIMARY KEY必须唯一标识一行(在本例中为帖子)。我猜这两个用户可能会发布具有相同insertedTime值的帖子,尽管不太可能。您真正需要的是添加ID以确保它们是唯一的:

    PRIMARY KEY ((postYear, postMonth, postDay, postHour), insertedTime, ID)
    
  3. 此时,我考虑将您的IDinsertedTime列合并到ID类型的timeuuid列中。通过这些更改,您的最终表格如下:

    CREATE TABLE Posts(
      ID timeuuid,
      postYear int,
      postMonth int,
      postDay int,
      postHour int,
      title text,
      contentURL text,
      userID text,
      PRIMARY KEY ((postYear, postMonth, postDay, postHour), ID)
    ) WITH CLUSTERING ORDER BY (ID DESC);
    

    您使用的任何编程语言都应该有一种方法可以从插入的时间生成timeuuid,然后如果要在UI中显示,则从timeuuid值中提取该时间或者其他的东西。 (或者您可以使用CQL timeuuid functions进行转换。)

  4. 至于你关于查询多个分区的问题,是的,这样做完全没问题,但如果你不小心,你可能会遇到麻烦。例如,如果有48小时没有帖子会发生什么?您是否必须发出48个返回空结果的查询才能最终获得第49个查询? (这可能会非常缓慢,而且用户体验也很糟糕。)

    您可以采取一些措施来尝试并减轻这种情况:

    1. 使您的分区不那么精细。例如,不是按小时发帖,而是按发布帖子,或按发帖。如果您知道这些分区不会变得太大(即用户赢得了很多帖子以致分区变得太大),那么这可能是最简单的解决方案。
    2. 创建第二个表以跟踪哪些分区实际上有帖子。例如,如果您按小时坚持使用帖子,则可以创建如下表格:

      CREATE TABLE post_hours (
        postYear int,
        postMonth int,
        postDay int,
        postHour int,
        PRIMARY KEY (postYear, postMonth, postDay, postHour)
      );
      

      然后,只要用户添加新帖子,您就会插入此表格(使用Batch)。然后,您可以在查询Posts表之前查询此表 ,以确定哪些分区有帖子并且应该查询(从而避免查询一大堆空分区)。