2011-04-11 255 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表中选择一个*即可。

相关问题