2013-06-24 15 views
0

我即將開始爲MVC Web應用程序設計數據庫,並且正在考慮使用名爲「changes」或「events」的表來跟蹤對數據庫所做的所有更改。它將有一個表名稱,記錄ID,用戶進行更改,時間戳以及它是創建還是修改事件的字段。將表創建/修改事件記錄在單獨的表中是否可行?

我的問題是,與每個表中的'創建','創建','修改','修改'字段相比,這是否是一個糟糕的設計實踐。我在考慮在父模型類中,我會使用記錄每個變化之前的保存之前的函數。如果許多記錄一次更新,我可以看到一個陷阱,可能很難讓函數正確保存更改。

+1

回答這個問題的關鍵是「*你希望從它得到什麼?*」 – RBarryYoung

+0

如果你這樣做,你需要通過觸發器而不是通過應用程序來做到這一點,所以你捕獲所有可能的數據變化。 – HLGEM

回答

0

這是一個權衡粒度信息與每次數據庫中的某些內容發生變化並需要附加存儲時寫入此表的開銷的益處的問題。

如果您關心在模型類上使用函數,那麼另一種方法是數據庫觸發器。這將非常健壯,但是需要設置更多的工作,因爲您需要爲每個表定義觸發器,除非您正在使用的數據庫具有一般記錄DML更改的工具。

最後,我還建議考慮歸檔,因爲這張表有可能很快變大。

+0

我沒有意識到這是可能的,但使用數據庫觸發器聽起來像一個很好的方法。這會給我一個機會來拓寬我對數據庫的理解。 – aviemet

0

我認爲你的方法很好。將這些事件放在單獨的表格中的一個優點是可以捕獲多個編輯。如果您只有ModifiedDate/ModifiedBy列,則只能看到最近的編輯。

要注意的主要事情是表大小,因爲審計表可以得到非常大。您也可以決定分割成多個審計表(例如,使用與_audit後綴相同的表名)以提高查詢性能。

0

這取決於你需要什麼。創建和維護事件表的原因是維護變更的審計跟蹤。

對於某些應用程序,行尾的創建/更新字段是足夠的審計跟蹤。

對於更安全的應用程序,您需要一個事件表。您還需要在事件表中包含實際更改(之前/之後)。

0

還考慮一個時間相關的表,其中每個記錄有一個開始和結束日期,以及一個創建。任何更改實際上都會設置前一個記錄的結束日期,並創建一個新的記錄,並具有NULL結束日期。

您當前的記錄是一個空結束日期。

基本上,每個記錄都有一個使用壽命。

相關問題