我正在为大学课程学习 SQL 和 DB 设计。给我们的一项任务是创建一个具有派生属性的表,该派生属性是一些子属性的总和。例如:
ORDERS
orderID {PK}
/orderTotal /* derived from SUM of child itemTotals */
ITEMS
itemNo {PK}
orderID {FK}
itemTotal
现在,我什至不确定这是一个好习惯。从我在网上阅读的一些内容来看,派生值不应存储,而应由用户应用程序计算。我可以理解这种观点,但在这种情况下,我的任务是存储派生值,更重要的是通过触发器保持它们的完整性,这对我来说相对较新,所以我喜欢使用它们。我还想象在一些更复杂的情况下,存储派生值确实值得节省处理时间。以下是我采取的没有给我带来问题的保障措施:
插入新子项时更新父项 /orderTotal 的触发器。
删除子项时更新父项 /orderTotal 的触发器。
当子 itemTotal 被修改时更新父 /orderTotal 的触发器。
但是,我想要另一种保障措施,但我不知道如何完成。由于父属性 /orderTotal 是派生的,因此永远不应手动修改它。如果有人确实尝试手动修改它(到一个实际上不是正确 SUM 的错误值),我想(a)阻止他们这样做或(b)一旦他们完成就将其恢复为旧值.
哪种方法更好,哪种方法可行(以及如何)?我不确定如何完成前者,我试图通过触发器或约束来完成后者,但似乎都不合适。触发器方法不断给我 ORA-04091 错误,因为我试图改变触发触发器的表。我认为约束方法也不合适,因为我不确定如何在约束检查中做这样的特定事情。
顺便说一句,我在 SQL Developer 中使用 Oracle SQL。
谢谢!