对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现
面向对象编程语言里不同
类型系统的
数据之间的转换。从效果上说,它其实是创建了一个可在
编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。
简介
面向对象是从
软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从
数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
简单的说:ORM相当于中继数据。具体到产品上,例如下边的
ADO.NET Entity Framework。DLINQ中实体类的属性[Table]就算是一种中继数据。
对象数据库
对象数据库是一种以
对象形式表示信息的
数据库。对象数据库的数据库管理系统被称为ODBMS或OODBMS。
两个主要原因让用户使用对象数据库技术。首先,
关系数据库在管理复杂数据时显得笨重。其次,被应用软件操作的数据一般是用面向对象的编程语言如
C++,
Java,Delphi和
C#写成,而那些用来转化数据表示和关系数据库元组的代码很冗繁,执行时也有不少耗时。这种应用程序和数据库表示信息的模式之间的不匹配有时也被称为impedance mismatch。
发展历史
对象数据库管理系统,发端于1970年代早中期为支持对图结构对象的原生数据库管理而开展的研究。“
面向对象数据库系统”这一术语第一次出现于1985年。著名的研究项目包括Encore-Ob/Server(布朗大学),EXODUS(Wisconsin大学),IRIS(惠普),ODE(Bell实验室),ORION(MCC), Vodak(GMD-IPSI)和Zeitgeist(Texas Instruments)。其中以ORION项目发表的论文数为最多。MCC的Won Kim将这些论文中最有价值的一部分汇编成书并由MIT出版社出版。
对象数据库管理系统为面向对象编程语言增加了持久的概念。早期的商品数据库集成了多种语言:GemStone(Smalltalk)、Gbase(Lisp)和Vbase(COP)。COP即“ C Object Processor”(C对象处理器),是一种基于C的专有语言,比C++早。1990年代大部分时间里,C++统治着商用对象数据库管理系统市场。厂商在1990年代晚期加入了Java并于最近加入了C#。
对象数据库的采纳
基于持久编程的对象数据库在一些应用领域获得了认可,如工程和空间数据库,通信和科学领域如高能物理和分子生物。他们对主流的商业数据处理没有什么影响,尽管获得了一些应用在部分特殊领域如金融服务。值得指出的是:对象数据库保持着“世界上最大的数据库(超过1000Terabytes在斯坦福线性加速中心)和最高摄取率(一Terabyte每小时)”的记录。
2004年以来,当出现了易用和普遍可支付的
开放源代码对象数据库时,对象数据库进入了第二次增长期。这些开放源代码的对象数据库完全用OOP语言如Java,C++,或C#写出。ObjectDB是对象关系数据库的一个例子。
技术特性
在纯对象式数据库中,资料以对象的形式存储,这些对象只能由其所属的类中定义的方法来操作。对象被组成一种类型层次(有时是格式lattic),子类继承其超类的特性。对象中可以有到其他对象的引用,于是应用程序可以以一种导航式的编程风格访问数据。
多数对象式数据库也提供了一些查询语言,允许用
声明式编程访问对象。在对象查询语言以及查询和导航接口的集成领域,产品间出现了很大的区别。ODMG用对象查询语言OQL作了标准化的尝试。
访问数据可以更快,表的联合常常是不必要的(在关系数据库的表实现方式下)。这是因为无需查询只需通过
指针(Pointer)就可以直接获得对象。
产品间的另一点不同是数据库定义模式的方式。然而一般的特征是编程语言和数据库模式使用相同类型的定义。
多媒体应用程序将变得容易因为与数据相关的类方法保证了数据的正确解释。
许多对象数据库提供对版本的支持。一个对象可以看作是他所有版本的集合。同时,对象版本也可以被看作是对象自身的属性。一些对象数据库也提供了对触发器和约束的语义支持,这些特性是活跃数据库(active database)的基础。
优势和劣势
对ODBMS和关系DBMS的基准测试显示ODBMS在某些任务上优势明显。主要原因是许多操作使用导航式而不是声明式接口,并且对数据的导航式访问通常可以有指针高效的实现。
对基于导航数据库技术,如ODBMS的批评指出,基于指针的技术为一些特殊的搜索路径或视点(viewpoint)作了优化。而且,对一般目的的查询,基于指针的技术比关系型要慢并难于形式化。导航式显得适合于特定应用而失了普遍,未来的使用。
ODBMS的其他技术,显得缺失了与SQL世界中大量工具或特性的互操作性,包括但不限于产业标准互联性,报告工具,OLAP工具以及备份和恢复标准。另外,不像关系数据库,对象数据库缺少形式化的数学基础,而这反过来导致他们在查询支持上的弱势。不过,这一缺陷被部分弥补,因为一些ODBMS除了导航式访问外也提供了对SQL的完全支持,如Objectivity/SQL++。
事实上,在概念封装,即隐藏数据,使他只能通过公布的一些接口访问和关系数据库技术假定:数据只能由基于数据内容的查询,而不是预定义的查询路径的形式访问之间,存在着本质的张力。
数据库中心论,倾向于用声明和属性驱动的观点看世界,而面向对象倾向于从行为的观点看世界。这就是围绕着OOP和数据库的许多impedance mismatch问题之一。
尽管很多评论认为对象数据库是失败的,但主要的辩护者仍很活跃,更紧密地整合数据库的功能和对象编程语言的尝试在研究和产业社区里仍在继续。