列上的 Postgresql CONSTRAINT 到 string/text 值的全局集

Postgresql CONSTRAINT on column to global set of string/text values

我在一个数据库中有一组多个 table,它大致使用 table 继承模式。 “class”作为 varchar 列存储在给定 table 中需要的地方。大多数 tables 只有一个可能的值,但有少数 tables 可以有效地具有任何值。我还有一个配置 table,它基本上列出了所有有效的“class”名称。

为了可维护性和数据一致性,我希望能够对各种 table 施加约束,以防止操作插入引用“class”的记录不存在,但我希望有效列表对数据库来说是“全局的”,并且我希望它尽可能高效。

我的直觉是用 class_name IN ('car', 'bike', 'fruit') 之类的东西来应用约束。到目前为止,我已经探索了使用配置 table 中无效 SQL 的子查询尝试 CHECK CONSTRAINT 并尝试将存储的 FUNCTION 存储到 return所需的集合,但这似乎不是一种 return 类型的 PostgreSQL 函数支持。我还尝试通过 ALTER DATABASE db SET abc.xyz = 1 将集合分配给“全局”配置变量,但同样,IN 的一组值似乎无效 SQL.

我知道我可以通过 FOREIGN KEY 实现此目的,但这意味着删除配置记录会影响存储在其他 table 中的值,我担心性能。

我知道 ENUM 数据类型,但我想将“class”名称存储为 varchar,因为文本更易于使用。

有没有一种我可能错过的方法,它既可以是“全局的”(即仅在数据库中的一个位置维护),又可以存储为纯文本并且相对高效?

您可以使用具有检查约束的域:

create domain class_name_domain as text
  constraint check_name check (value in ('car', 'bike'));
  
create table the_table
(
  id         integer primary key, 
  class_name class_name_domain
);