如何编辑动态业务对象/数据?

时间:2011-10-17 13:38:00

标签: php .net java-ee versioning business-logic

我们正在开发与业务相关的大型应用程序。您可以找到类似于某些ERP,CRM等的这些应用程序。

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

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

我正在寻找一个非常通用的版本控制处理程序(非严格),如果某些业务数据属性发生变化,它甚至可以处理这些情况。这个单一的版本控制处理程序应该能够处理几乎任何类型的业务对象/数据。

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

任何想法或意见?

PS:我添加了一些编程标签,因为我希望程序员能够接受这个主题并提出他们的想法。

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

5 个答案:

答案 0 :(得分:4)

现在可能是采用purely functional懒惰数据结构的恰当时机。

简而言之,这需要禁止对象进行任何变异操作,即制作所有对象实例immutable。然后重新设计所有更改现有Object的操作,以便在旧操作上创建新的基于

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

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

Address | Object             | Created by
--------+--------------------+------------------------------------------
   1000 | list of OrderItems | empty list constructor
   1001 | Order              | Order constructor, uses address 1000
                  ...         
   1300 | OrderItem          | ...
   1501 | list of OrderItems | cons of addr 1300 to addr 1000
   1502 | Order              | replace order_items in addr 1001 by addr 1501

以这种方式存储数据的结构是持久的(Chris Okasaki在his thesis中详细阐述了这一点)。您只需按照其创建历史记录即可恢复任何版本的对象;版本化变得微不足道。请记住要点:不要改变数据,改为创建新实例。

答案 1 :(得分:1)

Hibernate Envers - 实体审核解决方案的某些内容似乎非常适合您的要求。

答案 2 :(得分:0)

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

例如,如果您被限制在数据库中,只需使用时间戳保存它并将最新的时间戳记作为当前时间戳。我会避免将其视为仅仅是数据库问题。您应该被允许在系统外部进行序列化,以获得部分结果,测试,理智等等。

答案 3 :(得分:0)

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

通常,这将针对高度敏感的实体进行,以跟踪对该特定行/帐户的更改次数。如果对所有表格都做了,那就太过分了。这些差异可以在与在线表的相同设计匹配的单独历史记录表中异步保留。

答案 4 :(得分:0)

过去我必须做类似的事情。

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

有效地,索引将成为相关对象的版本号,并且对DB的最新版本的任何查询都将使用限定符WHERE NextVersionIndex=0

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