У меня есть таблица product, sales_order и sales_order_product.
Характер продукции диктует частые изменения цены и веса.
Клиенты часто экономят заказы за несколько дней до их отправки и оплаты.
Из-за этого лага и колебаний цены / веса мы разрешаем им замерзать в цене / весе во время первоначального заказа.
Мы сохраняем сумму заказа (промежуточный итог), налог с продаж, вес заказа, а также некоторые другие вещи в таблице sales_order.
Я знаю, что не рекомендуется иметь какую-либо бизнес-логику на уровне базы данных, хотя я считаю это больше средством поддержания ссылочной целостности.
Ниже приведен один из триггеров, которые я использую для расчета вышеупомянутых данных. Я только начал проверять это и пока все хорошо. С точки зрения производительности, я не видел никаких проблем, но мое тестирование было не очень обширным.
Есть ли что-нибудь в этом триггере, которое выглядит неправильно? Я спрашиваю, потому что, хотя я использовал триггеры для таких вещей, как отметки времени, я никогда не использовал их в этом качестве (и, учитывая, что мы говорим о деньгах, я не хочу испортить что-то, что может потерять меня в моей работе).
Я понимаю, что, вероятно, не очень хорошая идея жестко кодировать ставку налога, и я, вероятно, изменю ее, когда придет время.
CREATE TRIGGER after_sales_order_product_update
AFTER UPDATE ON sales_order_product
FOR EACH ROW
BEGIN
SET @product_amount = (SELECT SUM(quantity * unit_price)
FROM sales_order_product
WHERE sales_order_id = OLD.sales_order_id),
@product_discount = (SELECT SUM(quantity * unit_discount)
FROM sales_order_product
WHERE sales_order_id = OLD.sales_order_id),
@total_weight = (SELECT SUM(quantity * unit_weight)
FROM sales_order_product
WHERE sales_order_id = OLD.sales_order_id),
@tax_amount = ROUND(@product_amount * 0.0975,2);
UPDATE sales_order
SET product_amount = @product_amount,
product_discount = @product_discount,
tax_amount = @tax_amount,
total_weight = @total_weight,
product_total = product_amount - product_discount
WHERE sales_order_id = OLD.sales_order_id;
END