设计模式 - 具有无序感知的复杂多对象版本控制

时间:2010-05-14 16:09:42

标签: design-patterns

这是交易/挑战,

我们必须跟踪信息及其线性变化。我们还必须跟踪不按顺序的变化。例如A发生了然后B发生了。过了一段时间,我们学到了实际上在B之前发生的C.随着这个挑战,我们有许多对象需要相互关联的版本。如果它是一个需要版本化的单个表/对象......没什么大不了的。但是,对于多个对象,现在我们进入更复杂的链接。并且,抛出无序事件的概念只会使事情复杂化。

签入代码时,您无法执行无序操作。发生了东西,然后你修复/改进它。但是,在某些系统中,您无法在事件发生时或以线性顺序获取所有信息。然而,即使它与您收到信息的时间线不同,您仍然需要计算真实世界的事件时间线。

层次结构的简短示例:(每个对象都必须进行版本控制)

  1. 政策
  2. 交易(现实世界变更日期)
  3. 覆盖范围(S)
  4. 地点(S)
  5. 覆盖范围(S)
  6. 车辆(S)
  7. Yada yada yada
  8. 从一个角度来看,如果我需要访问当前的策略,我应该看到现在的一切。但是,如果我需要在3周前查看作为交易的一部分而改变的内容,我必须能够看到它之前的内容......究竟是什么改变了...然后是改变后的内容。

    我已经编写了一个模式来尝试解决所有这些问题,同时还尝试仅存储已更改的信息(不会在每次更改版本时复制整个堆栈 - 我在尝试时将其视为常见做法解决这个问题)。我确实环顾网络,并且熟悉所有GoF模式以及其他一些模式。不管怎样,要么我错过了这条船而且过于复杂,要么我只是不常遇到这种情况的人之一。

    我会尽快发布我工作过的模式。首先,你的想法&智慧。如果您有任何疑问,请随时提出。谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

最终有2个主要策略来实现这一目标,核心权衡是空间或复杂性。对于空间交易,您可以复制完整的数据堆栈并对其进行版本化。为了折衷复杂性,您需要管理一个版本化的轻型键/指针系统。

为了简单起见,我们实施了空间交易。

需要5个核心密钥。主ID,LinearInstanceID,LinearPreviousID,NonLinearInstanceID和NonLinearPreviousID。

  1. ID =正如您所期望的那样,是对象类型的唯一标识符
  2. NonLinearInstanceID =第一个实例的第一个ID 随时创建
  3. LinearInstanceID =特定的第一个实例的第一个Id 线性时间表
  4. NonLinearPreviousID =它所采用的对象的ID
  5. 的地方
  6. LinearPreviousID =直接在它之前的变化的ID(即。 链表)
  7. 拼图的最后一部分是选择工作流来确定何时需要整个附加对象堆栈的新版本。通常这很容易,因为您有自然的业务级别事务。

    <强>事件

    - 所有事件:创建新的唯一主要ID

    第1版:

    1. 设置LinearInstanceId&amp; NonLinearInstanceId = ID
    2. 保留前两个id为null
    3. 新版本(正常线性):

      1. 复制对象的最新版本
      2. 确保LinearInstanceId&amp; NonLinearInstanceId保持不变 他们是
      3. 将LinearPreviousId指向
      4. 之前版本的id
      5. NonLinearPreviousId保持为空
      6. 新版本(不寻常的非线性):

        1. 获取当前最新时间轴上的所有对象并复制它们
        2. 将NonLinearPreviousId指向时间轴上的id 他们是从
        3. 复制的
        4. 将LinearInstanceId更新为新的第一个副本的ID
        5. 确保NonLinearInstanceId保持不变
        6. 插入新版本,重新链接LinearPreviousId链(链表)
        7. <强>优势

          我知道这似乎有很多联系,但这里有一些好处:

          在当前时间轴或所有时间轴上轻松导航到这些区域

          • 原始版本或当前版本
          • 上一个或下一个版本
          • 版本列表
          • 保留每个对象的所有版本(在传统的RDBMS中正常工作)
          • 可以使用简单的方法来检测版本之间的更改,因为所有版本都可以保存,并且可以轻松地来回导航

          我希望这可以帮助那些情况相同的人。如果您有任何问题/意见,请随时告诉我。如果视觉辅助有帮助,请告诉我。