Использовали ли вы тип данных ENUM в PostgreSQL?

«Использовали ли вы тип данных ENUM в PostgreSQL?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовал. ENUM в PostgreSQL — это пользовательский тип, который задает фиксированный набор допустимых строковых значений для столбца.

Преимущества и сценарии использования:

  • Целостность данных: Гарантирует, что в столбец не попадет некорректное значение. Лучше, чем CHECK (status IN ('new', 'in_progress', 'done')), так как тип определяется централизованно.
  • Эффективность хранения: Значения хранятся как 4-байтные целые числа, что компактнее, чем текст.
  • Читаемость запросов: WHERE status = 'active' понятнее, чем WHERE status_id = 1.

Пример из практики — статус заказа:

-- 1. Создаем тип
CREATE TYPE order_status AS ENUM ('pending', 'processing', 'shipped', 'delivered', 'cancelled');

-- 2. Используем в таблице
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_id INT NOT NULL,
    status order_status NOT NULL DEFAULT 'pending',
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- 3. Вставка и выборка
INSERT INTO orders (customer_id, status) VALUES (1, 'processing');

SELECT * FROM orders WHERE status = 'shipped';
-- Сортировка работает по порядку объявления значений в ENUM
SELECT * FROM orders ORDER BY status;

Важные нюансы:

  • Изменить список значений существующего ENUM (ALTER TYPE ... ADD VALUE) можно, но только добавив новое значение в конец. Удалить или изменить порядок значений сложно — часто требуется создание нового типа и миграция данных.
  • Для часто меняющихся справочников (например, список стран) лучше использовать отдельную таблицу со связью по внешнему ключу.