我正在asp.net中实施评级系统。我有一张评级表。评级表的结构很简单,
表名:评级
Id ProductId RatingValue
1 1 3.5
2 1 3.0
3 1 2.5
4 2 4.0
现在,当从sql表中选择数据时,我使用内置的AVG函数,
ISNULL(AVG([Rating].[RatingValue]), 0)
这项工作很好。现在,当用户在数据库中再次对同一产品进行评级时,我必须在Sql表“Rating”中插入新的评级,并且必须使用新的平均评级更新标签控件。我可以通过在数据库表中保存记录后使用select语句来执行此操作,但这将是对数据库的额外往返。现在我有Old AverageRating值和产品评级的次数。
我现在有两个选择。
选项1:以某种方式从Insert语句中返回新的AverageValue(我可以选择标识列但不知道我是否可以选择列的平均值)
选项2:在应用程序中使用旧的AverageRating和CountRated值。我可以使用这些值的新值来计算运行时的新值。
哪种选择最好,如何实现?
答案 0 :(得分:1)
如果CountRated
是产品评分的次数,则在RatingValue
的新值之前:
AverageRating = (AverageRating * CountRated + RatingValue) / (CountRated + 1);
它可能比重新计算所有数据的平均值更快,但对于大量数据而言可能不太准确。