我正在学习大学课程的SQL和DB设计。赋予我们的一项任务是创建一个具有派生属性的表格,这是一些子属性的SUM。例如:如何防止将派生值(SUM)手动更新为不正确的值
ORDERS
orderID {PK}
/orderTotal /* derived from SUM of child itemTotals */
ITEMS
itemNo {PK}
orderID {FK}
itemTotal
现在,我甚至不确定这是好的做法。从我在网上完成的一些阅读中,派生值不应该被存储,而是由用户应用程序计算。我可以理解这种观点,但在这种情况下,我的任务是存储派生值,更重要的是通过触发器保持其完整性,这对我来说是比较新的,所以我很享受使用它们。我还想象一下,在一些更复杂的情况下,保存处理时间真的值得存储派生值。以下是我已经设置的不会给我带来问题的安全措施:
插入新子项时更新父/订单总计的触发器。
删除子项目时更新parent/orderTotal的触发器。
当修改child itemTotal时更新parent/orderTotal的触发器。
但是,还有另一个我想要的保障,我无法弄清楚如何完成。由于派生了父属性/ orderTotal,因此不应手动修改它。如果有人试图手动修改它(对于实际上不是正确的SUM的错误值),我想要(a)阻止他们这样做或(b)一旦完成就将其恢复到其旧值。
哪种方法更好,哪些可能(以及如何)?我不知道如何完成前者,我试图通过触发器或约束来完成后者,但似乎都不合适。触发器方法不断给我ORA-04091错误试图改变触发表的触发器。约束方法,我不认为是合适的,因为我不知道如何在约束检查内做这样的特定事情。
我在SQL Developer中使用Oracle SQL的方式。
谢谢!
我会质疑在数据库中使用触发器来更新派生值之前,我会质疑存储派生值的适当性的适当性。为什么不让应用程序的业务逻辑直接设置该字段?这样,如果有特定地点的税收和/或运费等事情,则业务逻辑可以计算并存储正确的派生值,并将这些值考虑在内。 – aroth
@aroth:他把它描述为一个DB类的赋值,所以没有选择在哪里做。 – jmoreno