【发布时间】:2012-06-03 13:54:13
【问题描述】:
我需要知道使用非规范化表与使用两个单独的表并使用连接访问数据的权衡是什么。我正在使用实体框架 4。
就我而言,我有两个表 Order 和 OrderCategoryDetails。
我在想是否将这两个表合并为一个表更好?
- 如果非规范化,添加的列(
OrderCategory和OrderSubcategory将是稀疏的(可能 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 - 加入OrderCategoryDetailsOrderCategoryDetails.ID)
表格:OrderCategoryDetails
-
ID(主键) - 订单类别
- OrderSubCategory
表格:订单项
-
OrderItem ID(主键) - 订单 ID(FK - 加入
Order)
使用的数据库:SQL Server 2008 R2
【问题讨论】:
-
"我担心频繁的加入操作" . . .这是否意味着您尚未构建表格、加载示例数据并对其进行测试?
-
我测试过,经常有join操作。我对此感到担忧,但我不确定非规范化是否是一个更好的主意。
-
问自己一个问题,是否每个订单都需要 OrderCategoryDetail?如果答案是肯定的,那么您最好对数据进行反规范化。如果答案是否定的,则最好将其保留为单独的表格。
-
只要您在表之间设置了外键关联,您就不必担心执行连接对性能的影响。它只会在病理情况下成为问题。
-
@DoctaJonez:换句话说,在这种情况下,规范化和频繁连接更可取? (50% 的订单没有 OrderCategory 详细信息)/
标签: c# sql-server entity-framework database-design database-normalization