Я хочу спросить ваше мнение об использовании MySQL триггеров или транзакций на веб-сайте.
На самом деле у меня есть payment
таблица истории с - UserId | OperationId | Comment | Credits | Sign (debit or credit)
. Таким образом, каждая платежная операция вставлена в эту таблицу.
Однако это будет занимать много времени, вычисляя каждый раз общую сумму кредита пользователя каждый раз, когда он выполняет действие. Поэтому я подумал, что, возможно, это хорошая идея, чтобы сохранить общую сумму кредита для каждого пользователя в пользовательской profile
таблице.
Здесь проблема. Как я могу быть уверен, что общая сумма кредита из profile
таблицы будет синхронизирована с операциями из payment
таблицы истории?
Я думал, используя 2 метода:
- MySQL триггеры или
- транзакции, закодированные в исходном коде
Что является более надежным? Что если у меня большая база данных (более 100 000 пользователей)?
Есть ли у вас какие-либо предложения для этого?
Движок BD MySQL - это InnoDB.
источник
Хороший ответ от Роландо.
Кроме того - триггеры не должны использоваться для логики, потому что пара взаимосвязанных триггеров позже, вещи быстро запутаются. Хороший набор инструкций в хранимой процедуре или в процедуре на стороне клиента может более четко донести бизнес-логику, чем набор скрытой логики в базе данных. Существуют также ограничения на триггеры в отношении таблицы, из которой они запускаются - так что вы можете разделить свою логику в двух разных местах.
Кроме того, вы можете найти способы оптимизировать, в какой момент эти вычисления происходят на вашем сервере бизнес-логики, тогда как триггер будет срабатывать каждый раз. Вы обнаружите, что выключаете триггер, обновляете таблицу, а затем снова активируете триггер - что также означает, что вам нужно поместить логику триггера в этот код.
Кроме того - вам не нужно иметь всю логику в части бизнес-логики кода - вам может потребоваться обеспечить целостность таблицы с помощью хранимых процедур. Это может запустить транзакцию, выполнить несколько обновлений и заставить все откатиться, если что-то не получится. Таким образом, кто-то, глядя на базу данных, может видеть логику для вставки заказа, например. В современном мире это менее важно, поскольку веб-службы могут быть единственным интерфейсом доступа к БД; но в случае, когда несколько исполняемых файлов имеют доступ к БД, это может быть огромным.
Кроме того - у вас все равно будут транзакции - вы не будете выполнять свои триггеры без одного ... верно? Так что полезно знать, как начать транзакцию; сделать что-нибудь; а затем завершить транзакцию. Если вы увидите этот шаблон в своем коде, еще один фрагмент кода, который его использует, будет облегчать когнитивную нагрузку. Триггер, если вы помните, что он есть, заставит вас думать иначе для тех транзакций, на которые влияет триггер, особенно если задействованы другие таблицы, которые также могут иметь триггеры.
По сути, между регулярно запланированным заданием cron (или заданием агента базы данных) и хорошими хранимыми процедурами вы можете выполнить 99% того, что вам нужно. 1%; переосмыслить проект.
источник