2011-06-29 109 views
0

使用審覈表我需要保持我的大多數實體的修改/創建信息

  • CreatedByUserId
  • ModifiedByUserId
  • CreatedDateTime
  • ModifiedDateTime

的軌道。相當標準。

您認爲最好將這些列添加到每個表......或者只需要在要審計的表上有一個CreatedAuditEntryIdModifiedAuditEntryId FK,它指向現有的用於跟蹤所有更改的單獨審計表。

AuditEntry樣子:

  • 編號
  • 用戶ID
  • 日期時間

有不得不做的明顯的性能影響,2連接,以獲得創建和修改信息...但好處是我沒有在兩個不同的地方保持狀態,這就像我設計書中的第一基本規則。

UPDATE:

只是要清楚,AuditEntry表包含了每一個修改每個表,不管。這裏的問題是,是否利用了表通過FKS創建和修改信息...或只加上面我想要的信息,每個表四列,從而避免了連接。

回答

1

我的選擇將是一個FK關係的獨立的審覈表,否則你只能看到最後一個條目,這是沒有太大的審計...

你在使用更新這些條目?如果用戶ID可以從SQL用戶隱含它可以全部在觸發器中完成。

我看在誰,什麼時候和到什麼類型的表MVC相似,要實現一個過濾器來記錄整個系統的控制器操作的東西。

編輯:鑑於更新的問題,其中很明顯的是,審計表無論如何都會被現有的,我不得不選擇鏈接到審計表。擁有不一致審計數據的想法太可怕了!除非應用程序完全被關係設計癱瘓,否則將其保持正常化!

+0

查看有關審計跟蹤的更新問題。完整的審計信息將存在,無論...我只是想知道如果連接確實沒問題。不幸的是,用戶ID不能隱含在SQL中,因此我在保存更改時在EF中處理它。 – Jeff

1

「更好」取決於你的需求是什麼。

如果您所需要的只是最後修改事件,那麼將審計列添加到表中會更好(資源方面)。一次更新只需要觸摸那一行。

如果在另一方面,你需要爲每個人觸摸歷史次審計記錄,那麼你有沒有選擇,只能有一個單獨的審計表。

+0

見關於審計線索更新的問題。謝謝。 – Jeff

+0

啊,所以它更多的是一個性能問題:「我是否使用現有的表,並且(可能是代價高昂的)連接,或者是否保留了使用原始數據去歸一化信息的副本」。 在這種情況下 - 除非遇到性能問題 - 請加入並讓數據庫擔心讓事情變得更快。 如果您總是希望審覈數據出現,我甚至會爲此創建一個視圖。某些數據庫可以更快地製作複雜的視圖(例如Oracle具有「物化視圖」)。 – mjl