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

问题描述

我们有一个涉及大量多态/继承/子类型的数据库模式。某些外键(例如注释主题或权限目标)指向大量表,某些属性(例如全局唯一代码)由多个表共享。

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

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

我能想到几种可能的方法

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

  2. 执行与上述相同的操作,但使用列出可能表的自定义 Enum 类型。

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

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

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

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

解决方法

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

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