【问题标题】:How should I setup a table in a database to keep the history of records?我应该如何在数据库中设置一个表来保存记录的历史?
【发布时间】:2011-04-11 19:37:29
【问题描述】:

我正在尝试为 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

但是,这对我来说似乎不是最佳解决方案,因为有多少信息最终会在数据库中重复。有没有更好的方法来解决这个问题,每次上传时只保存更改?

【问题讨论】:

    标签: history relational-database database-design


    【解决方案1】:

    我认为问题在于您的 PERSONS 表不再仅包含有关 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 的人一个人的交易。

    另一个好处是您不必执行一堆花哨的 sql 来获取您的编辑历史记录。只需从 PERSONS_EDIT 表中选择 *。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2015-04-10
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多