Что такое денормализация базы данных и когда её стоит применять?

Ответ

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

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