我在做一个类似Digg的网站,都将有不同类别的主页。 我想展示最流行的意见书。
我们的评级系统是简单的“喜欢”,比如“我喜欢这个”和诸如此类的东西。 我们基本上要显示每一次“喜欢”的人数最多的意见书。 我们希望有三类:空前的人气,上周,和前一天。
有谁知道的方式来帮助? 我不知道如何去这样做,使之高效。 我认为,我们可以使用某种形式的cron作业的运行,每10分钟,每最后10分钟喜欢的数量的上拉......但是我已经被告知这是非常低效?
救命?
谢谢!
我在做一个类似Digg的网站,都将有不同类别的主页。 我想展示最流行的意见书。
我们的评级系统是简单的“喜欢”,比如“我喜欢这个”和诸如此类的东西。 我们基本上要显示每一次“喜欢”的人数最多的意见书。 我们希望有三类:空前的人气,上周,和前一天。
有谁知道的方式来帮助? 我不知道如何去这样做,使之高效。 我认为,我们可以使用某种形式的cron作业的运行,每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
然后你就可以产生X和Y倍,像这样的最热门的文章列表:
select sum(vote), post from votes
where X < time and time < Y
group by post
order by sum(vote) desc limit 10;
从这里你只是一个跳,跳,并从内部获取数据后绑在返回IDS加入了。
你有一个体面的DB设置? 我们可以请听听你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)
而不是COUNT
秒。
对于像alltime稳定的名单,过去一周,因为他们不应该以非常快改变,让我觉得你应该保存在与到期时间缓存列表是大约1天或更长时间。
如果你关注度实时正确的计数,你可以通过在缓存中最低页的页比较在每个页面视图检查。
所有你需要做的就是照顾缓存和实际数据库之间的同步。
thethanghn
查询有关的命令的当前时间有些功能可以成为真正的性能问题。 事情变得更简单,如果你可以通过日历时间和更新的分数每个桶桶人们投票。
要完成nobody_的答案,我会建议你在阅读了文档 (如果使用的是当然的MySQL)。