2013-03-28 60 views
1

我很喜欢在T-SQL中编写代码,但是对于db设计来说是新的。我有是否有可能对列有两个外键

  1. 一个部门表PK_Department
  2. 的LOINC代码/与PK_Loinc
  3. 非LOINC代码/与PK_nonLoinc测试信息一(不同结构)表测试信息表。

我想设置之间(PK_Department)一比一的关系< -

>(PK_Loinc OR PK_nonLoinc)有没有一种方法来设置使用两个FK在T-SQL这种关系?

如果不是这样,我想我可以设置有三列,PK_union, PK_Loinc and FK_nonLoinc -- where (FK_Loinc is filled ExclusiveOR FK_nonLoinc is filled)然后建立一个表链接FK_UNIONFK_Department但最好我能做到这一点,而无需创建其它表的表LoincAndNonLoincCodes。

+0

我可能是错的,但据我所知答案是否定的,你不能有一列的两个FKs。额外表格的另一种替代方法可能是一个额外的列。在部门表中,放入FK_Loinc和FK_nonLoinc,只填充一个或另一个。这取决于数据库规则的严格程度(您可以添加触发器来防止被填充,但这是一个很大的努力)。 – EvilBob22

+0

你似乎删除了你原来的问题?如果我理解正确,对于Loinc,您只需要'{LoincID}'作为密钥,而对于本地而言,您需要'{LocalID,Verbose}'作为密钥? –

+0

@DamirSudarevic,这是正确的。尽管我没有删除“原始”文章。你什么意思? – bernie2436

回答

2

我认为你试图将每个部门与给定的观察(即LOINC中的'O')联系起来。

问题不在于Department对象,而在于'Observation'对象。观察是一个类型层次结构。抽象观测可以是具体的非LOINC观测或具体的LOINC观测。关系模型不擅长建模类型层次结构。观测建模有3个选项:

  1. 使用一个观测表,其中包含LOINC和非LOINC代码。在这种情况下,PK将是类型和代码属性的组合键,并包含LOINC和非LOINC代码的所有属性。然后你可以有一个1:1的FK到这个观察表。

  2. 用于非LOINC代码的一个表和用于LOINC代码的一个表。在这种情况下,您遇到了问题,正如您在问题中所述。

  3. 三张桌子。一个用于观测,一个用于非LOINC观测,另一个用于LOINC观测。然后在观察台上有1:1的FK。

这是对象/关系阻抗不匹配问题的经典示例。

+0

我会选择编号3.创建一个父表Loinc和nonLoinc表。此表不需要除PK之外的任何其他列,但是您也可以放置一个标志列来告诉您任何行是Loinc/nonLoinc。因此,现在Loinc和NonLoinc都应该将新表从它们的PK引用到新表的PK,并且Department表可以很容易地将FK引用到新的父表(并因此引用两个子表)。 –

相关问题