Ответ
Денормализация — это осознанное добавление избыточных данных в базу для ускорения операций чтения. К ней прибегают, когда производительность запросов становится важнее строгой нормализации и целостности данных.
Основная идея — пожертвовать скоростью записи и усложнить логику обновления ради того, чтобы избежать дорогостоящих JOIN-операций при чтении.
Ключевые примеры:
-
Аналитика и отчетность: Для построения сложных отчетов часто требуются данные из множества таблиц. Создание отдельной денормализованной таблицы (витрины данных) значительно ускоряет агрегирующие запросы.
-- Вместо 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) ); -
Кэширование вычисляемых значений: Хранение часто запрашиваемых агрегатов прямо в основной таблице, чтобы не вычислять их каждый раз.
- Количество комментариев к посту: Вместо
COUNT(*)при каждом запросе.ALTER TABLE posts ADD COLUMN comments_count INT DEFAULT 0; - Рейтинг товара: Вместо вычисления среднего по всем отзывам.
- Количество комментариев к посту: Вместо
-
Высоконагруженные системы: В лентах новостей или логах действий часто дублируют информацию (например, имя и аватар пользователя) рядом с его действием, чтобы не делать
JOINдля каждого из сотен элементов на странице.
Минусы, о которых нужно помнить:
- Избыточность данных: Увеличивается размер БД.
- Риск аномалий: Данные могут стать несогласованными, если логика обновления не отработала корректно (например, имя пользователя изменилось, а в старых записях ленты осталось прежним).
- Усложнение логики записи: При обновлении данных нужно не забыть обновить все их дубликаты.
Главное правило: Денормализацию применяют, когда количество операций чтения значительно превышает количество операций записи (reads >> writes).