数据库设计每小时,每周,排名?

时间:2011-10-20 03:28:45

标签: mysql ranking

我一直在试图找到一种处理这种排名系统的好方法。作为一个粗略的例子,我想查询一个facebook页面并抓住每个帖子的喜欢和评论。然后,基于时间间隔将有三个排名。举一个简化的例子:

Hourly
- I pull all the posts updated within the last hour, and compare the # of likes/comments compared to my previous entry (the last pull being an hour prior).

Daily
- I pull down all posts within a 24 hours date range.  I compare the # of likes/comments compared to the previous entry. "Post X had 12 more likes and 40 more comments today compared to yesterday"

Weekly
- I pull down all posts within a week's range and do the same as above.  "Post X had no new likes, but 10 more comments added this week compared to last week"

就数据库表而言,处理这个问题的好方法是什么?有一个巨大的表与帖子(标题,comments_previous,comments_current,likes_previous,likes_current等)是否有意义?

谢谢!

2 个答案:

答案 0 :(得分:1)

列:( PK)时间戳,(索引)pageid,count。对于喜欢的页面,每小时设置一个新的时间戳。时间戳是PK,因此您不会从数据库中的聚簇索引/页面布局中获得可怕的碎片。

如果您觉得出于性能原因需要进行反规范化,则可以制作额外的每日和每月汇总表。可能,通过使用time / pageid组合的where子句,您将能够在没有汇总表的情况下高效地生成所需内容,从而只需一个表即可为您提供所需的内容。

根据需要清除旧数据,或保留旧数据。


澄清

当评论收到类似内容时,请执行以下操作:

insert into likeRanking (concat(select left(now(),13), '00:00'), commentid, 1)
    on duplicate key update score = score + 1;

答案 1 :(得分:-1)

我会这样做:

创建一个现在可以获得时间的表格,立即评论,现在就喜欢。

然后在一小时的时间之后,创建另一个现在获得时间的表,立即评论并现在喜欢,然后将其减去先前创建的表。然后删除另一个表并插入新表的新值。然后一小时后,创建另一个表。

与月度和年度相同。

如果您还有其他需要,请告诉我。