如何对动态业务对象/数据进行版本化


How to version dynamic business Objects/Data?

我们正在开发一个与商业相关的大型应用程序。你可以发现这些应用程序类似于一些ERP、CRM等。

现在我们有一个要求,我们需要用户输入的所有数据进行版本控制。

例如:在某个时间点,用户需要查看特定采购订单的更改历史记录是什么?

我正在寻找一个非常通用的版本控制处理程序(不严格),它可以处理即使情况下,如果一些一些业务数据属性得到改变。这个版本控制处理程序应该能够处理几乎任何类型的业务对象/数据。

处理这些问题最好的编程/数据库设计是什么?

有什么想法或意见吗?

PS:我已经添加了一些编程标签,因为我想让程序员娱乐这个线程并给出他们的想法。

编辑:我正在寻找一种非常优化的方式,有点类似于有不同的存在物,而不是以序列化/转储的方式存储对象。

现在可能正是采用纯函数式惰性数据结构的好时机。

简而言之,这要求禁止对对象进行任何变异操作,即使所有对象实例不可变。然后重新设计所有改变现有对象的操作,在旧对象的基础上创建新的对象实例

例如,让您有一个Order实例,其中包含OrderItem的列表,您需要将特定的OrderItem添加到该列表中。在这种情况下,您所做的是通过用新列表替换其项目列表来创建Order的新实例,而新列表又通过cons将新的OrderItem添加到旧列表中来创建。

让我用图片进一步说明这个例子。想象存储对象的(让它是RAM或关系数据库,任何东西):

<>之前地址|对象|由--------+--------------------+------------------------------------------1000 | OrderItems的列表|空列表构造函数1001 | Order | Order构造函数,使用地址1000…1300 | OrderItem |…从地址1300到地址1000的列表1502 | Order |将地址1001中的order_items替换为地址1501之前

以这种方式存储数据的结构是持久的(例如,Chris Okasaki在他的论文中详细阐述了这一点)。只要遵循对象的创建历史,就可以恢复对象的任何版本;版本控制变得微不足道。只要记住要点:不要改变数据,而是创建新的实例。

类似Hibernate Envers(一个实体审计解决方案)的东西似乎很适合您的需求。

如果您不进行侵入性操作(我认为通用与侵入性相竞争),那么我认为您的选择是进行完全序列化。在每个版本中,您只需获取对象的快照并将其序列化为适当的内容。

例如,如果您仅限于数据库,只需将其保存为时间戳,并将最近的时间戳作为当前时间戳。不过,我会避免将其视为单独的数据库问题。应该允许您在系统之外序列化部分结果、测试、完整性等。

基本上,您应该能够比较现有对象和新对象的字段并保存差异。

通常,这将用于高度敏感的实体,以跟踪对特定行/帐户的更改数量。如果对所有的桌子都这样做,那就太过分了。这些差异可以在与在线表的相同设计相匹配的单独历史表中异步持久化。

我过去也做过类似的事情。

我发现,如果从头开始,最简单的方法是在对象数据表中添加一个额外的列,用于保存替换对象的索引。如果保存的值为零,那么我就知道这是最新版本。这也意味着对象永远不会被删除,尽管我后来添加了允许删除过去历史记录的功能。

索引实际上成为该对象的版本号,并且任何对DB的最新版本查询都将使用限定符WHERE NextVersionIndex=0

如果不是从头开始,这可以通过添加额外的表来存储这些值来实现到一个实时系统中-对象索引,上一个版本索引,下一个版本索引。