我正在开发类似于digg的网站,用户可以提交“故事”。
我记录每件物品有多少“投票”和“类似添加”。类似的添加被定义为两个用户添加相同的“链接”。
这是算法的部分(基本上是最重要的):
y = day number
sy = number of adds on day y
∑ y[1:10] sy / y
因此,基本上计算指定日期的“类似添加”的数量,并除以自发布内容以来的秒数。过去10天这样做(例如)。
但是,我不确定如何实现这一点,以便它表现良好。我能想到的每一种方法都会很慢。
我能想到实现这一目标的唯一方法是计算过去10天内每个提交项目将永远需要的添加数量。 (所以sql命令在过去的10天里按日期执行了10次 - 显然这种方法很糟糕。)
即使我保留一个每天更新一次的表(并在后台运行上面的sql),一旦数据库变大,这仍然会非常慢。此外,评级将“过时”,因为它不是现场(例如突发新闻“项目”永远不会到达顶部)。
有没有人有过如何做到这一点的经验?
答案 0 :(得分:2)
试试这个:每个人都有一票。你的投票坚持你投票的最后一件事。时间会来自用户行为。
答案 1 :(得分:1)
你可以做一个对数加权平均值。这样做的好处是你只需要存储“当前值”和加权平均值。在您的情况下,“当前值”可以是当天的投票数,您可以每晚重新计算加权平均值。
const float WeightFactor = 0.70; //for example
float PreviousAverage = GetPreviousAverage();
float CurrentValue = GetVoteCountToday();
float NewAverage = (WeightFactor * CurrentValue) + ( (1-WeightFactor) * PreviousAverage);
只有在设定频率下出现新值时才能正常工作。如果你想在arbritary时间重新计算你的投票,那么这将不起作用。
答案 2 :(得分:0)
没有必要执行SQL 10次来获得结果,你可以在一次执行中得到它,如:
select sum(dayval)
from
( select count(*) / (current_date-day+1) dayval
from votes
where story_id = 123
and day >= current_date - 9
group by (current_date-day+1)
)
(实际代码根据使用的DBMS而有所不同)。
我并不是说这会表现不错!
也许是妥协:在每日批处理过程中计算并存储“每日开始”值,但是在当天收到的每次投票中为存储值加1?