Короткий ответ
Нормализация — это процесс структурирования таблиц так, чтобы устранить избыточное дублирование данных и функциональные зависимости, не относящиеся напрямую к первичному ключу; на практике чаще всего ориентируются на 3-ю нормальную форму (3NF), где неключевые атрибуты зависят только от первичного ключа.
Как это работает подробнее
Денормализованная таблица часто хранит повторяющиеся группы атрибутов (например, название и адрес компании в каждой строке заказа); нормализация выносит такие данные в отдельную таблицу со своим PK, а исходная ссылается на неё через FK.
Пример кода
example.sql
-- Денормализовано: company_name и company_address повторяются в каждом заказе
-- orders(id, customer_name, company_name, company_address, amount)
-- После нормализации (3NF):
CREATE TABLE companies (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
address TEXT
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
company_id INTEGER REFERENCES companies(id),
amount NUMERIC(12,2) NOT NULL
);
-- Изменение адреса компании теперь требует UPDATE одной строки в companies, а не N строк в ordersЧто использовать на практике
- Практика. Нормализация снижает избыточность и риск рассинхронизации данных при обновлении, но увеличивает число JOIN на чтение; в реальных системах иногда сознательно идут на частичную денормализацию для производительности, документируя это решение.
Подводные камни
- Ошибка. Нормализуют «до упора» без учёта паттернов доступа, получая схему с 8-10 JOIN на типовой запрос; либо оставляют дублирование атрибутов компании/клиента в каждой таблице, что приводит к рассинхронизации при обновлении одной копии.