Sql 多个表与公共表之间的关系

Sql 多个表与公共表之间的关系,sql,sql-server,Sql,Sql Server,我有三张桌子 工作类型 工作子类型 作业子类型 所有表都接受存储在参数表中的参数。 参数一旦在一个表中使用,就不能被任何其他表使用 所有表的Id值都需要出现在参数表中。 我在参数表中创建了EntityId和EntityType列,该参数表存储了JobType或JobSubType或JobSubType Id以及实体的类型 如何定义关系以确保EntityId中的值属于JobType、JobSubType或JobSubType 仅仅在EntityId上使用外键是没有帮助的。 我不想为JobType

我有三张桌子

工作类型 工作子类型 作业子类型 所有表都接受存储在参数表中的参数。 参数一旦在一个表中使用,就不能被任何其他表使用

所有表的Id值都需要出现在参数表中。 我在参数表中创建了EntityId和EntityType列,该参数表存储了JobType或JobSubType或JobSubType Id以及实体的类型

如何定义关系以确保EntityId中的值属于JobType、JobSubType或JobSubType

仅仅在EntityId上使用外键是没有帮助的。 我不想为JobType JobSubType或JobSubsubType ID创建单独的列,因为3个列中的2个总是空的

示例参数表

+-------------+----------+---------------+--+
| ParameterId | EntityId |  EntityType   |  |
+-------------+----------+---------------+--+
|           1 |        2 | JobType       |  |
|           2 |        6 | JobSubType    |  |
|           3 |       11 | JobSubSubType |  |
|           4 |        4 | JobType       |  |
|           5 |        6 | JobType       |  |
|           6 |       12 | JobSubSubType |  |
+-------------+----------+---------------+--+

我已经用EntityId在JobType、JobSubType和JobSubType表上创建了外键。当我在参数表中插入jobsubtypes的值时,我遇到了一个错误。

您可以通过两种方式来完成。第一种方法是拥有一个类型的公共基表,该基表用于为三个表提供具有公共祖先ID的服务,因此每个表的ID在所有三个表中都是唯一的,然后您可以在一列中引用ID,可能还有第二列来指示引用了哪个表

我认为第二种方法更可取:只有一个类型表,但使用ParentID作为自指针,以允许子类型、子类型,甚至子类型。那么你所需要做的就是引用ID

为了按照后续注释中的要求保留现有ID,您添加了一个额外的字段来标识表,如第一段所述。然后,联接的结果如下所示:

SELECT
    col1, col2, ..., coln
FROM
    mytable1
    INNER JOIN types on mytable1.typeID = types.ID AND mytable1.typetable='Type'
UNION ALL
SELECT
    col1, col2, ..., coln
FROM
    mytable1
    INNER JOIN types on mytable1.typeID = types.ID AND mytable1.subtypetable='SubType'
UNION ALL
SELECT
    col1, col2, ..., coln
FROM
    mytable1
    INNER JOIN types on mytable1.typeID = subsubtypes.ID AND mytable1.typetable='SubSubType'

提供一些样本数据和预期结果。这真的很有帮助。示例数据提供文本格式而不是图像。作业类型\子类型\等是否相关,即它们是否都链接到单个作业?如果不是的话,我有点迷失在你想要成为paramater的唯一元素上。比如参数本身是否唯一?或者什么东西是特别不能复制的?@MasonStedman是的,它们是相关的。一个作业类型可以有多个作业子类型,一个作业子类型可以有多个作业子类型。每一个都有自己的参数。因此,即使值完全相同,JobSubType的参数也不能被JobSubType重用。这将是一个新参数。有没有办法使用相同的ID。方案2无法完成,因为它将对项目产生影响。选项1似乎可行,但所需的更改仍然需要大量重写。事实上,如果没有办法保留ID,那么在Db上没有任何约束,在应用层上只保留它们是一个相对容易的选择。保留相同ID的方法,即保留现有三个表中的现有独立ID,就是使用两列进行连接。第一列定义表格,第二列定义id。我将修改答案以提供示例。