Пользовательский тип PostgreSQL enum vs внешний ключ - обслуживание и производительность - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь выбрать между двумя подходами к пользовательскому набору значений для столбца в таблице PostgreSQL.

Определяемый пользователем тип данных:

CREATE TYPE track_class AS ENUM(
  'Easy', 'Medium', 'Difficult', 'Very difficult', 'NA'
);

Внешний ключ:

CREATE TABLE track_class (
    class TEXT PRIMARY KEY
);

INSERT INTO track_class (class) VALUES ('Easy'), ('Medium'), ('Difficult'), ('Very difficult'), ('NA');

CREATE TABLE tracks (
    track_class TEXT REFERENCES track_class (class) ON UPDATE CASCADE
);

Является ли какой-либо один лучше другого по обслуживанию (добавить / редактировать / заменить значение в домене позже) и / или производительности (где, группировать, упорядочить по), говоря о миллионах записей, или не делаетбольшая разница?

1 Ответ

2 голосов
/ 26 сентября 2019

Я бы не рекомендовал использовать enum.Простое удаление значений перечисления невозможно без удаления типа.

Я полагаю, что очень простой в обращении, и лучше всего с точки зрения моделирования будет новая таблица с внешним ключом, который вы упомянули.Производительность здесь не должна быть проблемой, если вы поместите индекс в столбец внешнего ключа.

Другой вариант - использовать ограничение CHECK:

ALTER TABLE mytable
    ADD CONSTRAINT myconstraint_only_some_values
        CHECK (mycolumn IN ('Easy', 'Medium', 'Difficult', 'Very difficult', 'NA'));

Возможно, этоявляется более "видимым" в ваших данных, и вам не нужно думать о присоединении.Если вы не забудете индекс для mycolumn, эта версия должна быть такой же производительной, как и версия с внешним ключом.

...