Что такое нормализация и денормализация в базах данных?
Нормализация и денормализация — это два противоположных подхода к организации структуры таблиц в базе данных. Оба применяются с целью повышения эффективности работы с данными, но преследуют разные цели: нормализация стремится минимизировать избыточность и повысить логическую целостность данных, тогда как денормализация — улучшить производительность запросов путём намеренного дублирования данных.
Нормализация базы данных
Нормализация — это процесс структурирования базы данных таким образом, чтобы минимизировать избыточность данных и зависимости между ними. Он включает разбиение таблиц на более мелкие, а также установление связей между ними с помощью внешних ключей.
Цели нормализации:
-
Устранение дублирования данных (redundancy)
-
Повышение логической целостности
-
Упрощение обновления, вставки и удаления данных
-
Предотвращение аномалий при модификации (Insert/Update/Delete Anomalies)
Формы нормализации (Normal Forms):
Нормализация выполняется пошагово по так называемым нормальным формам:
-
**Первая нормальная форма (1NF):
**-
Все атрибуты атомарны (не содержат списков или множеств)
-
Таблица не содержит повторяющихся групп
-
-
Пример нарушения: колонка PhoneNumbers со значением ["12345", "67890"] — не атомарно.
-
**Вторая нормальная форма (2NF):
**-
Удовлетворяет 1NF
-
Все неключевые атрибуты зависят от всего первичного ключа, а не его части
-
-
**Третья нормальная форма (3NF):
**-
Удовлетворяет 2NF
-
Нет транзитивных зависимостей между неключевыми атрибутами
-
-
**Boyce-Codd нормальная форма (BCNF):
**-
Расширение 3NF
-
Каждый детерминант (атрибут, от которого что-то зависит) — это кандидатный ключ
-
-
**Четвёртая и пятая нормальные формы (4NF, 5NF):
**-
Устранение многозначных зависимостей (4NF)
-
Устранение соединений, которые нельзя восстановить без потери данных (5NF)
-
Пример нормализации:
Изначально:
| OrderID | CustomerName | ProductName | Quantity |
|---------|--------------|-------------|----------|
| 1 | Ivanov | Laptop | 2 |
| 1 | Ivanov | Mouse | 1 |
Проблема: дублируется CustomerName
Нормализованно:
-
Customers(CustomerID, CustomerName)
-
Orders(OrderID, CustomerID)
-
OrderDetails(OrderID, ProductID, Quantity)
-
Products(ProductID, ProductName)
Преимущества нормализации:
-
Экономия памяти за счёт устранения дублирования
-
Простота поддержания актуальности данных
-
Повышение целостности (например, при удалении клиента удаляются все связанные заказы)
-
Улучшение читаемости структуры данных
Недостатки нормализации:
-
Увеличение количества JOIN-ов при выборках
-
Снижение производительности при больших объёмах данных
-
Более сложная структура базы, особенно для новичков
-
Не всегда подходит для аналитики и OLAP-нагрузки
Денормализация базы данных
Денормализация — это процесс объединения таблиц, который сопровождается намеренным дублированием данных для повышения производительности чтения. Она применяется в тех случаях, когда время ответа на запрос критично, а объём данных позволяет мириться с избыточностью.
Цели денормализации:
-
Снижение количества JOIN-операций
-
Повышение производительности выборок
-
Упрощение архитектуры хранения под конкретные сценарии чтения
Методы денормализации:
-
Объединение связанных таблиц (merge)
-
Встраивание агрегированных данных (pre-computed totals, counts)
-
Дублирование часто используемых атрибутов
-
Кэширование результатов подзапросов или представлений (views)
Пример денормализации:
Вместо хранения Orders и Customers в разных таблицах и выполнения JOIN при каждой выборке:
| OrderID | CustomerName | CustomerEmail | ProductName |
|---------|--------------|---------------|-------------|
| 1 | Ivanov | iv@example.com| Laptop |
Теперь все данные — в одной таблице, быстрее считываются, но при изменении e-mail клиента нужно менять его во всех строках.
Преимущества денормализации:
-
Увеличение скорости запросов (меньше JOIN-ов)
-
Простота структуры для аналитиков и BI-систем
-
Эффективна для чтения, особенно в read-heavy приложениях
Недостатки денормализации:
-
Увеличение объёма хранимых данных
-
Сложности с поддержанием актуальности и консистентности
-
Риск аномалий при обновлении и удалении
-
Возможность возникновения логических ошибок при несогласованности
Когда использовать нормализацию:
-
В системах с частыми изменениями данных (OLTP)
-
При необходимости обеспечить максимальную целостность данных
-
Когда важна экономия дискового пространства
-
В случаях, когда разработка требует строгой схемы и минимального дублирования
Когда использовать денормализацию:
-
В системах, ориентированных на чтение и отчётность (OLAP, BI)
-
Когда время отклика критично (например, в real-time аналитике)
-
В системах, где допустима некоторая избыточность ради производительности
-
При построении витрин данных (data marts) или кэшированных отчётов
Комбинированный подход
В большинстве практических систем используют гибридный подход: рабочая транзакционная база строится по нормализованной схеме, а отдельные представления или хранилища (например, витрины данных или OLAP-кубы) денормализуются для аналитики и ускорения выборок. Также часто используют ETL/ELT-пайплайны для переноса данных из нормализованной структуры в денормализованные модели.