我有3张桌子
所有表都包含存储在Parameter表中的参数。 一个参数在一个表中使用后,任何其他表都不能使用它。
所有表的Id值都需要出现在Parameter表中。
我在参数表中创建了EntityId
和EntityType
列,其中存储了JobType
或JobSubType
或JobSubSubType
ID以及实体的类型。
如何定义确保EntityId
中的值属于JobType
,JobSubType
或JobSubSubType
的关系?
只需在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和JobSubSubType表上创建了外键。当我在参数表中插入JobSubSubTypes的值时,我收到了一个错误。
答案 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'