Правильный способ сделать это - использовать таблицу поиска и внешний ключ:
create table status
(
id integer primary key,
name text not null
);
insert into status (id, name)
values
(1, 'Completed'),
(2, 'Pending'),
(3, 'Failed'),
(4, 'Created');
create table some_table
(
id integer primary key,
status_id integer not null references status
);
Это наиболее гибкий способ справиться с этим в реляционной базе данных.
Если вы знаете, что вряд ли когда-нибудь измените эти значения, вы можете использовать проверочное ограничение:
create table some_table
(
id integer primary key,
status text not null,
constraint check_status
status in ('Completed', 'Pending', 'Failed', 'Created')
);
Недостатком является то, что вы сохраняете одни и те же значения снова и снова, поэтому размер таблицыбудет больше по сравнению с решением с внешним ключом.
Третий вариант - использовать тип перечисления
create type status_type AS ENUM (''Completed', 'Pending', 'Failed', 'Created');
Затем использовать этот тип в таблице:
create table some_table
(
id integer primary key,
status status_type not null
);
Это имеет такое же требование к хранилищу, как и решение с внешним ключом, но отображает статус «открытый текст».