2013-01-17 208 views
4

我正在使用MS SQL Server 2012。我有两张桌子,一张给医生,另一张给手术中心。每张表格当前都包含描述他们(医生和手术中心)应该如何接收报告(电子邮件,传真......)的列。两张表格中保存这些数据的列是相同的。我正在考虑从每张表格中提取交付方式列,并制作一个通用的交付方式表,但我需要在每行中为医生和外科中心设置外键。这很麻烦,因为分娩方法和医生之间存在一对一的关系。手术中心表的这一关系也是存在的。SQL表规范化与非规范化

问:

  1. 它是很好的做法,有两个外键,其中一个表总是为空?
  2. 什么是处理这种情况的最佳策略。

我想从医生和手术中心表中提取传递方法信息的原因是为了减小表格的整体大小。这也将更好地规范我的数据。我感谢任何和所有的帮助和指导。

回答

0

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

如果反转关系,您不仅可以免除使用可能未使用列的表格的需求,还可以在多个drs和中心之间共享传送方法。你说有一对一的关系,但如果没有一个业务规则阻止博士或中心使用与其他博士或博士同样的传递方法,那么你所拥有的实际上是多对一的关系(许多博士/中心可以有相同的交付方式),即使在实践中它是独一无二的。

0

一种选择是具有DeliveryMethod表的PKs的链接到DoctorsSurgeryCenter表两个中间表,以使得,例如,DoctorDeliveryMethod有两列:Doctor.idDeliveryMethod.id

虽然这需要您连接三个表以获取每个方法。另一种方法是将DeliveryMethod.id链接到Doctor表中的一列,将其称为DeliveryMethodID。你必须做任何一种方式的簿记

1

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

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

0

一种可能的替代设计是:

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

这避免了空值,但给你规范化的数据。