Когда речь идет о денормализации данных в транзакционной базе данных для повышения производительности, существует (как минимум) три разных подхода:
принудительное обновление через хранимые процедуры, которые обновляют как нормализованные транзакционные данные, так и денормализованные данные отчетности / анализа;
Реализация триггеров на транзакционных таблицах, которые обновляют вторичные таблицы; это почти всегда маршрут, используемый при ведении истории;
Отложите обработку до ночной пакетной обработки, возможно, сделав ETL в витрине / хранилище данных.
Предположим, что для целей этого вопроса вариант № 3 нежизнеспособен, поскольку домен требует, чтобы денормализованные данные всегда были согласованы с нормализованными данными. Иерархические агрегаты, с которыми я имею дело довольно часто, являются одним из примеров этого.
Я использовал оба первых подхода достаточно справедливо, и в последнее время я склоняюсь к подходу, основанному на триггере, но мне интересно, есть ли какие-то "ошибки", которые я еще не обнаружил, и подумал, что стоило бы задать этот вопрос, поэтому у меня будут некоторые идеи, которые следует учитывать при принятии долгосрочных решений в будущем.
Итак, по вашему опыту, каковы плюсы и минусы любого из инструментов для конкретной цели сохранения денормализованных данных в реальном времени? В каких ситуациях вы бы предпочли одно другому, и почему?
(P.S. Пожалуйста, не отвечайте, например, «триггеры слишком сложны» или «все обновления всегда должны проходить через сохраненный процесс» - сделайте это соответствующим контексту вопроса.)