4

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

问题:

  1. 有一个带有两个外键的表并且其中一个总是为空是一种好习惯吗?
  2. 处理这种情况的最佳策略是什么。

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

4

4 回答 4

1

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

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

于 2013-01-17T04:42:52.070 回答
0

一种选择是有两个中间表,将表的 PK 链接DeliveryMethodDoctorsSurgeryCenter表,例如,DoctorDeliveryMethod有两个列:Doctor.idDeliveryMethod.id

但是,这需要您连接三个表以获取每个表的方法。另一种是将 链接DeliveryMethod.id到表中的列Doctor,调用它DeliveryMethodID。无论哪种方式,您都必须进行簿记

于 2013-01-17T04:41:29.023 回答
0

一种可能的替代设计是:

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

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

于 2013-01-17T04:43:18.787 回答
0

您的关系是从交付方式到医生/中心,而不是从医生/中心到交付方式。

如果您颠倒这种关系,您不仅可以消除使用可能未设置列的表的需要,还可以在多个 drs 和中心之间共享交付方法。您说存在 1 对 1 关系,但如果没有业务规则阻止 dr 或 center 使用与任何其他 dr 或 cent 相同的交付方式,那么您所拥有的实际上是多对 1 关系(许多博士/中心可以采用相同的交付方法),即使在实践中它是独一无二的。

于 2013-01-17T05:57:53.043 回答