我应该如何在数据库中设置一个表来保存记录的历史记录?

我正在尝试为ASP.NET MVC站点设置SQL Server数据库,该站点将存储最新信息以及数据所有更改的历史记录。 我网站的信息来自用户上传的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
但是,这似乎不是我的最佳解决方案,因为有多少信息最终会在数据库中重复出现。有没有更好的方法来解决这个问题,每次上传只保存更改?     
已邀请:
我认为问题是您的PERSONS表不再包含有关PERSONS的信息。它还包含有关updload的信息。我要推荐的内容可能不会减少数据库的大小;但它会让它更容易理解和使用。
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每次您都要做交易一个人。 另一个好处是你不必做一堆花哨的SQL来获取你的编辑历史。只需从PERSONS_EDIT表中选择*即可。     

要回复问题请先登录注册