流行度算法(Popularity Algorithm)

2019-06-23 20:02发布

我在做一个类似Digg的网站,都将有不同类别的主页。 我想展示最流行的意见书。

我们的评级系统是简单的“喜欢”,比如“我喜欢这个”和诸如此类的东西。 我们基本上要显示每一次“喜欢”的人数最多的意见书。 我们希望有三类:空前的人气,上周,和前一天。

有谁知道的方式来帮助? 我不知道如何去这样做,使之高效。 我认为,我们可以使用某种形式的cron作业的运行,每10分钟,每最后10分钟喜欢的数量的上拉......但是我已经被告知这是非常低效?

救命?

谢谢!

Answer 1:

通常,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加入了。



Answer 2:

你有一个体面的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秒。



Answer 3:

对于像alltime稳定的名单,过去一周,因为他们不应该以非常快改变,让我觉得你应该保存在与到期时间缓存列表是大约1天或更长时间。

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

所有你需要做的就是照顾缓存和实际数据库之间的同步。

thethanghn



Answer 4:

查询有关的命令的当前时间有些功能可以成为真正的性能问题。 事情变得更简单,如果你可以通过日历时间和更新的分数每个桶桶人们投票。



Answer 5:

要完成nobody_的答案,我会建议你在阅读了文档 (如果使用的是当然的MySQL)。



文章来源: Popularity Algorithm