Database design 如何使用父子表对联接表建模?

Database design 如何使用父子表对联接表建模?,database-design,Database Design,我有一个表,VisitTest,它将患者就诊(Visit表)与预约期间的诊断测试(Test表)连接起来。Test表是包含实际测试的表的超类(父表)。每个子表都有测试参数和结果(1) Test表包含元数据。诸如id、name、description、status等列存储在此处。子表(从Test表继承,用面向对象的术语来说)具有自己的特定于测试的字段。每个测试参数都是它自己的列。子表有一个表示测试实例的id列。例如,我们可能有10个测试,但每个测试都有100次,所以我们有1000个测试实例 出于某种

我有一个表,
VisitTest
,它将患者就诊(
Visit
表)与预约期间的诊断测试(
Test
表)连接起来。
Test
表是包含实际测试的表的超类(父表)。每个子表都有测试参数和结果(1)

Test
表包含元数据。诸如
id
name
description
status
等列存储在此处。子表(从
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的报表生成体验不太满意,而且我更喜欢强类型值。

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

类型/子类型要复杂得多

如果TestABC是Test的一个子类型,那么在TestABC中,主键应该是TestId,它也应该是表Test列TestId的外键。[我从来不会对代理主键列仅使用“ID”-在编写复杂的联接时,它会变得太混乱或太快。]

听起来好像有很多测试子类型。听起来它们也是独占的,例如,表TestABC中包含数据的测试不能同时包含表TestXYZ或任何其他子类型表中的数据。要确定它是哪种类型的测试,您必须查询每个子表以找到它是哪种类型的测试。然而,这太糟糕了,所以应该在测试表中添加一个TestType列。可能最好还有一个查找表(TestType),带有外键,以确保没有任性的测试类型潜入系统

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

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

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

类型/子类型要复杂得多

如果TestABC是Test的一个子类型,那么在TestABC中,主键应该是TestId,它也应该是表Test列TestId的外键。[我从来不会对代理主键列仅使用“ID”-在编写复杂的联接时,它会变得太混乱或太快。]

听起来好像有很多测试子类型。听起来它们也是独占的,例如,表TestABC中包含数据的测试不能同时包含表TestXYZ或任何其他子类型表中的数据。要确定它是哪种类型的测试,您必须查询每个子表以找到它是哪种类型的测试。然而,这太糟糕了,所以应该在测试表中添加一个TestType列。可能最好还有一个查找表(TestType),带有外键,以确保没有任性的测试类型潜入系统

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

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

因此,如果您有
visitetest
,它连接
Visit
Test
,并且您在子测试表中设置
Id
列(
TestABC
,等等),作为
TestABC
的PK和
Test
的FK。。。这不符合你所有的要求吗?我遗漏了什么吗?所以如果你有
visitetest
,它连接
Visit
Test
,并且你在你的子测试表中设置
Id
列(
TestABC
,等等),作为
TestABC
的主键和
Test
的FK。。。这不符合你所有的要求吗?我遗漏了什么吗?我觉得这篇文章很有趣