2011-06-28 65 views
0

爲了存儲用於審計目的的審計條目,我一直在琢磨如何記錄哪些數據發生了變化。存儲審計存儲

我已經做了在過去的兩種不同的方式,但我現在建立一個新的系統,我試圖找出哪些使用方法:

  1. 有一個AuditEntry和AuditEntryChange表。每個更改的字段值都在AuditEntryChange表中,並且具有用於AuditEntry的FK。

  2. 將更改的字段和值存儲在AuditEntry表中的XML中的單個字段中。

以上哪一項對保存和查詢更有效? (包括使用XML時序列化/反序列化的影響)。哪個會佔用更少的空間?

此外,最好的做法是將GUID或int PK用於審計表?我能想到每個人的原因。

回答

1

答案取決於你打算如何查詢審覈表(一個或多個)。審計表需要考慮的事情是,在典型的情況下,記錄是隻讀的,插入的次數遠多於查詢次數。

我的偏向選項2,原因如下:

  • 插入單行比使用外鍵約束插入多行得更快。
  • 擁有一個XML字段爲審計數據的結構提供了很大的靈活性,而不必擔心數據庫模式。
  • SQL Server可以使用XPath語法查詢XML列,因此您仍然可以擁有一些關係查詢功能。
  • 選擇很多記錄,比如在表單中顯示,也更快,因爲沒有連接。
  • 這個模型可以很容易地移植沒有NoSQL存儲。
  • 只有從代碼插入或加載回代碼時纔會涉及XML序列化。您仍然可以通過SQL直接查詢XML列。
  • 我會假設空間需求會增加,儘管這取決於可能由關係模型產生的索引的大小。

至於INT VS GUID的審計表我會使用GUID,因爲去:

  • 如果使用像NHibernate的一個ORM將沒有選擇之後插入檢索生成的ID。您可以有效地批量插入。
  • 雖然guid是4倍大,對於導致10 MB差異的百萬條記錄。這真的是一個問題嗎?特別是因爲它不太可能通過審計日誌的PK進行查詢。
  • 移植到其他數據庫或存儲機制更容易。
+0

關於Guid問題的好評。謝謝。 – Jeff

1

就個人而言,爲了報告數據庫中的每個字段要容易得多。

GUID與整數取決於您將在表中擁有多少條記錄。該整數需要4個字節,而對於GUID需要16個字節。如果您希望跨服務器部署,儘管GUID更容易。

Here is a good article on the pro's versus con's.