В каких случаях и для чего применяется денормализация базы данных?

Ответ

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

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

Ключевые примеры:

  1. Аналитика и отчетность: Для построения сложных отчетов часто требуются данные из множества таблиц. Создание отдельной денормализованной таблицы (витрины данных) значительно ускоряет агрегирующие запросы.

    -- Вместо JOIN'ов таблиц products, orders, order_items
    CREATE TABLE monthly_sales_report (
        product_id INT,
        product_name VARCHAR(255), -- Дублированные данные
        month DATE,
        total_quantity_sold INT,
        total_revenue DECIMAL(12, 2)
    );
  2. Кэширование вычисляемых значений: Хранение часто запрашиваемых агрегатов прямо в основной таблице, чтобы не вычислять их каждый раз.

    • Количество комментариев к посту: Вместо COUNT(*) при каждом запросе.
      ALTER TABLE posts ADD COLUMN comments_count INT DEFAULT 0;
    • Рейтинг товара: Вместо вычисления среднего по всем отзывам.
  3. Высоконагруженные системы: В лентах новостей или логах действий часто дублируют информацию (например, имя и аватар пользователя) рядом с его действием, чтобы не делать JOIN для каждого из сотен элементов на странице.

Минусы, о которых нужно помнить:

  • Избыточность данных: Увеличивается размер БД.
  • Риск аномалий: Данные могут стать несогласованными, если логика обновления не отработала корректно (например, имя пользователя изменилось, а в старых записях ленты осталось прежним).
  • Усложнение логики записи: При обновлении данных нужно не забыть обновить все их дубликаты.

Главное правило: Денормализацию применяют, когда количество операций чтения значительно превышает количество операций записи (reads >> writes).