【问题标题】:Versioning of domain model领域模型的版本控制
【发布时间】:2011-10-18 03:55:25
【问题描述】:

我为自己的域模型实施版本控制(在更新操作期间跟踪对象的差异)。领域模型具有树结构。例如。 (-> 是参考)

A
|-> B
|-> C -> A
    | -> C

版本控制要求如下:

  • 获取域对象的两个版本之间更改的字段集;
  • 域模型具有树形结构;
  • 可以在列表中组织字段。在以下示例中,系统应该显示 Y 元素已被删除(但不是 Z 已被删除并且 Y 在 Z 上更改了其状态)并且 X 已更改:

      [ v1 ]              [ v2 ]
        A                    A
        |-> [X, Y, Z]        |-> [X, Z]
             |-> C                |-> M
  • 不再有锁定/合并/分支等要求。

我研究了在同一对象的两种状态之间获取更改集的方法。我使用 Java 并且对现有的方法/解决方案感兴趣。例如。我正在寻找 subversion 用于创建下一个修订版的算法的描述。

我很乐意从您那里获得任何理论或实践建议。

谢谢

【问题讨论】:

    标签: java algorithm svn version-control versioning


    【解决方案1】:

    我怀疑您的域模型不是使用文本文件表示的,而是作为对象模型最有可能保存在关系数据库中。我们目前正在设计这个,并且已经制作了原型。

    我的经验教训:

    1. 您需要准确描述版本控制需要哪些功能以及不需要哪些功能。仅记录更改很容易,提供带有排他锁定的标记版本和分支很难,提供合并非常困难。
    2. 可以使用触发器在数据库级别实现日志记录。为所有域对象创建表,如果添加/编辑/删除条目,则记录完整条目。根据需要附加信息(时间...)。可能需要每个用户都以自己的数据库用户身份登录数据库,以便您可以查询 CURRENT_USER 以记录他。
    3. 您可以记录属性的修改,而不是在更改编辑之前/之后记录。但这会创建更多的日志条目,并且为特定提交收集所有更改的成本很高。
    4. 可以通过方法调用(锁定/解锁)来锁定对象。可以再次使用触发器在数据库级别检查锁定(获取 CURRENT_USER 并检查他是否锁定了对象)。这样做的好处是用户代码不必查询对象是否被锁定,但数据库将阻止插入/编辑/删除。不使用锁定将需要您实现合并。这将非常困难,因为您处理的不是文本文件而是高度结构化的数据。
    5. 将版本控制与域模型结合起来可能会非常棘手。特别是如果您要求不让版本控制泄漏到您的域模型中(如果您打算重用版本控制系统)。制作原型!

    【讨论】:

      【解决方案2】:

      好吧,我想说的是,你在这里说的是两种不同的东西。

      Subversion 对 complete 树有一个修订号,这意味着每次更改都是以前版本的廉价副本。因此,对象层次结构中的术语没有变化。它更多的是所有更改的总和 - 它们是通过您通常的差异机制按文件计算的。

      如果您需要对持久对象进行版本控制,我会在每个对象中添加一个版本属性,然后为每个类添加一个方法来计算差异。但也许您需要告诉我们您打算如何使用这些信息?

      【讨论】:

      • 添加了更具体的要求。
      • 我无法帮助您解决颠覆算法的内部问题,但我仍然认为我的方法有效,可以让您的每个班级负责检测内部更改并将其传播到根对象。对我来说,还没有明确你想对变更集做什么,只是打印出来或以某种方式处理它?
      • 是的,只需打印更改集就足够了。我有一个问题如何比较列表中的重新排序 - 似乎里面的每个元素都应该有一个 id。
      • 嗯,当然,为了识别每个实例,它需要有这样一个属性。但是关于重新排序,您也可以通过与 equals 进行比较来检查。
      • 你的意思是什么“不等于”方法?
      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 2010-12-20
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多