ALTER TABLE и нормализация

Меняем структуру готовых таблиц и понимаем, зачем данные разбивают на несколько таблиц.

ALTER TABLE — команда, изменяющая структуру существующей таблицы: добавляет, удаляет и меняет столбцы и ограничения без пересоздания таблицы.

Изменение структуры на лету

Схема почти никогда не бывает идеальной с первого раза. Требования меняются, появляются новые поля. ALTER TABLE позволяет дорабатывать таблицу, не теряя данные.

-- Добавить столбец
ALTER TABLE users ADD COLUMN phone TEXT;

-- Удалить столбец
ALTER TABLE users DROP COLUMN phone;

-- Переименовать столбец
ALTER TABLE users RENAME COLUMN name TO full_name;

-- Сменить тип столбца
ALTER TABLE users ALTER COLUMN age TYPE BIGINT;

-- Задать и снять значение по умолчанию
ALTER TABLE users ALTER COLUMN active SET DEFAULT true;
ALTER TABLE users ALTER COLUMN active DROP DEFAULT;

Добавление и снятие ограничений

Ограничения тоже можно добавлять к уже существующей таблице. Это частая операция при ужесточении требований к данным.

-- Добавить ограничение
ALTER TABLE users ADD CONSTRAINT uq_email UNIQUE (email);
ALTER TABLE orders ADD CONSTRAINT positive_total CHECK (total >= 0);

-- Сделать столбец обязательным
ALTER TABLE users ALTER COLUMN email SET NOT NULL;

-- Снять ограничение по имени
ALTER TABLE users DROP CONSTRAINT uq_email;

Важно: если добавляете NOT NULL или CHECK к таблице, где уже есть данные, PostgreSQL проверит все строки. Если хоть одна нарушает правило — команда не выполнится. Сначала почистите данные.

Зачем нужна нормализация

Нормализация — это процесс разбиения данных на таблицы так, чтобы каждый факт хранился ровно в одном месте. Посмотрим на проблему «всё в одной таблице».

order_idcustomercustomer_cityproduct
1АннаМоскваКофе
2АннаМоскваЧай

Город Анны записан дважды. Если она переедет, придётся обновлять каждую строку — и легко что-то пропустить (это называют аномалией обновления). Решение — вынести клиентов в отдельную таблицу и связать внешним ключом.

Нормализованная схема

CREATE TABLE customers (
    id   SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    city TEXT
);

CREATE TABLE orders (
    id          SERIAL PRIMARY KEY,
    customer_id INTEGER REFERENCES customers(id),
    product     TEXT NOT NULL
);

Теперь город Анны хранится в одной строке таблицы customers. Переезд — это одно обновление. Заказы ссылаются на клиента по customer_id. Это и есть суть нормализации: каждый факт — в одном месте.

Практический баланс: нормализация убирает дублирование и аномалии, но добавляет JOIN-ы при выборке. Иногда ради скорости чтения данные сознательно денормализуют — но начинать всегда стоит с нормализованной схемы.

Итог

  • ALTER TABLE меняет структуру без потери данных: столбцы, типы, значения по умолчанию, ограничения.
  • Добавление NOT NULL/CHECK к непустой таблице проверяет существующие строки и упадёт при нарушении.
  • Нормализация хранит каждый факт в одном месте, убирая дублирование и аномалии обновления.
Проверьте себя
1. Что делает команда ALTER TABLE users ADD COLUMN phone TEXT?
AСоздаёт новую таблицу users
BДобавляет столбец phone к существующей таблице users
CУдаляет таблицу users
DПереименовывает таблицу
2. Почему добавление NOT NULL к непустой таблице может завершиться ошибкой?
ANOT NULL нельзя добавлять после создания
BPostgreSQL проверит существующие строки, и если в столбце есть NULL — команда не выполнится
CТаблица заблокируется навсегда
DЭто всегда успешно
3. В чём основная цель нормализации?
AУскорить любые запросы
BХранить каждый факт в одном месте, убирая дублирование и аномалии обновления
CУменьшить число таблиц
DИзбавиться от внешних ключей
Поддержать проект