从ODBC到LINQ:看数据访问技术的发展
【IT168技术文档】
作为一个程序员,一直都梦想着有一天不需要再去学习新的数据访问方法。每一次数据访问方法的升级或者是新版本的数据库的推出,都需要一次新的学习、熟悉、熟练的过程。这样让程序员将本来应该编写程序逻辑的时间花在了数据库技术的研究上。其实数据库对于程序员来说,不过是一个堆放“数据”的仓库,最好能够像“多拉A梦”的口袋一样,什么都可以放得进,什么都可以取得出,而不需要用那些特别的方法来做这些事情。
数据访问发展的趋势
通用化就是数据库技术和数据访问技术一直在追求的目标。提供通用数据访问之所以如此重要有四点原因。
1、开发人员可以很容易地开发针对不同数据存储的程序而不需要对每个都很精通。
2、开发人员在不同编程语言之间切换时能有一个用于数据访问的公共框架。这使得向新语言的过渡更加容易,这一点在.NET Framework下尤其重要,因为在.NET Framework下期望开发人员可以很容易地在VB.NET和C#之间切换。
3、使得开发人员编写可部署于不同数据存储之上的程序更加简单。
4、提供了一个介于应用层和数据库通信层之间的抽象层来简化普通开发人员需要编写的代码。
当数据访问通用化之后,程序员便可以不再记忆那么多不同的数据库连接字符串,不同的数据访问类型。程序员就像拿了一把“功能较多钥匙”,不什么样的门都能打开。
数据库模型
网状数据库模型
1963年6月10日美国国防部的两个分部举行了一个题为“以计算机为中心的数据库的开发和管理”的会议,在这次会议上,创造并定义了数据库这个术语。
当时对数据库的定义为:一组文件表的集合,其中文件是数据项行的有序集合,而每个数据项由数据以及一个或多个键组成。
两年之后的1965年,CODASYL成立了一个组织,称为List Processing Task Force,这个组织后来演变为Data Base Task Group。它在1971年发布了一份重要的报告,报告概述了网络数据模型,也称之为CODASYL数据模型或DBTG数据模型。这个模型定义了数据库的几个关键概念包括如下:
1、用于定义模式的语法
2、用于定义子模式的语法
3、数据操作语言
这些概念后来被加入COBOL编程语言之中,它们同时也成为其后许多数据存储系统设计的出发点。
层次数据库模型
层次型数据库管理系统是紧随网状数据库而出现的。现实世界中很多事物是按层次组织起来的。层次数据模型的提出,首先是为了模拟这种按层次组织起来的事物。层次数据库也是按记录来存取数据的。
层次数据模型中最基本的数据关系是基本层次关系,它代表两个记录型之间一对多的关系,也叫做双亲子女关系(PCR)。数据库中有且仅有一个记录型无双亲,称为根节点。其他记录型有且仅有一个双亲。在层次模型中从一个节点到其双亲的映射是惟一的,所以对每一个记录型(除根节点外)只需要指出它的双亲,就可以表示出层次模型的整体结构。层次模型是树状的。
最著名最典型的层次数据库系统是IBM公司的IMS(Information Management System),这是IBM公司研制的最早的大型数据库系统程序产品。从60年代末产生起,如今已经发展到IMSV6,提供群集、N路数据共享、消息队列共享等先进特性的支持。这个具有30年历史的数据库产品在如今的WWW应用连接、商务智能应用中扮演着新的角色。
关系数据库模型
无论是CODASYL的网络数据模型,还是IBM的IMS,都是显著的进步因为它们标志着范型改变,那就是将数据从应用程序代码中分离出来,同时它们也布置了一个数据库应该具有的框架。但是,它们都具有令人讨厌的缺陷:需要程序员搜索数据集以寻找他们想要的数据,因此,有时也称它们为导航数据库。
1970年,IBM的英国计算机科学家Edgar Codd发布了一篇重要的论文,题目叫做“大型共享数据仓库中数据的关系模型”,文中作者介绍了关系模型。在这个模型中,Codd强调了将原始的、一般的数据与机器特有的数据类型分离的重要性,并披露了一种简单的高层次查询语言用于访问该数据。这种思想上的转变使得开发人员可以对整个数据集进行同时操作,而不再是一次一行地进行操作。
在此后的几十年里,数据库继续演化着。现代数据库比如Oracle、Microsoft SQL server、MySQL以及LDAP都受到早期那几个数据库很大的影响。随着时间的推移,它们的性能都有很大改进,可以处理很大的事务量,可以处理大量的数据,可提供高度的可伸缩性和可靠性。
通用数据访问模型
ODBC
ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access , MYSQL还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
ODBC是一个巨大的飞跃,它帮助极大地简化了数据库驱动的应用程序的开发。但是它仍然有一些不足。首先,它只能够支持关系型数据。如果你需要访问层次数据源,比如LDAP,或者半结构化数据,ODBC就无能为力了。其次,它只能处理SQL语句,而且结果只能用行和列的形式来描述。总体而言,考虑到之前的境况,ODBC是一个巨大的成功。
OLEDB
对象链接和嵌入数据库OLE-DB是数据提供程序的又一大进步,而且今天还在广泛使用这种技术。对于OLE-DB,Microsoft应用了开发ODBC 过程中学到的知识来提供一个更好的数据访问模型。OLE-DB标志了Microsoft向基于COM的API的转移这种转移,使得它很容易被大多数编程语言使用,同时也标志了向32位操作系统的迁移,Windows 95的发布标志着这一事实。
正如其他代码一样,经过几次的修订,ODBC变得臃肿不堪。OLE-DB的API则灵巧得多,它提供了比ODBC更高效的数据访问。很奇怪的是,唯一以其最初发布形式出现的就是ODBC数据提供程序。它只是ODBC提供程序的包装器,没有提供任何性能改进。关键在于要使得开发人员适应新的API,同时不影响他们访问现存的通过ODBC来访问的数据库系统。之后,可以编写更高效的数据访问程序来直接访问数据库,比如MS SQL,而不再需要通过ODBC。
OLEDB位于ODBC层与应用程序之间。在你的ASP页面里,ADO是位于OLEDB之上的应用程序。你的ADO调用先被送到OLEDB,然后再交由ODBC处理。你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升。
数据访问客户端
DAO
DAO(数据访问对象)是一种应用程序编程接口(API),存在于微软的Visual Basic中,它允许程序员请求对微软的Access数据库的访问。DAO是微软的第一个面向对象的数据库接口。DAO对象封闭了Access的Jet函数。通过Jet函数,它还可以访问其他的结构化查询语言(SQL)数据库。
DAO的最大问题在于只能跟JET引擎进行对话,而JET引擎通过与ODBC进行通信来检索数据。这种通过额外中间层的方式增加了不必要的系统开销,使得通过DAO来访问数据速度变慢。
RDO
远程数据对象RDO是Microsoft针对DAO性能低下的解决方案。访问Microsoft Access之外的数据库时,与DAO不同,RDO不使用JET引擎,而是直接与ODBC层进行通信。
从调用栈中删除JET引擎这一举措极大地改进了ODBC数据源的性能。只有在访问Microsoft Access数据库的时候才使用JET引擎。另外,RDO可以使用客户程序端游标来定位记录,而DAO则需要服务器端游标。这极大地减少了数据库服务器的负荷,不仅使得应用程序运行得更好,而且也改进了应用程序所依赖的数据库。
RDO主要面向大型商业用户,他们中的大多数因为性能问题而避免使用DAO。RDO并没有取代DAO,它们同时存在着。RDO发布后没多久,Microsoft就发布了新的通用访问API。
ADO
Microsoft引入ActiveX数据对象的主要目的是提供一种高级API与OLE-DB协同工作。在这次发布中,Microsoft吸取了过去很多教训,建立了一个更轻巧、更高效、更通用的数据访问API。与RDO不同的是,ADO最初被提议用来取代DAO和RDO。在发布之初,人们普遍认为它以及 OLE-DB是访问任何类型数据的通用解决方案:从数据库到电子邮件,从无格式文本文件到电子表格。
ADO代表了对以前数据访问方法的一种重大变革。ADO的发布主要用来辅助OLE-DB,但是ADO并不局限于仅仅与OLE-DB数据源进行通信。ADO 引入了数据提供程序模型,这个模型使得软件供应商可以相对容易地创建自己的数据提供程序,这些数据提供程序可以被ADO用来与特定供应商的数据源进行通信,可以对那种特定的数据源进行优化。与ADO一起提供的ODBC提供程序就是一个这样的例子。当开发人员连接到ODBC数据源时,ADO通过ODBC提供程序而不是OLE-DB来进行通信。更加直接地与数据源进行通信可以导致更好的性能和易于扩展的框架。
ADO.NET
ADO.NET将成为构建数据感知 .NET应用程序的基础。 不同于ADO 的是,ADO.NET更具有通用性,不是那么专门针对数据库而进行的设计。 ADO.NET聚集了所有可以进行数据处理的类。这些类呈现了具有典型数据库功能的data container objects,比如:索引,排序,浏览。尽管ADO.NET是作为重要的.NET数据库应用程序的解决方案,它更多的显示了涵盖全面的设计,而不仅是作为和ADO模型一样的以数据库为中心。
ADO .NET与ADO有很大的不同。它是一个全新的访问编程模型。当你开始使用ADO.NET时,你会发现你所掌握的任何关于ADO的技能在搭建有效的程序以及解决难题方面对你都会有很大帮助,能够帮你在解决问题上朝更灵活更稳妥的方向发展。
ADO.NET同时支持使用ODBC和OLE-DB与数据源进行通信,但它也提供了使用数据库特定的数据提供程序。这些数据提供程序提供更好的性能,因为它们可以利用针对特定数据源进行的优化。通过使用定制代码而不是通用的ODBC或OLE-DB代码,也可以避免一些系统开销。最初发布的ADO.NET含有一个SQL提供程序和一个OLE-DB提供程序,后来又引入了ODBC和Oracle的提供程序。自此以后,许多供应商也都为自己的数据库编写了提供程序。
数据访问技术具有悠久的历史,即便对于ADO.NET而言,也仍然有成长的空间。向ADO.NET 2.0的过渡不算很剧烈的转变。在极大程度上,Microsoft及其使用ADO.NET的开发人员喜欢其工作方式。在Framework 2.0中,基本的设计是相同的,但加入了几项新特性使得普通的任务变得更加容易,这一点对于向下兼容来说是非常好的。ADO.NET 2.0应该100%地向下兼容编写的所有ADO.NET 1.0的代码。
对2.0版本的产品而言,首要的设计目标基本上都是改进性能。无论怎么说,ADO.NET 1.0性能都不算差,但是有些领域还是可以改进的,包括XML串行化以及连接入池,这些都被重写以提供更好的性能。
LINQ
LINQ,全名叫 Language INtegrated Query,它在代号为“Orcas”的Visual Studio 2008中发布。待查询数据的形式可以是 XML(LINQ 到 XML)、数据库(启用 LINQ 的 ADO.NET,其中包括 LINQ 到 SQL、LINQ 到 Dataset 和 LINQ 到 Entities)和对象 (LINQ 到 Objects) 等。
LINQ正如它的名字“集成查询语言”的含义一样,它提供给程序员一个统一的编程界面。程序员不需要关心他将要操作的将是关系数据库还是XML,甚至是远程的对象,它都采用同样的查询方式。就如同通过T-SQL操纵数据库一样,不管是Oracle,SyBase还是SQL Server,他们的Select语法都是一样的。
有了LINQ,程序员便可以不再沉泥于不同的数据访问技术的学习。不管编程语言如何发展,还是数据库技术的发展,都不再需要程序员进行学习,数据存储的效率由数据库厂商进行优化,灵活的数据操作方法由数据访问中间件厂商提供,程序员只需要编写业务逻辑。
总结
数据访问技术越来越向通用化发展,有一种“万源归宗”的感觉。有了数据访问层的支持,让程序员的工作效率大大提高,数据中间件在信息管理系统提供了数据层的支持。而LINQ将数据访问的通用性发挥到了极致。
0
相关文章