跟踪时间在业务模型领域是非常常见的需求。无论是跟踪一个金融应用程序中的股票市场的历史数据,还是跟踪一个抵押贷款系统中一笔贷款的生命周期,时间数据管理都是企业应用设计的一个重要部分。
来自 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 库中下载。
查看英文原文: Bitemporal Framework Adds Time Dimension To Rich Domain Models
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论