2011-04-11 258 views
0

我想爲ASP.NET MVC網站設置一個SQL服務器數據庫,它將同時存儲最新信息以及所有數據更改的歷史記錄。我應該如何在數據庫中設置一個表來保留記錄的歷史記錄?

我的網站信息來自用戶上傳的XML文件。該站點解析XML並將包含的信息寫入站點數據庫。連續上傳中的元素可能實際上代表相同的事物,但某些數據可能已更改。就像我之前說過的,我想跟蹤每個版本。

下表顯示了我正在考慮接近這一點的一種方式。我會爲每個上傳中的每個項目創建重複記錄。與之前上傳的項目相匹配的新項目將被分配相同的ID,但每個項目將被分配到唯一的上傳ID。

Upload 1: Erik and Sara are added 
Upload 2: Erik renamed to Eric, Bill added 
Upload 3: Sarah grew 2" taller, Eric was removed. 


[PERSONS TABLE] 
PersonID  Name Height UploadID 
1   Erik 71  1 
1   Eric 71  2 
2   Sarah 70  1 
2   Sarah 70  2 
2   Sarah 72  3 
3   Bill 76  2 
3   Bill 76  3 


[UPLOADS TABLE] 
UploadID UploadTime 
1   3/09/2011 
2   4/01/2011 
3   4/11/2011 

但是,這似乎不是我的最佳解決方案,因爲有多少信息最終在數據庫中被複制。有沒有更好的方法來處理這種情況,只有每次上傳才能保存更改?

回答

1

我認爲問題在於您的PERSONS表不再包含有關人員的信息。它還包含有關更新的信息。我要推薦的可能不會減少數據庫的大小;但它會使它更容易理解和使用。

PERSONS 
PersonID, Name, Height 
1   Eric 71 
2   Sarah 72 
3   Bill 76 

UPLOAD 
UploadID, UploadTime 
1   3/09/2011 
2   4/01/2011 
3   4/11/2011 

PERSONS_EDIT 
PersonID, UploadID,  ChangeSQL,         ChangeDescription 
1   1   "insert into PERSONS(Name, Height) VALUES('Erik', 71)" "Erik added" 
1   2   "update PERSONS set name='Eric' where Name='Erik'" "Changed Erik's name" 
....  ...    ......           .... 

我不認爲你可以在這之外做更多的事情,以使表格變得簡單或數據庫變小。正如你所看到的,你的PERSONS_EDIT表將成爲你最大的桌子。您正在使用的數據庫可能會提供自動執行此操作的機制(某種事務記錄或某事),但我從未使用過類似的東西,所以我會將它留給Stackoverflow上的其他人,以便提出任何類似的建議存在。如果PERSONS_EDIT表格變得太大,您可以查看刪除超過一週/一個月/一年的條目。什麼時候做這個決定取決於你。

進行此更改的其他一些原因,在您的第一個表中,您必須將PersonId和UploadID用作人表的主鍵。因此,要真正在您的應用程序中獲取最新版本的PERSON,您必須按照id選擇一個人,然後通過UploadId進行排序,然後選擇具有最大上傳ID的那個ID。每次您做A交易在一個人身上。

另一個好處是,你不必做一堆花哨的SQL來獲得你的編輯歷史。只需從PERSONS_EDIT表中選擇一個*即可。

相關問題