如何存储多个版本的DB数据以进行审计/合并?

时间:2009-07-01 12:38:22

标签: sql-server asp.net-mvc

我正在使用ASP.net MVC和SQL Server,但我认为答案不会依赖于这种架构,而且我对使用其他架构的解决方案同样感兴趣。所以......

我在SQL中有一个对象(行)需要:版本化,由多人更新,批准和合并。

选项A)
对于快速而肮脏的解决方案,我正在做以下事情。它处于一个受控制的环境中,每个季度只有一个更新,并且由给定顺序中的一组有限角色完成,所以虽然这看起来非常混乱,但它实际上工作正常,我会继续使用它而没有更好的选择。

主表:

ID & Year <-- combined to form primary key (this fulfills my versioning -- I only need one per year, or one per quarter in some cases)
A handful of fields that can't be edited, like foreign keys
Value1
Value2
...

编辑表:

Edit Table ID
Main Table ID & Year
Value1 changes by Person A
Value2 changes by Person A
Value3 changes by Person A
Name of Person A
Value1 changes by Person B
Value2 changes by Person B
Value3 changes by Person B
Name of Person B
...

选项B)
现在我进入一个实例,而不是每季度更新一组,它们可能正在进行,并且可能由不同的人发起。我过去做过类似的事情:

主表:

Instance ID (Primary Key)
Main ID (this would be the primary key if there weren't potentially several instances)
Flag (edit, live, archive, delete)
Person
Value1
Value2
Value3

所以,我会有基行(实例id 1,主id 1,标志“live”)。每当有人更新时,我都会创建一个新行(实例ID 2,主要ID 1,标记“编辑”)。在某些时候,审阅者将能够看到实时数据和任何建议的更改。然后,审阅者将选择要合并的更改,并使用实时标记创建一个新行,并将所有旧的“编辑”和“实时”更改为“存档”。

所以我的问题是:

  1. 哪个选项最好?
    B似乎更好,但是它好多了吗?还有其他选择可以处理这个我没想到的吗?
  2. 如果B是要走的路,是否有任何图书馆/示例可以帮助我?
    这似乎是一个有点复杂的解决方案,有很多比较和跟踪变量。 同样,我如何最好地处理ASP.net MVC中的审查/比较。如果我有一个Models.Main,我应该添加一个名为Compare(Models.Main)的扩展方法,以便Live_Row.Compare(Edit_Row)只返回增量吗?

1 个答案:

答案 0 :(得分:0)

我无法对您的MVC问题发表评论,但选项B看起来对我来说相当明智。 对于我们的项目,我们在正在更新的表上使用触发器,该触发器将表中最有趣的值的更改记录加上用户登录名,唯一标识符和时间戳到“影子”表中进行修订/编辑日志。