2014-11-24 100 views
0

我正在实施asp.net中的评分系统。我有一张评分表。评分表的结构简单,使用旧的AverageRating和新值计算新的平均值

表姓名:评分

Id  ProductId  RatingValue 
1   1    3.5 
2   1    3.0 
3   1    2.5 
4   2    4.0 

,而现在从我使用内置的AVG函数SQL表中选择数据,

ISNULL(AVG([Rating].[RatingValue]), 0) 

这做工精细。现在,当用户对数据库中的同一产品再次进行评级时,我必须在Sql表“评级”中插入新的评级,并且必须用新的平均评级更新标签控制。我可以在将记录保存到数据库表格后使用select语句来完成此操作,但是这会额外往返数据库。现在我有旧的AverageRating值和产品评级的次数。

我现在有两个选择。

选项1:无论是从某种程度上INSERT语句中返回新AverageValue(我可以选择标识列,但不知道我是否可以选择列的平均与否)选项2

:使用旧AverageRating和应用程序中的CountRated值。我可以使用这些值的新评估值来计算运行时的新值。

哪个选项最好,以及如何实现它们?

回答

1

如果CountRated是时代的产物额定数量,RatingValue新的前值:

AverageRating = (AverageRating * CountRated + RatingValue)/(CountRated + 1); 

它可以比从所有数据重新计算平均水平,但它可能与很多不太准确数据。

+0

谢谢@Xaruth。它解决了我的问题。我必须首先检查评级是否是第一次,然后在标签中显示原始的RatingValue,否则我使用您的公式。因为如果评级是第一次,那么CountRated和AverageRating的值就是0. – 2014-11-24 14:25:16

+0

我认为你不需要,因为第一次会是:'(0 * 0 + RatingValue)/(0 + 1)'。所以第一次,AverageRating = RatingValue。 – Xaruth 2014-11-24 14:29:14

+0

是的,你是绝对正确的。实际上,在此之前我为了不同的目的递增了RatingValue。 RatingCount ++ – 2014-11-24 14:35:11