将值存储在表列中与从导航属性中计算值

时间:2014-10-29 08:26:13

标签: c# asp.net sql-server entity-framework database-design

我需要有关使用Entity Framework 6的建议。假设该网站提供了许多带有许多评论的产品(想想Amazon.com)。假设大多数访问者查看产品而不是撰写评论,那么如果我想显示每个产品的平均用户评分,我是否应该添加AverageReviewRating列来存储其值(据说)加快查询性能?

这是一种好的还是坏的做法?另一种方法是从导航属性访问每个评论并从中计算平均评级。推荐的方法是什么?

public class Product
{
    public int ProductID { get; set; }
    public string Name { get; set; }

    // Should I store the rating in a pre-calculated column or not?
    public int AverageReviewRating { get; set; }

    public virtual ICollection<Review> Reviews { get; set; }
}

2 个答案:

答案 0 :(得分:0)

我不会将平均值存储在单独的字段中,因为

  1. 我需要经常更新
  2. 我在性能方面不会节省太多。
  3. 如果使用实体框架上下文进行查询并请求平均审阅属性,则不会获取审阅。实体框架将生成一个返回平均值的SQL select语句。

    类似于:SELECT AVERAGE(ReviewScore) FROM ReviewsTable Where ReviewedProductId = ProductId

    此外,只有在遇到严重的性能问题时才应使用数据库非规范化。

答案 1 :(得分:0)

我想说如果它像亚马逊一样巨大,你可以预存储计算值。 这有助于在获取时获得更好的性能。同时,您可以将更新平均值的任务委派给某种后台进程。