如何实施自定义评级系统(日期相关性下降)

时间:2008-12-15 13:35:19

标签: sql linq algorithm

我正在开发类似于digg的网站,用户可以提交“故事”。

我记录每件物品有多少“投票”和“类似添加”。类似的添加被定义为两个用户添加相同的“链接”。

这是算法的部分(基本上是最重要的):

y = day number 
sy = number of adds on day y

∑ y[1:10]  sy / y

因此,基本上计算指定日期的“类似添加”的数量,并除以自发布内容以来的秒数。过去10天这样做(例如)。

但是,我不确定如何实现这一点,以便它表现良好。我能想到的每一种方法都会很慢。

我能想到实现这一目标的唯一方法是计算过去10天内每个提交项目将永远需要的添加数量。 (所以sql命令在过去的10天里按日期执行了10次 - 显然这种方法很糟糕。)

即使我保留一个每天更新一次的表(并在后台运行上面的sql),一旦数据库变大,这仍然会非常慢。此外,评级将“过时”,因为它不是现场(例如突发新闻“项目”永远不会到达顶部)。

有没有人有过如何做到这一点的经验?

3 个答案:

答案 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?