我们有一个涉及大量多态/继承/子类型的数据库模式。某些外键(例如评论主题或权限目标)指向大量表,某些属性(例如全局唯一代码)由多个表共享。
我们构建这种结构的方式是通过每个类的表继承,其中父表和子表共享一个 UUID 主键。选择 UUID 以便可以合并和分离表以适应业务需求,而不必担心冲突。
目前,父类型上没有明确的鉴别器列,但出于几个原因,我想添加一个。它将排除错误地将两个不同的具体子类型指向同一父类型的可能性。它还经常保存连接,因为通常不需要特定于子的数据,只需要知道哪个子类型与给定的 id 匹配。
我可以想到几种可能的方法:
只需使用存储具体子类型表名称的纯文本字段。
执行与上述相同的操作,但使用列出可能表的自定义 Enum 类型。
使用指向查找表的“id”字段。
(2) 似乎比 (1) 是一个更好的选择,但是它有一个相当大的缺点,即不允许我在没有大量迁移痛苦的情况下从 Enum 中删除一个值。如果这个鉴别器列出现在很多表上,这尤其痛苦,它很可能会出现。
(3) 通常用于“需要更改的枚举”,但是它需要将 UUID/int id 值硬编码到 DDL 中,以便正确处理子类型上的外键,这似乎有点破坏交易.
这让我倾向于(1),但我想知道是否有更好的选择。甚至可能是针对字符集非常有限的频繁重复标识符而优化的文本类型。