Денормализация в БД
Ранее мы рассказывали про нормализацию в БД, рассмотрим обратный процесс.
Денормализация — внесение избыточности в БД путём объединения таблиц, чтобы упростить структуру и ускорить чтения данных.
Отличие от нормализации
Нормализация нужна для устранения избыточности данных; для разделения информации по отдельным таблицам, чтобы обеспечивать целостность и упростить обслуживание БД. Она увеличивает количество джойнов при выполнении запросов и может замедлять чтение данных.
Денормализация, наоборот, вводит избыточность обратно в БД, объединяя таблицы и дублируя информацию. Запросы становятся проще, операции чтения быстрее, но могут возникнуть трудности с поддержкой и обновлением из-за риска несогласованности.
Когда применяется
- Для ускорения чтения данных за счет сокращения количества джойнов.
- В системах с большим объемом операций чтения и минимальным количеством обновлений, где производительность чтения критична.
- Для ускорения разработки и оптимизации работы приложений.
Методы
- Добавление избыточных данных: дублирование данных в нескольких таблицах для сокращения соединений при запросах.
- Добавление производных или агрегированных столбцов: включение полей с предварительно вычисленными значениями, например, общей суммы заказа.
- Объединение таблиц: слияние смежных таблиц в одну для уменьшения операций соединения.
- Денормализация иерархических структур: дублирование информации о верхних уровнях иерархии на нижних для упрощения запросов.
- Использование материализованных пр едставлений: хранение результатов сложных запросов в виде отдельной таблицы для быстрого доступа.
- Введение таблиц сумм и счётчиков: создание отдельных таблиц для хранения суммарной информации, например, общее количество товаров, проданных за день, или общее количество посетителей сайта.
Примеры
- Агрегация данных: в таблице заказов хранится не только идентификатор клиента, но и агрегированная информация о клиенте, например, общая сумма покупок. Это избавляет от необходимости соединять таблицы заказов и клиентов для расчета общих покупок клиента.
- Кэширование результатов запросов: в таблице с продуктами может храниться не только информация о продукте, но и предварительно рассчитанное количество продуктов на складе. Это снижает нагрузку на СУБД за счет уменьшения количества вычислений при каждом запросе.