Ответ
Денормализация — это осознанный процесс добавления избыточных данных в базу данных для повышения производительности чтения. По сути, это отступление от правил нормализации (которые направлены на устранение избыточности) ради ускорения запросов.
Основная цель — уменьшить количество дорогостоящих операций JOIN
.
Пример:
Представим, что у нас есть нормализованная схема для блога:
posts
(id
,title
,user_id
)comments
(id
,text
,post_id
)
Чтобы посчитать количество комментариев для каждого поста, нужен запрос с GROUP BY
и JOIN
или подзапрос. При высокой нагрузке это может быть медленно.
После денормализации мы можем добавить поле comments_count
прямо в таблицу posts
:
posts
(id
,title
,user_id
,comments_count
)
Теперь для получения числа комментариев достаточно простого SELECT
из таблицы posts
, но при добавлении/удалении комментария нужно обновлять и таблицу comments
, и поле comments_count
в posts
.
Преимущества:
- Ускорение чтения: Запросы становятся проще и быстрее, так как требуют меньше
JOIN
'ов. - Упрощение запросов: Логика извлечения данных становится тривиальной.
Недостатки:
- Усложнение записи и обновления: При изменении данных нужно обновлять их во всех местах, где они дублируются.
- Риск несогласованности данных: Если не обновить дубликат, данные станут противоречивыми.
- Увеличение объема БД: Избыточные данные занимают дополнительное место.
Когда применять:
Денормализацию стоит применять в системах с преобладающей нагрузкой на чтение (read-heavy), таких как аналитические системы, отчеты, каталоги товаров, где скорость получения данных критически важна, а операции записи происходят реже.