1

我很喜欢用 T-SQL 编码,但对 db 设计很陌生。我有

  1. 带有 PK_Department 的部门表
  2. 带有 PK_Loinc 的 loinc 代码/测试信息表
  3. 带有 PK_nonLoinc 的非 loinc 代码/测试信息的(不同结构的)表。

我想在 (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但理想情况下我可以在不创建另一个表的情况下执行此操作。

4

1 回答 1

2

我认为您正在尝试将每个部门与给定的观察(即 LOINC 中的“O”)相关联。

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

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

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

  3. 三张桌子。一种用于观察,一种用于非 LOINC 观察,一种用于 LOINC 观察。然后对观察表进行 1:1 FK。

这是对象/关系阻抗失配问题的经典说明。

于 2013-03-28T19:07:16.813 回答