我有一個表來維護特定的業務交易,我們稱之爲LOANS
。每個記錄可以在任何給定時間具有幾個「狀態」中的一個,例如「在重新支付/開放」,「默認」,「無效」或「支付」中。如何表示當前狀態或狀態並保持數據/參照完整性? - 數據庫設計
記錄的狀態只能由於應用程序用戶採取的「事件」或行動而改變(某些事件不會導致狀態改變,例如付款會修改記錄但不會改變狀態) 。在跟蹤當前狀態的同時,我們還可以輕鬆跟蹤將事務置於此狀態的「事件」。
我看過其他數據庫的設置,使得LOANS
包含一個狀態列,並且使用一個字母(或者甚至是一個可能狀態表的外鍵)來指定當前狀態。然後EVENTS
表的列有一個FK
到LOANS
。
該解決方案有效,但我擔心這會導致數據完整性可能丟失。換句話說,沒有什麼可以阻止狀態被設置爲「默認」,沒有EVENT
來支持這種改變。它將完全留給應用程序來確保永遠不會發生(在我看來,這個解決方案沒有參照完整性)。
我的替代解決方案是取消LOANS
中的狀態列,而是使用lastEvent
列,該列是FK到EVENTS
。然後表格將保持事件的「類型」,這將反過來描述狀態變化(例如,如果lastEvent
是「付款」類型,那麼自然狀態是「付費」)。
我的問題是:
- 應我甚是關心數據的完整性(這是這樣做的,因爲它是確定做一個平常的事)?
- 是我提出的解決方案,還是有更好的解決方案?
- 我應該知道我的解決方案中是否有任何缺陷?
在它的事項的情況下,我使用MS SQL Server 2005的
有些事件不會改變狀態,這是我選擇反觀剛看到最後一個事件的一個原因(但也許我可以推斷出不改變狀態的事件需要開始的初始狀態)。另一個原因是,我想可能在lastEvent中存儲它會比每次我想要某個特定狀態的所有項目(這種類型的調用將會發生很多)時調用MAX(日期)更快。 – LittleTreeX
將更新答案以解決這些問題... –