Sql 如何实施自定义评级系统(具有递减日期相关性)
我在一个类似digg的网站上工作,用户可以提交“故事” 我会记录每个项目的“投票”和“类似添加”数量。相似添加定义为两个用户添加相同的“链接” 以下是算法的一部分(本质上是最重要的): 因此,基本上计算一天“类似添加”的数量,然后除以内容发布后的秒数。在过去10天内这样做(例如) 但是,我不确定如何实现这一点,以使其性能良好。我能想到的每一种方法都会很慢 我能想到的实现这一点的唯一方法是计算过去10天内提交的每个项目的添加数量,这将花费永远的时间。(因此,在过去10天内,一个带有GROUPBY date的sql命令执行了10次——显然,这种方法很糟糕) 即使我保留一个每天更新一次的表(并在后台运行上述sql),一旦数据库变大,速度仍然会慢得可笑。此外,由于它不是直播的,因此评级将“过时”(例如,突发新闻“项目”永远不会达到顶部)Sql 如何实施自定义评级系统(具有递减日期相关性),sql,linq,algorithm,Sql,Linq,Algorithm,我在一个类似digg的网站上工作,用户可以提交“故事” 我会记录每个项目的“投票”和“类似添加”数量。相似添加定义为两个用户添加相同的“链接” 以下是算法的一部分(本质上是最重要的): 因此,基本上计算一天“类似添加”的数量,然后除以内容发布后的秒数。在过去10天内这样做(例如) 但是,我不确定如何实现这一点,以使其性能良好。我能想到的每一种方法都会很慢 我能想到的实现这一点的唯一方法是计算过去10天内提交的每个项目的添加数量,这将花费永远的时间。(因此,在过去10天内,一个带有GROUPBY
有没有人有过这样做的经验?不需要执行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?试试这个方法:每个人都有一张选票。你的投票坚持你最后投票支持的东西。时间取决于用户行为。你可以做一个对数加权平均。这样做的好处是,您只需要存储“当前值”和加权平均值。在您的情况下,“当前值”可以是当天的投票数,您可以每晚重新计算加权平均数
const float WeightFactor = 0.70; //for example
float PreviousAverage = GetPreviousAverage();
float CurrentValue = GetVoteCountToday();
float NewAverage = (WeightFactor * CurrentValue) + ( (1-WeightFactor) * PreviousAverage);
只有当您有一个以设定频率出现的新值时,这才真正起作用。如果你想在任意时间重新计算你的选票,那么这是行不通的。你说的是“秒后”,但我在你的公式中看不到这一点。是添加类似的添加后的秒数还是链接原始文章后的秒数?@Tom H:添加原始文章后的秒数。你是对的,我忘了我可以在一句话中这样做。但这仍然是缓慢的。我想知道使用复杂算法的站点如何处理这些问题。这是一个有趣的想法。你也可以扩展一下。也许给人们10张选票,当他们把票都用光了,他们最老的一张会转到他们投票的最新“故事”中。这将完成同样的“选票”计算任务,但不会优先考虑最近提交的作品。
const float WeightFactor = 0.70; //for example
float PreviousAverage = GetPreviousAverage();
float CurrentValue = GetVoteCountToday();
float NewAverage = (WeightFactor * CurrentValue) + ( (1-WeightFactor) * PreviousAverage);