我有以下枚举和表:
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_apple
和eat_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[])