SQL表规范化与非规范化

时间:2013-01-17 04:26:39

标签: sql sql-server indexing foreign-key-relationship

我正在使用 MS SQL Server 2012 。我有两张桌子,一张用于医生,另一张用于手术中心。每个表目前都包含描述他们(医生和手术中心)应如何接收报告(电子邮件,传真......)的列。在两个表中保存此数据的列是相同的。我正在考虑从每个表中提取交付方法列并制作一个通用的交付方法表,但我需要在每行中为医生和手术中心提供外键。这很麻烦,因为在递送方法和医生之间存在一对一的关系。这种相同的关系退出手术中心表。

问题:

  1. 拥有一个包含两个外键的表并且其中一个永远是null的是一个好习惯吗?
  2. 处理此类案件的最佳策略是什么。
  3. 我想从医生和手术中心表中提取传递方法信息的原因是为了减少表格的整体大小。这也将更好地规范化我的数据。我感谢任何帮助和指导。

4 个答案:

答案 0 :(得分:1)

一个想法是拥有一个DeliveryMethod表。该表中的每条记录都有一个ID(可能是代理 - 例如身份或序列)。然后,Doctor表将具有DeliveryMethodID外键,同样SurgeryCenter表将具有DeliveryMethodID外键。

在典型的数据库设计中,您不需要两个相同的表。如果表格大小成为问题,有多种方法可以解决这个问题,包括将其设为partitioned table

答案 1 :(得分:0)

一个选项是有两个中间表将DeliveryMethod表的PK链接到DoctorsSurgeryCenter表,例如,DoctorDeliveryMethod有两列:Doctor.idDeliveryMethod.id

这要求您加入三个表来获取每个表的方法。另一种方法是将DeliveryMethod.idDoctor表格中的列相关联,将其称为DeliveryMethodID。你必须以任何方式进行簿记

答案 2 :(得分:0)

可能的替代设计是:

  • 表'DeliveryMethods':列ID(PK),Fax_number,Email_Address,Preferred,...
  • 表'SurgeryCentres':列SC_ID(PK),名称,...,DeliveryMethodID(FK引用DeliveryMethods),...
  • 表'医生':列MD_ID(PK),名称,...,DeliveryMethodID(FK引用DeliveryMethods),...

这可以避免空值,但会为您提供标准化数据。

答案 3 :(得分:0)

你有从交付方式到dr / centre的关系,而不是从dr / center到交付方法。

如果您颠倒了这种关系,您不仅无需使用具有潜在无法列的表,还可以在多个drs和中心之间共享交付方法。你说有一对一的关系,但是如果没有一个商业规则防止博士或中心采用与其他博士或分相同的交付方式,那么你所拥有的实际上是多对一的关系(许多博士/中心可以采用相同的交付方式)即使在实践中它是独一无二的。