1

我需要知道使用非规范化表与使用两个单独的表并使用连接访问数据的权衡是什么。我正在使用实体框架 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 - 加入OrderCategoryDetailson OrderCategoryDetails.ID

表:OrderCategoryDe​​tails

  • ID(首要的关键)
  • 订单类别
  • 订单子类别

表:订单项

  • OrderItem ID(首要的关键)
  • 订单 ID(FK - 加入Order

使用的数据库:SQL Server 2008 R2

4

1 回答 1

5

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

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

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

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

于 2012-05-29T11:52:28.263 回答