非规范化表或使用实体框架中的联接

本文关键字:框架 实体 规范化 非规范 | 更新日期: 2023-09-27 18:35:40

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

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

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

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

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

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

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

这是我的架构:

表 : 订单

  • ID(主键)
  • 日期
  • 项目计数
  • OrderCategoryInfo (FK - 与OrderCategoryDetails一起加入OrderCategoryDetails.ID

表 : 订单类别详情

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

表 : 订单项

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

使用的数据库:SQL Server 2008 R2

非规范化表或使用实体框架中的联接

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

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

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

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