Как используется денормализация базы данных и для чего она нужна?
Что проверяют
Понимаете ли вы, что денормализация это осознанный обмен целостности на скорость чтения, а не отказ от проектирования. От аналитика ждут ещё и умения описать это в требованиях: где источник истины и как обновляется копия. Следом часто спрашивают, чем схема «звезда» в хранилище отличается от схемы рабочей базы.
Как отвечать
Начните с исходной точки. Нормализованная схема, обычно до третьей нормальной формы, хранит каждый факт один раз: обновлять безопасно, но отчёт собирается из множества соединений. Денормализация намеренно добавляет избыточность, чтобы чтение стало дешевле.
Приёмы, которые стоит назвать:
- дублирующее поле: имя клиента прямо в строке заказа. Хороший повод для уточнения: цена товара в заказе вообще не избыточность, а исторический факт на момент покупки;
- предрасчитанный агрегат: число комментариев у поста, сумма заказа, остаток на складе. Чтение мгновенное, зато каждое изменение обязано пересчитать итог;
- материализованное представление: результат тяжёлого запроса хранится как таблица и обновляется по расписанию, в PostgreSQL через
REFRESH MATERIALIZED VIEW; - «звезда» в DWH: таблица фактов и широкие измерения, куда справочники сплющены целиком. Для BI-инструментов это стандарт, а не исключение;
- документ или JSON-поле: связанные данные лежат вместе и читаются одним запросом.
Главное в ответе аналитика: для каждой копии указать, откуда она берётся и кто её обновляет. Варианты: триггер, код приложения в той же транзакции, ETL по расписанию. От выбора зависит, насколько данные могут отставать, и это требование нужно явно согласовать с заказчиком.
Где спотыкаются
Предлагают денормализацию до замеров. Сначала индексы и разбор плана запроса, и только если соединения действительно узкое место, дублирование.
Не описывают механизм синхронизации. В итоге имя клиента в заказах и в карточке расходится, и никто не знает, какому значению верить.
Путают денормализованную схему с плохо спроектированной. Денормализация всегда идёт от нормализованной модели и касается конкретных запросов, иначе это просто аномалии обновления.