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