《Expert MySQL》翻译——chapter2.解剖数据库系统(1)
注:第一章是讲开源软件的一些基本概念,就不翻译了,大家对开源有兴趣就足够了。
开篇
你是否曾经好奇过数据库系统里面都发生了些什么?你也可能知道一些关于关系型数据库的基础知识,而且对数据库的管理还蛮专业的,但你可能从来没有钻到数据库系统里面看看它内部的工作机制。我们之中的大多数人都有一些管理数据库的经验,但是不管在学校里还是公司里,我们都没怎么接触过数据库系统的构造。一个从事数据库工作的专业人员可能永远都不需要知道这些知识。但如果你要是了解这些构造机制,你就能够知道什么才是最佳的优化数据库的方法,以及如何最大化地使用数据库提供的功能和特性。
这一章主要讲一个关系型数据库(RDBS)都包含哪些子模块,以及他们是如何构成的。我通过解剖MySQL来解释关系型数据库的一些关键组件。如果你对这些构造比较了解,而且想直接看看MySQL的架构,那么你可以跳到下一小节。
数据库系统架构
建立并维护一个数据库以及基于该数据库开发应用或许并不需要真正了解它内部的工作机制,但是了解数据库系统是如何组织的,能够从本质上帮助你修改以及扩展它的特性和功能。同时,如果了解一些流行的数据库工作机制的基本原则,对于理解不同数据库与关系型数据库之间的比较也很有帮助。(我可没偷懒啊,这一节就这么点儿内容,其实也没啥好跳的。)
数据库系统的类型
大多数数据库专业人员都使用关系型数据库,但有一些其他类型的数据库也正在流行。接下来的小节是关于面向对象数据库,对象-关系型数据库,关系型数据库的概览。这些概览对于我们理解MySQL的架构以及常规的一些功能很重要,同时我们也会通过代码来深切体会这些概念。通过代码我才能够向你解释这里面的工作机制呀。
如果你对这些概览都比较熟悉,那么可以直接跳到“关系型数据库的架构”这个小节。
面向对象数据库
面向对象数据库是一种能够支持在面向对象开发中将数据抽象成对象,并能够直接通过这些对象来进行存储和检索数据的一种机制。它包含一个真正的面向对象的系统来将程序中的对象持久化。但是这样做的一个重大缺陷就是没有一个标准的查询语句(一些例外还是有的,但是大多数情况下它们不支持查询语句)来处理这些数据(它通过具体应用的接口来访问这些对象)。因此,从这一点上讲这并不是一个严格意义上的数据库管理系统。
面向对象数据库是关系型数据库的一种还算不错的替代,尤其是在应用层面,在建模型特别复杂,或者通过关系型数据库将数据存储为对象特别低效的时候,用这个还挺好的。这些应用需要维护一大堆不可能被删除的数据,还要管理每个数据对象修改的历史。面向对象数据库最独特的功能就是你能够通过面向对象编程(OOP)的接口来同时定义数据,以及处理这些数据的方式。
面向对象数据库尤其适合给现实世界的东西建模,你不需要因此在各实体之间引入各种奇奇怪怪的不自然的关系。面向对象的思想提供了一个全面的给真实世界建模的观点。这种观点对于处理那些捉摸不定的东西很重要,尤其是在给一个已经架构好的数据中增加面向对象的方法的时候。现在开源界有好多面向对象的数据库,但是大部分都或多或少地是基于关系型数据库的。因此它们能够支持使用查询语言查询数据,从这个角度看,它们并不是真正的面向对象的数据库。一个真正的面向对象的数据库需要通过程序的接口才能访问到数据。
面向对象数据库的使用面包括地理信息系统,科学和统计相关的数据库系统,多媒体系统,图片获取以及社交系统,和XML数据库系统。
面向对象数据库对同时拥有数据和相应处理方法的对象有最好的适应性。大多数面向对象数据库系统在设计时都考虑到了使用基于面向对象的方法来描述数据,以及建立具有很高表达能力的数据解决方案。所以面向对象数据库是一种特殊的实现,并不是为了常规的应用方案而设计的。也不像关系型数据库那样有描述-响应类(statement-response-type)的接口。
对象-关系型数据库
对象-关系型数据库是面向对象思想在关系型数据库上的应用。对象-关系型数据库提供了一种这样的机制:它能够让数据库设计者使用面向对象的数据概念来结构化数据存储,并实现检索机制。对象-关系型数据库提供了关系型模型的基础,这就意味着它在以对象为中心的思想上,扩展了关系型模型的存储和检索机制。在大多数场合下,将面向对象的概念映射到关系型概念上是一个最佳的尝试。对于关系型模型的修改和扩展包括对SQL的修改,使得它能够表达对象的类型,标识,操作集(函数或方法的集合)以及继承关系。
但是,在复杂的关系下,这些映射通常比较松散。尽管这种做法颇具表达性,这些对SQL的扩展其实并不能够真正支持对数据的面向对象操作以及面向对象级别的控制。最流行的对象-关系型数据库莫过于ESRI的ArcGIS地理信息数据库系统。其他的一些例子也包括Oracle和Informix。
对象-关系型数据库使用的技术基于关系型模型。大多数对象-关系型数据库是在现有的关系型数据库上实现的,比如说Microsoft SQL和Oracle。由于这些数据库是基于关系型数据库的,所以将面向对象的概念转换到关系型机制之间的过程就比较麻烦。下面列出来的是使用关系型数据库来支撑面向对象的应用的几个问题:
1.面向对象的概念和基于对象的数据组织并不能轻易地转换成数据表。 2.复杂的映射就需要复杂的代码和复杂的查询才能支撑。 3.复杂的程序导致了维护困难。 4.复杂的程序降低了可靠性。 5.复杂的查询难以优化,以至于效率不好。 6.将对象映射成复杂的类型使得记录修改历史变得十分脆弱,还不如关系型数据的组织。 7.通过面向对象的方法来执行 select all ... where 这样的查询非常慢,因为它需要做很多搜索工作,以及处理多个join。
(未完待续)