弥合对象/关系之间的鸿沟(三)
阻抗不匹配?
所谓的对象和数据库模式(schema)之间的阻抗不匹配产生了很多讨论,这当然有很好的理由。根据斯科特·安布勒3所说的,这两种技术之间具有“欺骗性的相似之处”。对这两种技术之间的差异缺乏了解可能会导致选择糟糕的设计并导致项目失败。
在对象语言中(如Java)数据模型并不是完全与关系型数据库中的相同,所以必须特别小心防止出现问题。例如,字符列的最大长度必须在关系模式中指定,然而Java字符串的最大长度基本上是无限的。
浮点数也可能会导致问题。Java实现了IEEE浮点数;但不同的关系型数据库往往有不同的表示。结果导致,并非所有Java中的浮点数值可以存储在数据库中,反之亦然。
甚至固定精度的十进制数映射到关系模式时,也可能会造成问题。Java支持的固定精度的十进制数是自描述的,也就是说,每个值都有自己特定的精度(数字总位数)和标度(小数点右边的数字位数)。然而,在数据库中,同一列中的所有数字具有相同的精度和标度。
应用程序领域类和数据库模式并不是同结构的,它们的映射是通过设计完成的。领域模型方面,对象模型的某些方面不映射到数据库中,包括类的行为和类的变量。在关系型数据库方面,并不是数据库中每个模式的所有表和列在领域模型中都有所表示,存储过程也一样。此外,领域模型可能有数种合法的映射。
用一个领域对象模型表示一个数据库模式通常很简单直观,如果此模式(schema)被很好的规范化时,更是特别如此。在实体-关系模型的模式(schema)中,每一个实体映射到一个领域类。每一个简单的关系被实现为一个模式中的外键,关系的一方被映射一个引用类型的字段,另一方被映射为一个多值类型的字段。
实体-关系模型中的许多复杂的结构,可以很好地映射到对象-模型结构。例如,一个的连接表(它的两个列是指向两个不同表的外键)可以映射到两个类,其中每个类都包含一个字段,每个字段的类型都是另一个类的对象集合。
另一方面,在关系型数据库中存储任意一个领域对象模型也可能是具有挑战性的。使用抽象类、深继承或接口表示模型之间关系的情况下,通常存储和检索的性能很差。
下一篇