是否可以为列提供两个外键

时间:2013-03-28 18:08:17

标签: sql sql-server tsql database-design

我很熟悉T-SQL编码,但对db设计不熟悉。我有

  1. PK_Department的部门表
  2. 使用PK_Loinc
  3. 的loinc代码/测试信息表
  4. 一个(结构不同的)非loinc代码表/ PK_nonLoinc的测试信息。
  5. 我想在(PK_Department)< - >之间建立一对一的关系。 (PK_Loinc OR PK_nonLoinc)

    有没有办法在T-SQL中使用两个FK设置这种关系?

    如果没有,我想我可以设置一个表格LoincAndNonLoincCodes,其中包含三列PK_union, PK_Loinc and FK_nonLoinc -- where (FK_Loinc is filled ExclusiveOR FK_nonLoinc is filled),然后设置一个表格FK_UNIONFK_Department,但理想情况下我可以不用创建另一个表。

1 个答案:

答案 0 :(得分:2)

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

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

  1. 使用一个包含LOINC和非LOINC代码的观察表。在这种情况下,PK将是Type和Code属性的复合键,并包含LOINC和非LOINC代码的所有属性。然后你可以在这个观察台上获得1:1的FK。

  2. 一个表用于非LOINC代码,一个表用于LOINC代码。在这种情况下,您遇到的问题就像您在问题中所说的那样。

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

  4. 这是对象/关系阻抗不匹配问题的经典说明。