在 PostgreSQL 中处理鉴别器列的最佳方法是什么?

What is the best way to handle discriminator columns in PostgreSQL?

我们有一个涉及大量 polymorphism/inheritance/subtyping 的数据库模式。某些外键如评论主题或权限目标指向大量table,某些属性如全局唯一代码由多个table共享。

我们采用这种结构的方式是通过 table-per-class 继承,其中父子 table 共享一个 UUID 主键。选择 UUID 以便 table 可以合并和分离以适应业务需求,而不必担心冲突。

目前父类型上没有明确的鉴别器列,但出于几个原因我想添加一个。它将排除错误地将两个不同的具体子类型指向同一父类型的可能性。它还会经常保存连接,因为通常不需要特定于子的数据,只需要知道哪个子类型与给定的 id 匹配。

我能想到几个可能的方法:

  1. 只需使用存储具体子类型名称的纯文本字段table。

  2. 执行与上面相同的操作,但使用列出可能的 tables 的自定义枚举类型。

  3. 使用指向查找的“id”字段table。

(2) 似乎是比 (1) 更好的选择,但它有一个相当大的缺点,即不允许我在没有大量迁移痛苦的情况下从 Enum 中删除一个值。如果这个鉴别器列出现在很多 table 上,这会特别痛苦,这很可能会。

(3) 通常用于“需要更改的枚举”,但是它需要将 UUID/int id 值硬编码到 DDL 中才能正确处理子类型上的外键,这似乎有点破坏交易。

这让我倾向于 (1),但我想知道是否有更好的选择。甚至可能是针对字符集非常有限的频繁重复标识符优化的文本类型。

根据您的解释,我会使用第一个选项。

如果您使用短字符串,那不应浪费明显的性能和存储空间 space(短字符串占用的 space 比字符串本身多一个字节)。您必须使用检查约束来约束可以使用的字符串,但这不是什么大麻烦。