Oracle
oracle中的多表約束
一個, 列的表 和
boxes
一個capacity
列 和 的表,並且您想要強制約束不能將一個項目放入容量小於該項目的盒子中。items``box``size
AFAIK 在 oracle 中,這可以通過物化視圖或觸發器來完成。哪個會表現得更好,還有其他理由使用一個而不是另一個?
物化視圖需要額外的儲存空間,因為它是一個表格。
您想讓您的物化視圖在送出時刷新(以便立即檢查)并快速刷新,因為完全刷新可能需要很長時間才能等待。
假設可以將多個項目放在一個盒子中,則需要考慮項目大小的總和(聚合),因此:
物化視圖需要源表上的物化視圖日誌(也是表,更多額外儲存 + 管理)以實現快速刷新。
維護額外的表也意味著生成更多的重做和撤消。
物化視圖提供了比您需要的更多的功能,而您永遠不會使用這些功能。
觸發器將對您的 DML 操作(插入/更新/刪除項目的聚合大小)執行什麼操作,物化視圖刷新也會執行。
當您刪除一個項目時,物化視圖需要刷新,但您甚至不需要在刪除時執行觸發器。
當你更新一個item時,物化視圖需要刷新,但是你可以跳過觸發器中的聚合 if
:new.box_id = :old.box_id and :new.size <= :old.size
。或者更好的是,您可以在記憶體中記憶體框的大小(結果記憶體)並在觸發器中訪問它們,而無需執行任何實際的 SQL 聚合。
是的,上面的一些看起來微不足道,而且它們通常是,差異可能不明顯。但是對於這樣的案例,觸發器可以具有與結合檢查約束的物化視圖相同的效果,但儲存/管理成本和要求更低,所以我會選擇觸發器。