Ответ
Денормализация — это осознанный процесс добавления избыточных (дублирующихся) данных в базу данных с целью повышения производительности чтения. Это компромисс, при котором мы жертвуем нормализацией и усложняем операции записи/обновления ради ускорения 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-системах, где производительность чтения критически важна.