За и против триггеров по сравнению с хранимыми процедурами для денормализации

Когда дело доходит до денормализовывания данных в транзакционной базе данных для производительности существует (по крайней мере) три разных подхода:

  1. Продвиньте обновления через хранимые процедуры, которые обновляют и нормализованные данные транзакций и денормализованные данные создания отчетов/анализа;

  2. Реализация включает транзакционные таблицы, которые обновляют вторичные таблицы; это - почти всегда маршрут, следуемый при поддержании историй;

  3. Задержите обработку к ночной пакетной обработке, возможно делая ETL в витрину данных / склад.

Давайте предположим в целях этого вопроса, что опция № 3 не жизнеспособна, потому что домен требует, чтобы денормализованные данные согласовывались с нормализованными данными в любом случае. Иерархические агрегаты, с которыми я имею дело скорее часто, являются одним примером этого.

Я использовал оба из первых двух подходов немного, и в последнее время я склонялся к основанному на триггере подходу, но я задаюсь вопросом, существуют ли какие-либо "глюки", которые я еще не обнаружил и думал, что стоило бы задать этот вопрос, таким образом, у меня будут некоторые идеи иметь в виду при принятии долгосрочных решений в будущем.

Так, по вашему опыту, каковы за и против любого инструмента для определенной цели поддержать денормализованные данные в реальном времени? В каких ситуациях Вы выбрали бы один по другому, и почему?

(P.S. Никакие ответы как "триггеры не являются слишком сложными", или "все обновления должны всегда проходить сохраненный proc" - делают это соответствующим контексту вопроса.)

11
задан Aaronaught 18 January 2010 в 20:17
поделиться

2 ответа

Триггеры полезны, когда вы многократные пути обновления на столе.

Мы используем хранимые пробки и имеют около 4 путей, по крайней мере, (добавить, обновить, деактивировать, копировать)

, проще работать с данными, которые мы только что вставили / обновлены в триггере, независимо от того, какое действие мы делаем или Сколько рядов мы воздействуем.

У хранящихся ProC работает только для одного пути обновления, только я чувствую: если вы не хотите повторить код ...

Теперь попробуйте / catch в триггерах означает правильное, предсказуемое обработка ошибок: триггеры на SQL Server 2000 и ранее Пакет прерваний по ошибке / отката, которая не идеальна (чтобы сказать наименее!). Итак, триггеры сейчас более надежны.

10
ответ дан 3 December 2019 в 06:21
поделиться

Возможно, также целесообразно проверить поток ошибок процесса .

-121--423085-
$random_hash = md5(uniqid(rand(), true));

Длина и уникальность 32 алфавитно-цифровых символов. Если вы хотите, чтобы он был короче, просто используйте substr ():

$random_hash = substr(md5(uniqid(rand(), true)), 16, 16); // 16 characters long

Альтернативные методы для генерации случайных данных включают:

$random_hash = md5(openssl_random_pseudo_bytes(32));
$random_hash = md5(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

// New in PHP7
$random_hash = bin2hex(random_bytes(32));
-121--1300868-

Триггеры являются автоматическими побочными эффектами и почти наверняка укусят вас вниз, когда вы хотите что-то сделать и не можете из-за побочных эффектов триггеров. Главным образом, участие системы в некоторых транзакциях XA с другими внешними системами. Триггеры делают это НЕВОЗМОЖНЫМ. Кроме того, логика Side Effect может быть активирована ТОЛЬКО при повторном запуске триггера. Если вы хотите воссоздать данные в Хранилище, вы не можете просто запустить какую-то процедуру и воссоздать ее, вы должны выполнить все действия, которые вызовут триггеры, это кошмар. ВСТАВКИ, ОБНОВЛЕНИЯ и УДАЛЕНИЯ должны быть идемпотентными и ортогональными. Триггеры без необходимости усложняют рабочие процессы, даже если вы думаете, что они упрощают их.

9
ответ дан 3 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: