域模型的版本控制

时间:2011-08-02 10:54:33

标签: java algorithm svn version-control versioning

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

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

版本控制的要求如下:

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

      [ v1 ]              [ v2 ]
        A                    A
        |-> [X, Y, Z]        |-> [X, Z]
             |-> C                |-> M
  • 没有更多要求,例如锁定/合并/分支。

我研究了在同一个对象的两个状态之间设置更改的方法。我使用Java并对存在的方法/解决方案感兴趣。例如。我正在寻找subversion用来创建下一个版本的算法的描述。

我很乐意从你这边得到任何理论或实践建议。

由于

2 个答案:

答案 0 :(得分:1)

我怀疑您的域模型没有使用文本文件表示,但作为对象模型很可能在关系数据库中持久存在。我们目前正在设计这个并且已经将其原型化了。

我的经验教训:

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

答案 1 :(得分:0)

嗯,我想说,你在这里谈到两件不同的事情。

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

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