在使用面向对象的编程语言编写的应用程序中,对象是其基础构建块。由于前文表述的种种原因,我们需要将领域对象的状态持久化到某种存储媒体中,以便在需要时能够重建这些对象。通常而言,是将领域对象状态(值和关联)持久化到关系数据库中。
在以关系数据库为目标的持久化中,我们会尽量:
将领域对象中的实体类与数据库中的表一一对应
将实体实例与表中的记录(行)一一对应
将实体实例属性与表中的字段(列)一一对应
将实体类的标识属性对应到表中的主键字段
但是,对象模型(O)和关系模型(R)是基于不同的理论,针对不同的目标建立的,两者之间并不能那么完美匹配。实际上,两者在很多方面存在“阻抗失配(Impedance Mismatch)”。主要体现在以下的方面。
1. 粒度问题
我们知道,在领域模型中,有些实体持有值对象,这些值对象本身可能有多个属性。有时候,值对象内部甚至还包含下一级的值对象。类的粒度从粗到细:实体-值对象-简单属性,可以有3个甚至3个以上的粒度层次。
例如在电商网站中,顾客类Customer持有配送地址shippingAddress这样一个Address类型的值对象属性。