问题描述
我看过类似的帖子,但没有找到确切的答案。
我有一系列表,用于存储有关某些事件的数据。这些表中的每一个都具有相同的结构。这些表中的每个表都有一个id
的外键约束,用于显示与数据相关的项目。
这些表id
的每个结构也都是相同的CHAR(24)
。这些ids
来自的表必须保持独立,因为它们完全不同。
我有兴趣将我的所有数据表合并为一个,而外键则限制为3个表之一。因此,我的数据表中的一行将必须在三个表之一中具有一个id
。此外,此外键将需要进行ON DELETE
设置。这可能吗?而且,这是糟糕的设计吗?
Items A
- id
- ...
Items B
- id
- ...
Items C
- id
- ...
Data
- id FK
解决方法
不。您所描述的内容有时称为polymorphic-associations,但这应该是一个不好的设计提示,因为您不能为此设置外键约束。即,{{ 1}}语法仅允许您引用一个表,而不是三个表。
制作执行FOREIGN KEY
操作的真实外键约束的唯一方法是制作三个单独的外键:
ON DELETE
对于Data中的给定行,假定这三个外键中只有一个是非NULL。其他两个将为NULL。确保可以在触发器或CHECK约束中完成此操作,否则只需在应用程序逻辑中实现它即可(即,不要在一行中插入多个非NULL列)。
多态关联只能存储一个可以引用三个不同表之一的列,这不是有效的关系设计。
您可以看到我以前写的关于多态关联的答案:https://stackoverflow.com/search?q=%5Bpolymorphic-associations%5D+user%3A20860