对表进行反规范化或使用实体框架中的连接

时间:2012-05-29 10:39:38

标签: sql-server entity-framework database-design join database-normalization

我需要知道使用非规范化表与使用两个单独的表并使用连接访问数据的权衡。我正在使用Entity Framework 4。

在我的情况下,我有两个表OrderOrderCategoryDetails。 我在考虑是否将这两个表合并为一个表更好?

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

目前,我已对表格进行了规范化并使用了导航属性:

  • 从OrderItem实例

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

    访问订单类别信息
    Order order = _context.Orders.Where(...).FirstOrDefault();
    if(2 == order.Category.OrderCategory){ ...}
    

这是我的架构:

表:订单

  • ID(主键)
  • 日期
  • 金额
  • ItemCount中
  • OrderCategoryInfo(FK - 与[{1}}上的OrderCategoryDetails加入)

表:OrderCategoryDe​​tails

  • OrderCategoryDetails.ID(主键)
  • OrderCategory
  • OrderSubCategory

表:OrderItem

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

使用的数据库:SQL Server 2008 R2

1 个答案:

答案 0 :(得分:5)

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

只要在两个表之间设置外键关联,就不应该关注执行连接的性能影响。它只会成为病态情况下的一个问题。

根据您在评论主题中的答案,我建议您将表格分开并在两者之间建立外键关系。

如果您确实遇到任何性能问题,请在有问题的SQL上运行探查器并添加探查器推荐的任何索引,但只对经常使用的查询执行此操作。索引非常适合加速查询,但代价是插入性能,所以要小心它们。