如何使用父子表对连接表建模?

时间:2012-03-14 20:13:07

标签: database-design

我有一张表VisitTest,它将患者就诊(Visit表)加入到预约期间给出的诊断测试(Test表)中。 Test表是包含实际测试的表的超类(父表)。每个子表都有测试参数和结果(1)。

Test表包含元数据。 idnamedescriptionstatus等列存储在此处。子表(以OOP术语继承自Test表)并具有自己的测试特定字段。每个测试参数都是自己的列。子表具有表示测试实例的id列。例如,我们可能有10次测试,但每次测试都给出了100次,因此我们有1000个测试实例。

出于某种原因,我无法弄清楚如何建立关系模型。这就是我需要帮助的地方。

我错过了另一个联接表来使这项工作?如何将访问号码加入测试实例?鉴于访问ID,我如何找到访问期间给出的具体测试?如何建模父表和子表之间的关系?

这是我有的三张桌子。 TestABC表是一个特定的测试,还有许多其他类似的测试。访问表及其相关的所有内容(减去与测试的关联)已完成。

CREATE TABLE [dbo].[Visit](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ColumnV1] [nchar](10) NULL,
 CONSTRAINT [PK_Visit]

    CREATE TABLE [dbo].[Test](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [Name] [nvarchar](50) NULL,
        [Description] [nvarchar](50) NULL,
     CONSTRAINT [PK_Test] 

    CREATE TABLE [dbo].[TestABC](
        [Id] [int] NOT NULL,
        [Parameter1] [nvarchar](50) NULL,
        [Parameter2] [nvarchar](50) NULL,
     CONSTRAINT [PK_TestABC]

(1)我删除了之前关于在键值对和实体类型表之间进行选择的问题。由于KVP的报道建设经验不足以及我对强类型值的偏好,我选择避免冒险进入KVP道路。

1 个答案:

答案 0 :(得分:1)

如果仅仅因为访问而完成/执行/创建给定的测试,并且仅因为 访问,则将VisitId作为外键添加到Test表中,以指示父/拥有/定义Viist。

类型/子类型要复杂得多。

如果TestABC是Test的子类型,那么在TestABC中,主键应该是TestId,它也应该是表Test列TestId的外键。 [我从不在代理主键列中使用“ID” - 在编写复杂连接时,它太过于混乱。]

听起来有很多测试子类型。声音也像它们是排他性的,例如表TestABC中的数据测试也不能在表TestXYZ或任何其他子类表中包含数据。要确定它是哪种类型的测试,您必须查询每个子表以查找它是什么类型的测试。但是,这很糟糕,所以改为将TestType列添加到Test表中。可能最好也有一个查找表(TestType),使用外键确保没有任性的测试类型潜入系统。

一个微妙的问题是如何防止数据被输入到给定测试的多个子类型表中。为了保证准确性可能过于挑剔,但如果你认为安心和关系完整性值得付出代价,那么就这样做:

  • 将TestType列添加到每个子类型表
  • 为每个子类型表添加一个检查约束,以便TestType列只能 设置为该子类型的相应代码
  • 在Test表中,在{TestId,TestType}
  • 上构建主键
  • 在每个子类型表中,在{TestId,TestType}上构建一个外键,返回表Test(在两列上)
  • 如果使用该表的TestType设置“拥有”测试条目,则只能向子类型表添加一行。