我正在制作一个类似digg的网站,主页将有不同的分类。我想展示最受欢迎的提交。
我们的评级系统仅为“喜欢”,如“我喜欢这个”之类。基本上,我们希望按时间显示获得“喜欢”数量最多的提交。我们想要三个类别:历史总人气,上周和昨天。
有人知道如何帮忙吗?我不知道如何处理并使其有效率。我认为我们可以使用某种定时任务每10分钟运行一次,并获取最近10分钟内每个提交的“喜欢”数量...但是我被告知这非常低效?
求助?
谢谢!
我正在制作一个类似digg的网站,主页将有不同的分类。我想展示最受欢迎的提交。
我们的评级系统仅为“喜欢”,如“我喜欢这个”之类。基本上,我们希望按时间显示获得“喜欢”数量最多的提交。我们想要三个类别:历史总人气,上周和昨天。
有人知道如何帮忙吗?我不知道如何处理并使其有效率。我认为我们可以使用某种定时任务每10分钟运行一次,并获取最近10分钟内每个提交的“喜欢”数量...但是我被告知这非常低效?
求助?
谢谢!
通常类似于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
select sum(vote), post from votes
where X < time and time < Y
group by post
order by sum(vote) desc limit 10;
从这里开始,你只需要一步之遥,即内部连接,就可将返回的 id 与 post 数据关联起来。
您的数据库设置良好吗?我们可以了解一下您的CREATE TABLE
详细信息和索引吗?假设设置合理,数据库应该能够快速地提取您需要的计数以满足您的需求!例如(净索引和键,这在某种程度上取决于您使用的数据库引擎),给定两个表:
CREATE TABLE submissions (subid INT, when DATETIME, etc etc)
CREATE TABLE likes (subid INT, when DATETIME, etc etc)
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)
而不是COUNT
来计算。对于像alltime、lastweek这样的稳定列表,因为它们不应该变化得非常快,所以我认为你应该将列表保存在缓存中,并设置过期时间为1天或更长。
如果你关心实时正确计数,可以通过将页面与缓存中最低页面进行比较,在每个页面视图中检查。
你需要做的就是关注缓存和实际数据库之间的同步。
thethanghn
查询中如果排序是当前时间的某个函数,可能会成为真正的性能问题。如果您可以按日历时间进行分桶,并在每个分桶中根据人们的投票更新得分,则情况会变得简单得多。