Что такое нормализация и денормализация в базах данных?

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

Нормализация базы данных

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

Цели нормализации:

  • Устранение дублирования данных (redundancy)

  • Повышение логической целостности

  • Упрощение обновления, вставки и удаления данных

  • Предотвращение аномалий при модификации (Insert/Update/Delete Anomalies)

Формы нормализации (Normal Forms):

Нормализация выполняется пошагово по так называемым нормальным формам:

  1. **Первая нормальная форма (1NF):
    **

    • Все атрибуты атомарны (не содержат списков или множеств)

    • Таблица не содержит повторяющихся групп

  2. Пример нарушения: колонка PhoneNumbers со значением ["12345", "67890"] — не атомарно.

  3. **Вторая нормальная форма (2NF):
    **

    • Удовлетворяет 1NF

    • Все неключевые атрибуты зависят от всего первичного ключа, а не его части

  4. **Третья нормальная форма (3NF):
    **

    • Удовлетворяет 2NF

    • Нет транзитивных зависимостей между неключевыми атрибутами

  5. **Boyce-Codd нормальная форма (BCNF):
    **

    • Расширение 3NF

    • Каждый детерминант (атрибут, от которого что-то зависит) — это кандидатный ключ

  6. **Четвёртая и пятая нормальные формы (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-пайплайны для переноса данных из нормализованной структуры в денормализованные модели.