Bitemporal 框架给富领域模型增加了时间维度

  • Srini Penchikala
  • 宋玮

2008 年 1 月 18 日

话题:Java语言 & 开发

跟踪时间在业务模型领域是非常常见的需求。无论是跟踪一个金融应用程序中的股票市场的历史数据,还是跟踪一个抵押贷款系统中一笔贷款的生命周期,时间数据管理都是企业应用设计的一个重要部分。

来自ErvaConBitemporal 框架是一个开源项目,它基于时态模式(Temporal Patterns)而创建,用来解决富领域模型中的时间相关数据的需求。最近 Erwin Vervaet 在SpringExperience大会上的ppt 演示对该框架进行了讨论。Bitemporal 可以用来把核心领域对象及其双时态属性(例如地址、名字、社会地位等这些不会过于频繁发生变化的属性),通过对象关系映射(ORM,如Hibernate)持久化到关系数据库(如 Oracle)中。

在该 ppt 中,Erwin 解释了在应用程序中管理时间数据的三个不同的方式:

  • 无时态(Non-temporal):在系统中没有时间跟踪支持,数据只能回答关于当前情况的问题。关系数据库如OracleMicrosoft SQL Server是无时态的。
  • 单时态(Single-temporal):有两个变体,分别叫做实际时态(actual-temporal)和记录时态(record-temporal)。实际时态用“有效时间区间”来跟踪在实际的时间内某一事实何时是有效的。记录时态用“记录时间区间”来跟踪某一事实何时被记录到系统中。由此系统可以回答在某一特定时间点,它知道领域对象的什么信息的问题。
  • 双时态(Bi-temporal):这一设计方法组合了实际时态和记录时态这两种变更跟踪概念。它使系统可以回答在某一特定时间点,对于在另一时刻的事实,系统知道什么的问题。该设计比其它两个选项更复杂,因为系统将不得不跟踪两个时间区间。

Erwin 讨论了在领域模型中实现双时态(bi-temporality)的设计选择:使用一个时态数据库(Temporal Database)或编写自己的代码。时态数据库(Temporal Database)支持时态数据模型和时态版的 SQL。TimeDB是一个开源时态关系数据库产品。Oracle FlashBack是另一个时态数据库产品,支持记录时态特性。使用 Flashback,DBA 们可以恢复一个表或整个数据库到某一时间点(使用简单的带有 FLASHBACK 关键字的 SQL 语句)。FLASHBACK TABLE 语句从 undo 段读取表的过去的映像,并使用 flashback 查询重新构造该表的行。

关于自定义代码,给数据库增加时间信息的实现技术是在表中增加 4 个附加列(validityFrom、validityTo、recordFrom 和 recordTo 列)。谈及基于时态的系统设计,Erwin 罗列了以下几个时态变更跟踪的关键方面:

  • 同一性(Identity)
  • 不变性(Immutability )(时间属性在这样的意义下是不变的:改变值导致一个新的值被增加到属性历史中。)
  • 有效性和记录时间细节
  • 控制时间

时态模式在应用程序架构和设计中不是一个新的概念。Martin Fowler 在他的“Patterns of Enterprise Application Architecture”网站上做了详细叙述。该网站的时态模式部分包含了如Audit LogEffectivityTemporal PropertyTemporal ObjectSnapshot

Bi-temporal 框架中的关键接口和类有:BitemporalTrace、Bitemporal、BitemporalProperty、WrappedBitemporalProperty、BitemporalWrapper 以及 TimeUtils。该框架使用了Joda Time API 来处理日期时间操作逻辑。该项目的源代码可以从他们的Subversion 库中下载。

查看英文原文:Bitemporal Framework Adds Time Dimension To Rich Domain Models

Java语言 & 开发