大学の授業で SQL と DB の設計を学んでいます。私たちに与えられた課題の 1 つは、いくつかの子属性の合計である派生属性を持つテーブルを作成することです。例えば:
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を使用しています。
ありがとう!