Bitemporal框架给富领域模型增加了时间维度
文/Srini Penchikala 译/宋玮 出处/InfoQ
跟踪时间在业务模型领域是非常常见的需求。无论是跟踪一个金融应用程序中的股票市场的历史数据,还是跟踪一个抵押贷款系统中一笔贷款的生命周期,时间数据管理都是企业应用设计的一个重要部分。
来自
ErvaCon的
Bitemporal框架是一个开源项目,它基于
时态模式(Temporal Patterns)而创建,用来解决富领域模型中的时间相关数据的需求。最近Erwin Vervaet在
SpringExperience大会上的
ppt演示对该框架进行了讨论。Bitemporal可以用来把核心领域对象及其双时态属性(例如地址、名字、社会地位等这些不会过于频繁发生变化的属性),通过对象关系映射(ORM,如
Hibernate)持久化到关系数据库(如Oracle)中。
在该ppt中,Erwin解释了在应用程序中管理时间数据的三个不同的方式:
- 无时态(Non-temporal):在系统中没有时间跟踪支持,数据只能回答关于当前情况的问题。关系数据库如Oracle或Microsoft 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 Log、
Effectivity、
Temporal Property、
Temporal Object和
Snapshot。
Bi-temporal框架中的关键接口和类有:BitemporalTrace、Bitemporal、BitemporalProperty、WrappedBitemporalProperty、BitemporalWrapper以及 TimeUtils。该框架使用了
Joda Time API来处理日期时间操作逻辑。该项目的源代码可以从他们的
Subversion库中下载。
| 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。 |