面向 Java 开发人员的 db4o 指南: 简介和概览
2010-04-01 00:00:00 来源:WEB开发网对象和关系
对象关系型阻抗失配 这个话题完全可以拿出来进行学术讨论,但简单说来,其本质是:对象系统与关系系统在如何处理实体之间的互动方面所采取的方式是截然不同的。表面上看,对象系统和关系系统彼此非常合适,但若深入研究,就会发现二者存在本质差异。
首先,对象具有身份的隐式性质(其表征是隐藏/隐式的 this 指针或引用,它实际上是内存的一个位置),而关系则具有身份的显式性质(其表征是组成关系属性的主键)。其次,关系数据库通过隐藏数据库范围内的数据查询和其他操作的实现进行封装,而对象则在每个对象上实现新的行为(当然,模块所实现的继承都在类定义中进行指定)。另外,可能也是最有趣的是,关系模型是个封闭的模型,其中任何操作的结果都将产生一个元组集,适合作为另一个操作的输入。这就使嵌套的 SELECT 以及很多其他功能成为可能。而对象模型则无此能力,尤其是向调用程序返回 “部分对象” 这一点。对象是要么全有要么全无的,其结果就是:与 RDBMS 不同,OODBMS 不能从表或一组表返回任一、全部或部分列。
简言之,对象(用像 Java 代码、C++ 和 C# 这类语言实现)和关系(由像 SQLServer、Oracle 和 DB/2 这样的现代 RDBMS 实现)操作的方式有极大的差异。对于减少这种差异,程序员责无旁贷。
映射的作用
过去,开发人员曾试图减少对象和关系间的这种差距,尝试过的方式之一是手动映射,比如通过 JDBC 编写 SQL 语句并将结果收集进字段。对这种方式的一个合理的质疑是:是否还有更简化的方法来进行处理。开发人员大都用自动的对象关系映射实用工具或库(比如 Hibernate)来解决这个问题。
即使是通过 Hibernate(或 JPA、JDO、Castor JDO、Toplink 或任何可用的其他 ORM 工具),映射问题也无法彻底解决,它们只会转移到配置文件。而且,这种方式与要解决的问题颇有些风马牛不相及。比方说,如果您想要创建一个分层良好的继承模型,将它映射到表或一组表无疑是失败之举。若用对常规形式的违背来换取查询的性能,就会将 DBA 与开发人员在某种程度上对立起来。
更多精彩
赞助商链接