跟踪每周变化a.k.a趋势(数据库设计)

时间:2010-09-24 12:01:20

标签: mysql ruby-on-rails database-design

我有一个网站,人们可以添加自己喜欢的电视节目 我想有一些趋势统计数据。例如:

  1. (1未改变)大爆炸理论
  2. (上周第3次)我如何遇见你的母亲
  3. (上周第二)众议院
  4. (上周30日,上涨400%)Nikita
  5. 我不知道如何为此设计数据库,但这是我的想法:

    1. 每周一次,我会跑cronjob。
    2. cronjob计算每个节目的当前位置。
    3. 上周的位置被复制到另一个db-column。
    4. 从这两个值(列)中,我可以计算出更改。
    5. 这种做法好吗?你会怎么做? :)

      PS。我是一个Rails编码器,但这并不重要,除非有一些插件已经用于类似目的。

3 个答案:

答案 0 :(得分:1)

MovieVotes表跟踪每天的投票。 MovieRating表是定期(每周)快照。

Calendar表中的一行是一天。

CalendarId表格中的MovieRating指向评分期的最后一天,在本例中为WHERE DayInWeek = 7

CalendarId表格中的MovieVotes指向当天。

MovieRating您可以查看每周评分和投票。 从MovieVotes开始,您可以在任意时间内汇总投票。

alt text

答案 1 :(得分:0)

您可以向数据表中添加两个索引:

t_1,t_2

然后每周一次cronjob在t_2上复制t_1并重新计算每个t_1

我觉得它很有效,因为你只为数据表上的2个索引“付费”,但在阅读数据时你不需要任何连接。

答案 2 :(得分:0)

以Damir的模型为例。我会按照MovieID和CalID的顺序翻转...你会想要查询不同的CalendarID以获得相同的移动而不是反过来。

他的MovieVotes表已经是当天的聚合。在过去几周内总共添加7个值对于数据库来说并不是一个挑战,并且不需要将MovieRating表作为聚合。如果MovieVotes有一个日期时间列来存储每次投票的确切时间,则需要使用MovieRating作为每日聚合...每次需要显示总数时,无需浏览数千条记录。这是预先聚集的地方。

现在如果你将数据集中在MovieID的PK上,那么DateID就是黄金。要计算任何电影的任何日期范围,您的数据库将走b-tree以获取该电影ID,然后走到树的其余部分以到达您的开始日期,现在您在第一个日期的叶块上无论如何,你的所有日期都很有可能在那个区块上。所以你会知道额外的I / O总和7天,只需要更多的CPU来读取块外的行然后对值进行求和。