多个表和公用表之间的关系

时间:2018-04-28 05:49:44

标签: sql sql-server

我有3张桌子

  • JobType
  • JobSubType
  • JobSubSubType

所有表都包含存储在Parameter表中的参数。 一个参数在一个表中使用后,任何其他表都不能使用它。

所有表的Id值都需要出现在Parameter表中。 我在参数表中创建了EntityIdEntityType列,其中存储了JobTypeJobSubTypeJobSubSubType ID以及实体的类型。

如何定义确保EntityId中的值属于JobTypeJobSubTypeJobSubSubType的关系?

只需在EntityId上设置外键就无济于事。 我不想为JobType JobSubTypeJobSubsubType 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和JobSubSubType表上创建了外键。当我在参数表中插入JobSubSubTypes的值时,我收到了一个错误。

1 个答案:

答案 0 :(得分:1)

你可以用两种方式做到这一点。第一种方法是拥有一个公共基类表,用于为具有共同祖先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'