12

我正在制作一个类似于 digg 的网站,该网站将有一个不同类别的主页。我想显示最受欢迎的提交。

我们的评分系统只是“喜欢”,例如“我喜欢这个”等等。我们基本上希望显示每次“喜欢”数量最多的提交。我们希望有三个类别:历史流行度、上周和最后一天。

有人知道帮助的方法吗?我不知道如何去做这件事并提高效率。我认为我们可以使用某种 cron-job 每 10 分钟运行一次,并在最后 10 分钟内获取喜欢的次数……但有人告诉我这样做效率很低?

帮助?

谢谢!

4

5 回答 5

9

通常 Digg 和类似 Reddit 的网站会根据提交日期而不是投票时间。这样,只需要一个简单的 SQL 查询就可以找到 X 时间段内最热门的提交。这是一个伪查询,使用此方法查找过去 24 小时内最受欢迎的 10 个链接:

select * from submissions
 where (current_time - post_time) < 86400
 order by score desc limit 10

基本上,此查询表示查找从现在到发布时间之间的秒数小于 86400(UNIX 时间为 24 小时)的所有提交。

如果您真的想在 X 时间间隔内测量受欢迎程度,则需要将每次投票的帖子和时间存储在另一个表中:

create table votes (
 post foreign key references submissions(id),
 time datetime,
 vote integer); -- +1 for upvote, -1 for downvote

然后,您可以生成 X 和 Y 时间之间最受欢迎的帖子列表,如下所示:

select sum(vote), post from votes
 where X < time and time < Y
 group by post
 order by sum(vote) desc limit 10;

从这里开始,您只需一跳、跳过和内部连接,就可以将帖子数据绑定到返回的 id。

于 2009-06-22T04:27:42.530 回答
3

你有一个像样的数据库设置吗?我们可以听听您的CREATE TABLE详细信息和指数吗?假设设置合理,数据库应该能够足够快地提取您需要的计数以满足您的需求!例如(索引和键的净值,这在一定程度上取决于您使用的数据库引擎),给定两个表:

CREATE TABLE submissions (subid INT, when DATETIME, etc etc)
CREATE TABLE likes (subid INT, when DATETIME, etc etc)

您可以获得前 33 名的历史热门投稿

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

而那些在一定时间范围内被投票的人

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
WHERE likes.when BETWEEN initial_time AND final_time
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

如果您将“投票”(正面或负面)存储在 中likes,而不是将那里的每个条目计算为+1,您可以简单地使用SUM(likes.vote)而不是COUNTs。

于 2009-06-22T04:34:43.517 回答
0

Queries where the order is some function of the current time can become real performance problems. Things get much simpler if you can bucket by calendar time and update scores for each bucket as people vote.

于 2009-06-22T22:12:13.960 回答
0

对于像 alltime 这样的稳定​​列表,上周,因为它们不应该改变得很快,所以我认为你应该将列表保存在缓存中,到期时间约为 1 天或更长时间。

如果您关心实时正确计数,您可以通过比较缓存中最低页面的页面来检查每个页面视图。

您需要做的就是注意缓存和实际数据库之间的同步。

唐恩

于 2009-06-22T04:41:14.860 回答
-1

为了完成nobody_的回答,我建议您阅读文档(当然,如果您使用的是 MySQL)。

于 2009-06-22T04:31:19.160 回答