寻找在我们的应用程序中实现版本控制功能的建议

时间:2009-11-06 14:03:14

标签: .net design-patterns sql-server-2008 architecture application-design

我正在开始为我们的软件(.NET 3.5 / SQL Server 2008)创建“对象版本控制”功能的项目,基本上它需要这样做:

  • 用户正在查看客户
    • 姓氏是“ Smith-Johnson
    • 2个地址(保存在不同的表格中)
    • 1个产品已购买
    • 1名员工联系(保存在不同的表格中)
    • 200封邮件(保存在不同的表格中)
  • 用户点击“查看过去状态”按钮,然后选择“ 2009年9月25日15:00 ”,这会显示一个显示同一客户的单独视图:
    • 姓氏是“史密斯”(自那时起名称已更改)
    • 1个地址(此后又添加了地址)
    • 1个产品已购买(但不同以上,因为他买了这个,之后退回并购买了新产品)
    • 2名员工联系人(因为从那时起已被删除)
    • 10封邮件

一般来说,在考虑问题时会出现一些问题:

  • 应记录更改的级别,例如:在数据库 级别(记录每个表的每个属性的每个更改)或对象级别(序列化并存储每个对象及其依赖关系后更改后)
  • 如何处理表格 的变化,例如如果列“LastName”更改为“Surname”,则如何跟踪列中的数据,因为它们都属于同一列(因此版本控制服务不报告“此客户在9月25日没有姓氏”,而是知道要查看姓氏。
  • .NET / SQL Server 2008区域中存在哪些支持技术可能支持此功能,例如:我正在研究SQL Server 2008的Change Tracking功能
  • 版本控制存在哪种模式,例如我正在考虑命令模式,它可用于在应用程序中创建撤消功能。
  • 此版本服务需要执行回滚。它只需要能够显示对象的状态依赖它。

您在软件中实施版本控制功能的经验是什么?你有什么建议?

3 个答案:

答案 0 :(得分:2)

我从事过具有类似功能的软件。

不是在数据库中更新数据,而是将每个更改作为新记录插入。数据库中的每一行都有一个开始和结束日期。

最新记录是没有结束日期的记录。从那里,您可以通过搜索当时处于活动状态的记录来查询任何给定日期的数据状态。

显而易见的缺点是存储,以及您必须抽象数据层的某些方面,以使历史跟踪对任何调用它的人都是透明的。

答案 1 :(得分:2)

Martin Fowler在开发下一版企业应用程序架构模式时记录了一些有趣的模式,您可能会感兴趣:

答案 2 :(得分:1)

几年前,我设计了一个版本对象系统,以便在不同环境(Dev,Staging,QA,Production)中的数据库之间复制它们

我当时使用手动AOP方法。 Spring.NET或其他支持AOP的IoC框架今天会更好。对对象属性的每个修改都存储为集中式数据库中的更改。每个更改都有一个版本号。我们使用Change(s)记录对一个数据库中的对象采取的操作,并在目标中重放它们,有效地复制更改。

如果您正在使用ORM,那么您应该能够更改数据库中的列名,而不必担心如果您使用此类解决方案的属性名称。如果您确实更改了属性名称,则可以使用新名称更新更改记录。

许多人采用了一种方法,但它对我们来说效果很好,我认为这对你的案子来说可能是一个好的开始。