Что такое денормализация и в каких случаях её применяют?

Ответ

Денормализация — это осознанный процесс добавления избыточных (дублирующихся) данных в базу данных с целью повышения производительности чтения. Это компромисс, при котором мы жертвуем нормализацией и усложняем операции записи/обновления ради ускорения SELECT-запросов.

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

Классический пример:
У нас есть таблицы posts (посты) и comments (комментарии). Чтобы получить количество комментариев для каждого поста, нам нужен JOIN и GROUP BY.

-- Нормализованная структура
SELECT p.id, p.title, COUNT(c.id) as comments_count
FROM posts p
LEFT JOIN comments c ON p.id = c.post_id
GROUP BY p.id;

При денормализации мы можем добавить поле comments_count прямо в таблицу posts.

-- Денормализованная структура
CREATE TABLE posts (
    id INT PRIMARY KEY,
    title VARCHAR(255),
    comments_count INT DEFAULT 0 -- Дублирующее поле
);

Теперь для получения количества комментариев достаточно простого SELECT без JOIN'ов. Однако при каждом добавлении/удалении комментария нам нужно будет обновлять поле comments_count в таблице posts.

Плюсы:

  • Ускорение чтения: Значительно сокращается время выполнения сложных запросов.
  • Упрощение запросов: Запросы становятся проще, так как не требуют JOIN'ов.

Минусы:

  • Избыточность данных: Увеличивается размер базы данных.
  • Усложнение записи/обновления: Требуются дополнительные операции для поддержания данных в согласованном состоянии.
  • Риск аномалий данных: Если не обновить дублированные данные во всех местах, возникнет несогласованность (например, реальное число комментариев не будет совпадать со значением в comments_count).

Когда применять: Денормализация часто используется в OLAP-системах (аналитические системы, хранилища данных) и в высоконагруженных OLTP-системах, где производительность чтения критически важна.