我有一个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
答案 0 :(得分:0)
你的设计看起来不错;只是一些想法:
UPDATE
后触发。如果第一行INSERT
或DELETE
d之后的行?NULL
怎么样?如果任何核心字段(quantity
,unit_price
,unit_discount
,unit_weight
)可能为null,那么您将在导出的字段中显示空值,这可能是您不期望的NULL
s)。如果客户从购物车中删除了一行,sales_order
可能没有sales_order_products
吗?在这种情况下,您可能希望sales_order
值为零,这可能需要特殊编码。您可以通过做一些基于故事板/场景的测试来解决所有这些问题。