【问题标题】:Storing the value in a table column vs Calculating the value from navigation property将值存储在表列中与从导航属性计算值
【发布时间】:2014-10-29 08:26:12
【问题描述】:

我需要有关使用 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; }
}

【问题讨论】:

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


    【解决方案1】:

    我会说,如果它像亚马逊这样巨大,您可以预先存储计算值。 这将有助于在获取 . 时提高性能。您还可以将更新平均值的任务委托给某种后台进程。

    【讨论】:

      【解决方案2】:

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

      1. 我需要经常更新它
      2. 我不会在性能方面节省太多

      如果您使用 Entity Framework 上下文进行查询,并且您请求评论属性的平均值,则不会获取评论。 Entity Framework 将生成一个返回平均值的 SQL 选择语句。

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2014-01-01
        • 2015-04-23
        • 2017-05-04
        • 1970-01-01
        • 2012-12-01
        相关资源
        最近更新 更多