Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何实施自定义评级系统(具有递减日期相关性)_Sql_Linq_Algorithm - Fatal编程技术网

Sql 如何实施自定义评级系统(具有递减日期相关性)

Sql 如何实施自定义评级系统(具有递减日期相关性),sql,linq,algorithm,Sql,Linq,Algorithm,我在一个类似digg的网站上工作,用户可以提交“故事” 我会记录每个项目的“投票”和“类似添加”数量。相似添加定义为两个用户添加相同的“链接” 以下是算法的一部分(本质上是最重要的): 因此,基本上计算一天“类似添加”的数量,然后除以内容发布后的秒数。在过去10天内这样做(例如) 但是,我不确定如何实现这一点,以使其性能良好。我能想到的每一种方法都会很慢 我能想到的实现这一点的唯一方法是计算过去10天内提交的每个项目的添加数量,这将花费永远的时间。(因此,在过去10天内,一个带有GROUPBY

我在一个类似digg的网站上工作,用户可以提交“故事”

我会记录每个项目的“投票”和“类似添加”数量。相似添加定义为两个用户添加相同的“链接”

以下是算法的一部分(本质上是最重要的):

因此,基本上计算一天“类似添加”的数量,然后除以内容发布后的秒数。在过去10天内这样做(例如)

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

我能想到的实现这一点的唯一方法是计算过去10天内提交的每个项目的添加数量,这将花费永远的时间。(因此,在过去10天内,一个带有GROUPBY date的sql命令执行了10次——显然,这种方法很糟糕)

即使我保留一个每天更新一次的表(并在后台运行上述sql),一旦数据库变大,速度仍然会慢得可笑。此外,由于它不是直播的,因此评级将“过时”(例如,突发新闻“项目”永远不会达到顶部)


有没有人有过这样做的经验?

不需要执行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);