Normalization

具有最後一個訂單 ID 的客戶表 - 違反規範化?

  • March 3, 2016

所以我正在查看一個與訂單表有關係的客戶表。每當下訂單時,都會有一個觸發器來設置客戶表的 last_order_id 欄位。last_order_id 是否違反規範化規則?特別是第三範式?對於這類工作,什麼是更好的方法?

不,它不違反規範化規則,因為 NF 形式是根據僅涉及單個表的依賴規則定義的。

顯然,它在您的數據庫中創建了一種冗餘形式,因為如前所述,“最後一個訂單”可以通過查看 ORDERS 表得出,但這是傳統範式不尋求解決的一種冗餘形式. 直到 BCNF 的傳統範式僅考慮函式依賴關係,並且由於您的 customerid 可能確實會明確確定相應的 last_order (*),因此在 customers 表中包含 last_order 甚至是 NF 表單會說的唯一位置它屬於。

(*) 如果客戶可能根本沒有訂單,則此列中將沒有任何內容。在這種情況下,您可能會使用 NULL,並且有人說這本身就違反了 1NF。更傳統的正規化理論版本完全掩蓋了 NULL 情況。

編輯

我注意到我忘記回答額外的問題“對於這類工作來說,什麼是更好的方法”。IMO,至少在理論上,解決這些情況的正確方法是使用物化視圖。將計算每個客戶的 last_order 的聚合查詢定義為視圖,並讓 DBMS 保留其值的物理記錄(“物化視圖”)。這樣,設計中的冗餘就得到了控制(它現在完全由 DBMS 自己管理)。不幸的是,很少有 DBMS 能夠為涉及聚合的視圖支持這一點。在這個領域,對於給定的 DBMS,什麼是可能的,什麼是不可能的規則集是相當多樣化的並且是非常臨時的。

如果物化視圖不是一個選項,你說你已經擁有的觸發器是下一個最好的選擇。或者完全刪除冗餘,並在需要時從 ORDERS 表中重新計算 last_order,如果這在適用的性能要求/期望下可行的話。

引用自:https://dba.stackexchange.com/questions/130953