Schema
值無法更改的數據庫的最佳實踐
假設我有一個表 Inspection,其中包含 Place 欄位(檢查發生的位置)。該欄位是 Place 表的外鍵,其中每個地點都有一個 Name 等。地名可能會隨著時間而改變(例如,地方可能是一家餐館,其所有權發生變化時名稱也會發生變化),但我們希望檢查繼續保持它在創建時賦予的原始值。
有這樣的最佳實踐嗎?一種想法是有兩個欄位,一個用於儲存外鍵,無論它是否已更新,另一個用於保存原始地名的字元串值。另一個想法是簡單地使 Places 不可變。每次更改名稱時,您都必須創建一個新地點,而不是更新現有地點。也許您甚至可以以某種方式關聯一個或多個 Places,以便您知道表中的多行實際上與同一個物理位置相關。
企業與其目前位置之間存在邏輯差異。
當您談論檢查時,儲存兩者通常是有意義的。一個地址的檢查歷史是有意義的,不管誰佔用了那個地址。企業的檢查歷史也很有意義,無論企業在哪裡運營。
引用的表格未顯示,但應該是顯而易見的。
create table inspections ( address_id integer not null references addresses (address_id), inspection_date date not null default current_date, -- Instead of business name, you could (should?) store the licensed business -- identifier, if the local government issues one. business_name varchar(35) not null default 'Unoccupied', inspector_id integer not null references inspectors (inspector_id), primary key (address_id, inspection_date) );
我可能想撤銷對該表的權限,並只允許通過儲存過程進行插入。目標是確保應用程式碼不會意外遺漏企業名稱(或許可的企業標識符,以兩者為準)。
您可能無法擁有基於企業名稱的外鍵;企業名稱不能保證隨著時間的推移是唯一的,外鍵必須引用具有唯一約束的列。(有一些方法可以解決這個問題——添加日期列和額外的、重疊的唯一約束,但這可能比它的價值更麻煩。)在任何情況下,您都不能級聯更新。作為歷史記錄,該表中的數據必須表達檢查時的事實。