我會對待從儘可能多的實際域信息分開審覈信息
要求#1: 我想你會創建額外的審計表以記錄更改 埃裏克的建議是一個很好的一個,創建一個使用的審計信息觸發器在SQL數據庫中,這樣你的應用程序就不需要知道審計邏輯了,
如果您的數據庫不支持觸發器,那麼您可能正在使用某種持久性或數據庫層。這也是一個放置這種邏輯的好地方,同樣可以最小化正常的應用程序代碼和審計代碼之間的依賴關係。
要求#2: 至於顯示的指標:我不會在表中存儲實際的布爾字段。 (這將導致依賴的種種你正常應用程序代碼,您審計跟蹤代碼之間存在。)
我會盡量讓負責顯示窗體的代碼也負責顯示在審計數據現場級別。這會導致查詢開銷,但這是顯示這一額外信息層的成本。也許你可以通過向審計信息中添加元數據來使數據庫開銷最小化,以便於檢索。
一些大Enterprisy應用程序,我維持大致使用如下結構:
字段:
changeId, changeTable, changedPrimaryKey, userName, dateTime
- 對應於該被改變的字段的改變字段的表。
領域:
changeId, changeField, oldValue, NewValue
示例內容:
更改標題:
'1', 'BooksTable', '1852860138', 'AdamsD', '2009-07-01 15:30'
更改項目:
'1', 'Title', 'The Hitchhiker's Guide to the Gaxaly', 'The Hitchhiker's Guide to the Galaxy'
'1', 'Author', 'Duglas Adasm', 'Douglas Adams'
這種結構既可以方便查看審計線索,又可以輕鬆檢索以顯示所需的指標。一個查詢(Header和Items表中的內部連接)足以檢索所有信息以單一形式顯示。 (甚至當你的顯示標識的列表的表)
爲了便於檢索哪些字段被更改,也許我可以創建一個觸發器,它在創建時在主表中和單獨的「原始」表中存儲初始記錄?然後爲了顯示,我可以從兩個表('main'和'originals')中檢索記錄並在代碼中比較它們以標記相應的字段? – Kirsehn 2009-07-07 22:10:33
這是可能的,但是然後對於要存儲的每個事物你都會有兩個表格,而且只有在創建記錄後才能看到許多字段已更改。 我的答案中提到的解決方案允許您創建詳細的審計跟蹤,以顯示哪些字段隨時間發生了變化以及這些字段具有的值。換句話說,你建立了一個歷史。此外,您不必爲所有內容創建兩張表,只需要「主」表和您的審計線索標題和項目表 – dwergkees 2009-07-08 22:20:58