存储一组 postgres 枚举值以供重用的正确抽象是什么?



我有以下枚举和表:

CREATE TYPE public.event_type as ENUM (
'eat_apple',
'eat_banana',
'brush_teeth'
);
CREATE TABLE public.events (
id integer not null,
type public.event_type,
created_at timestamp without time zone
);

我针对这个表编写了很多查询,这些查询只涉及事件类型的子集(eat_appleeat_banana(。

我可以用WHERE type IN ('eat_banana', 'eat_apple')子句编写每个查询,但是将来很可能需要添加eat_pear事件类型。

Postgres中有哪些可用的抽象,用于存储这些枚举值的子集,以便在整个查询中重用,以便在将来扩展子集,从而使现有查询考虑到这一点?

如果event_type是"默认"类型,我会完全放弃枚举,并使其成为一个包含标志的适当表。

create table event_type
(
id integer primary key,
name text not null unique,
is_default_type boolean not null default true
);
create table events 
(
id integer not null,
type integer not null references event_type,
created_at timestamp without time zone
);

要找到那些默认子集,你可以做:

select e.*
from events e
join event_type et on et.id = e.type and et.is_default_type;

要维护默认子集,只需更改标志即可。为了方便起见,您可以从上面的查询中创建一个视图,这样您就不必担心联接了。

如果您使用IN运算符而不是联接来创建视图,它也可以自动更新。

您将使用类型为event_type[]的数组,并将查询修改为(等效的(

WHERE type = ANY (array_value)

如果你想使用字符串常量,你可以写

WHERE type = ANY ('{eat_banana,eat_apple}'::event_type[])

相关内容

  • 没有找到相关文章

最新更新