在连接表中使用的 postgres 中存储枚举类型的最佳方法是什么?



我有以下三个表:

电影类型

CREATE TYPE category AS ENUM ('comedy', 'drama', 'action', 'thriller');
CREATE TABLE movie_types (
id BIGSERIAL PRIMARY KEY,
category category NOT NULL
);
Column |  Type  |                     Modifiers
--------+--------+----------------------------------------------------
id     | bigint | not null
category | category | not null

电影到电影类型联接表

CREATE TABLE movie_categories (
id BIGSERIAL PRIMARY KEY,
movie_type_id FOREIGN KEY REFERENCES movie_type(id)
movie_id FOREIGN KEY REFERENCES movie(id)
);
Column |  Type  |                     Modifiers
--------+--------+----------------------------------------------------
id     | bigint | not null
movie_type_id | category | not null
movie_id | category | not null

电影


CREATE TABLE movies (
id BIGSERIAL PRIMARY KEY,
name varchar
);
Column |  Type  |                     Modifiers
--------+--------+----------------------------------------------------
id     | bigint | not null
name | string | not null

电影类型是存储为枚举的有限类别列表。一部电影可以有几个不同的类别。

在类似的数据模型中存储内容时,最佳做法是什么?我在这里使用枚举类型是一种很好的做法,还是在movie_types中只使用varchar作为类别更好?

ENUM设置列可以采用的一组预定值。查找表对列提供了相同的限制。你面临的问题是你正试图同时实现这两个目标。一个解决方案是选择并实现其中一个。我倾向于尽可能减少维护,因此以下实现了一种查找表方法。

  • 第一步:删除ENUM
  • 第二步将类别表的类别改为文本
  • 将先前的枚举值插入类别表中
  • 根据需要调整其他表格

结果变成了一个简单的M:M,其中Movie:Movie_Types具有交集表Movie_categories。

create table movie_types (
id       bigint generated always as identity primary key 
, category text not null unique
);

insert into movie_types(category) 
values ('comedy'), ('drama'), ('action'), ('thriller');

create table movies (
id   bigint generated always as identity primary key 
, name varchar
);

create table movie_categories (
movie_type_id bigint references movie_types(id)
, movie_id      bigint references movies(id)
, constraint movie_categories_pk 
primary key (movie_id,movie_type_id)
);

相关内容

  • 没有找到相关文章

最新更新