4

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

  • 用户正在查看客户
    • 姓氏是“史密斯-约翰逊
    • 2个地址(保存在不同的表中)
    • 购买了1 件产品
    • 1个员工联系人(保存在不同的表中)
    • 200 封邮件(保存在不同的表格中)
  • 用户单击“查看过去状态”按钮并选择“ 2009 年 9 月 25 日 15:00 ”,这将打开一个显示同一客户的单独视图:
    • 姓氏是“史密斯”(从那时起名字已经改变)
    • 1 个地址(此后添加了一个地址)
    • 购买了1 件产品(但与上述不同,因为他买了这个,后来退货又买了一个新的)
    • 2 名员工联系人(因为此后其中一名已被删除)
    • 10 封邮件

在思考这个问题时,一般会出现一些问题:

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

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

4

3 回答 3

2

我曾开发过与此功能类似的软件。

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

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

明显的缺点是存储,并且您必须抽象数据层的某些方面以使历史跟踪对调用它的人透明。

于 2009-11-06T14:12:50.047 回答
2

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

于 2009-11-06T14:15:15.357 回答
1

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

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

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

众多方法中的一种,但它对我们来说效果很好,我认为这对您的案例来说可能是一个好的开始。

于 2009-11-06T14:10:01.440 回答