【问题标题】:De-normalize table or use Joins in Entity Framework反规范化表或在实体框架中使用联接
【发布时间】:2012-06-03 13:54:13
【问题描述】:

我需要知道使用非规范化表与使用两个单独的表并使用连接访问数据的权衡是什么。我正在使用实体框架 4。

就我而言,我有两个表 OrderOrderCategoryDetails。 我在想是否将这两个表合并为一个表更好?

  • 如果非规范化,添加的列(OrderCategoryOrderSubcategory 将是稀疏的(可能 100% 为空。至少 50% 为空)
  • 另一方面,如果我保持原样,我担心会频繁执行连接操作(即,每当我查询特定的Order 时,我也需要来自OrderCategoryDetails 的信息。李>

目前,我已经规范化表格并使用导航属性:

  • 从 OrderItem 实例访问订单类别信息

    OrderItem orderItem = _context.OrderItems.Where(...).FirstOrDefault();
    if(2 == orderItem.SalesOrder.Category.OrderCategory){ ...}
    
  • 从 Order 实例访问 Order Category 信息

    Order order = _context.Orders.Where(...).FirstOrDefault();
    if(2 == order.Category.OrderCategory){ ...}
    

这是我的架构:

表格:顺序

  • ID(主键)
  • 日期
  • 金额
  • 项目计数
  • OrderCategoryInfo(FK - 加入 OrderCategoryDetails OrderCategoryDetails.ID

表格:OrderCategoryDe​​tails

  • ID(主键)
  • 订单类别
  • OrderSubCategory

表格:订单项

  • OrderItem ID(主键)
  • 订单 ID(FK - 加入 Order

使用的数据库:SQL Server 2008 R2

【问题讨论】:

  • "我担心频繁的加入操作" . . .这是否意味着您尚未构建表格、加载示例数据并对其进行测试?
  • 我测试过,经常有join操作。我对此感到担忧,但我不确定非规范化是否是一个更好的主意。
  • 问自己一个问题,是否每个订单都需要 OrderCategoryDe​​tail?如果答案是肯定的,那么您最好对数据进行反规范化。如果答案是否定的,则最好将其保留为单独的表格。
  • 只要您在表之间设置了外键关联,您就不必担心执行连接对性能的影响。它只会在病理情况下成为问题。
  • @DoctaJonez:换句话说,在这种情况下,规范化和频繁连接更可取? (50% 的订单没有 OrderCategory 详细信息)/

标签: c# sql-server entity-framework database-design database-normalization


【解决方案1】:

我的一般建议是问自己以下问题;第一个表中的每一行都需要第二个表中的一行吗?如果答案是,那么您可能最好对数据进行反规范化。如果答案是,您最好将其保留为单独的表格。

只要您在两个表之间设置了外键关联,您就不必担心执行连接对性能的影响。它只会在病态的情况下成为问题。

根据您在 cmets 线程中的回答,我建议您将表分开并在两者之间建立外键关系。

如果您确实遇到任何性能问题,请在有问题的 SQL 上运行分析器并添加分析器推荐的任何索引,但仅对经常使用的查询执行此操作。索引非常适合加快查询速度,但会以插入性能为代价,因此请小心使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多