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

Меняем уже существующие таблицы командой ALTER TABLE и знакомимся с идеей нормализации.

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

Зачем менять таблицы

Схема живёт вместе с проектом: появляются новые поля, что-то переименовывают, добавляют индексы. Пересоздавать таблицу с данными нельзя, поэтому используют ALTER TABLE.

Основные операции

-- добавить столбец
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- изменить тип/свойства столбца
ALTER TABLE users MODIFY COLUMN name VARCHAR(150) NOT NULL;

-- переименовать столбец
ALTER TABLE users CHANGE COLUMN phone phone_number VARCHAR(20);

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

-- добавить ограничение/индекс
ALTER TABLE users ADD UNIQUE (email);

Это MySQL-синтаксис (для чтения). Осторожно на проде: на больших таблицах ALTER может блокировать таблицу и идти долго; такие изменения планируют и делают в окно низкой нагрузки.

Добавление столбца в песочнице

Базовый ALTER TABLE ... ADD COLUMN переносим — запустите:

CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  name TEXT
);

INSERT INTO users (name) VALUES ('Анна'), ('Борис');

ALTER TABLE users ADD COLUMN city TEXT;

UPDATE users SET city = 'Москва' WHERE id = 1;

SELECT id, name, city FROM users;

Вывод:

id  name   city
1   Анна   Москва
2   Борис  

У второй строки city остался пустым (NULL) — новый столбец у старых строк не заполняется автоматически.

Нормализация — кратко

Нормализация — это организация данных так, чтобы избегать дублирования и противоречий. Базовая идея: каждая сущность хранится в своей таблице один раз, а связи — через ключи.

Антипример (плохо): в таблице заказов в каждой строке повторяется имя и адрес клиента. Если клиент сменит адрес, придётся править десятки строк, и легко рассогласовать.

Нормализованно (хорошо): клиент — в таблице customers один раз, а в orders хранится только customer_id. Три ориентира первых нормальных форм:

  • 1НФ: в ячейке одно атомарное значение (не список через запятую).
  • 2НФ: неключевые поля зависят от всего ключа целиком.
  • 3НФ: неключевые поля не зависят друг от друга, а только от ключа.

На практике большинству приложений достаточно «здравого смысла + 3НФ»: выноси повторяющиеся данные в отдельные таблицы и связывай ключами.

Итог

  • ALTER TABLE меняет структуру: ADD / MODIFY / CHANGE / DROP COLUMN.
  • На больших таблицах ALTER может быть долгим и блокирующим — планируйте его.
  • Нормализация убирает дублирование: каждая сущность хранится один раз, связи — через ключи.
  • Ориентир для большинства проектов — 3НФ и здравый смысл.
Проверьте себя
1. Какая команда добавляет новый столбец в существующую таблицу?
ACREATE COLUMN
BALTER TABLE ... ADD COLUMN
CINSERT COLUMN
DUPDATE TABLE
2. В чём основная идея нормализации?
Aдублировать данные для скорости
Bхранить каждую сущность один раз и связывать таблицы ключами
Cхранить всё в одной большой таблице
Dотказаться от первичных ключей
3. Почему ALTER TABLE на больших продакшен-таблицах требует осторожности?
Aон удаляет все данные
Bон может надолго заблокировать таблицу
Cон работает только в MyISAM
Dпосле него нельзя делать SELECT
Поддержать проект