本节书摘来自异步社区出版社《MySQL高效编程》一书中的第1章,第1.2节,作者: 王志刚 , 江友华,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 数据库的种类
MySQL高效编程
通过上述的介绍,我想读者应该对数据库有了一个大致的认识了。数据库从数据的保存方式以及构造上可以分以下几种类型。
1.2.1 阶层型/网络型数据库
首先介绍在大型机系统(使用于银行、证券等行业的大型系统)中经常使用的阶层型数据库及网络型数据库。
阶层型数据库顾名思义,就是将数据以树型结构保存的数据库。对特定的数据来说拥有多个子数据,而子数据库不可能拥有多个父数据。因为这种数据库保证对任意数据唯一的连接路径,能够以简洁的代码实现数据的读取,是这种数据库的最大优点。
但是相反,如果父子数据的关系不总是[1:n]时,就会出现无用数据大量增多的现象。再看一下图1-2中左侧的企业内组织图,就会很容易明白上述问题所在。在组织图中,不能保证一个员工只属于一个部门(也就是会出现一个员工兼任几个职位的情况)。这样同一个员工会在组织图的多个节点出现,这就是所谓的无用数据,在专业上称为数据冗余。
为解决这个问题,出现了网络型数据库。在网络型数据库中,不仅父数据有多个子数据,子数据也会有多个父数据,这样阶层型数据库中的冗余问题就不存在了。
但是,这样的网络型数据库也有几个缺点。用户在连接数据库并使用数据库中的数据之前,必须要了解数据库中数据的结构。也就是说,在创建应用程序时,必须严格按照数据的结构来进行代码的编写。当然,数据结构发生变化时,对应的应用程序也必须修改。
1.2.2 卡片型数据库
卡片型数据库就是将一条数据作为一枚卡片来处理的数据库。但是,卡片型数据库与其他的如网络型数据库或关系数据库不同之处在于,它不是一个反映数据的概念分类(也就是说数据并不是真的以“卡片”形式存在的),而仅仅是拥有“数据看起来像卡片”的界面,或者说以卡片的形式来呈现数据,是从数据显示形式来命名的,如图1-3所示。
例如,像Excel或Access这样的产品,数据可以以表单(Form,表单是一个包含一个或多个数据元素的区域)的形式呈现,如图1-4所示,从这个意义上讲也可以称为卡片型数据库,但是,现在以表单的形式呈现数据的功能在很多应用软件中都实现了,所以,以外观特征来分类数据库就显得不太准确了,卡片型数据库这种分类现在已很少使用了。
1.2.3 关系型数据库
现在,只要是提到数据库,一般都会指的是关系型数据库(Relational Database,RDB)。对于RDB来说,关联的一系列数据以表的形式保存,就如由Excel那样的软件创建的二元表格的形式,表内的各个数据项目被称为域(field)或列(column),一组数据被称为记录(record),如图1-5所示。在RDB中,数据库就是表以及操作数据库用的对象集合体,而表是记录/域的集合体。
另外,在RDB中,标识表内记录唯一性的域或域群被称为主键,与主键关联用的外部表中的参照键被称为外键。如上述定义所示,主键在所在的表中必须保持唯一性,而外键的域中必须保存与主键相符的数据。主键和外键的关系就是此类数据库被称为关系型数据库的原因所在。
下面结合一个实际的例子来进一步理解关系型数据库。如图1-6所示,首先请注意在订单表中有用户ID这样一个项目,光看那些以字母数字形式出现的用户ID是不能知道任何信息的,这里用户ID是订单表的外键,再查看以用户ID作为主键的客户信息表,你就可以查看出这些字母数据所代表的具体客户信息了。
同属订单信息的订单详细表也是如此,光看订单详细表中的订单ID以及产品ID那些生硬的字母是了解不到什么具体信息的,只有通过外键连接,查看产品表与订单详细表,你才可以了解到进一步的具体信息。
上述就是关系型数据库的最大特征,信息并不是放在一个表中,而是为了将冗余数据尽量减少,将数据放在不同的表,这些表通过“关系”(主键和外键)联系在一起。表之间通过不同的组合,可以在用户的面前呈现不同的形式。
表1-1列出了目前比较专业的几种关系型数据库产品。对于关系型数据库产品来讲,大家肯定知道有些是公开源码的免费产品,有些是商用的大型数据库产品,有些是以企业应用为主的产品,也有些是以个人应用为前提的产品。产品可选择的范围比较广,也可以说是关系型数据库的一个特征。
1.2.4 面向对象型数据库
虽然关系型数据库普及率这么高,但它们也存在着一些问题。目前在构建应用程序时普遍采用Java、C++、C#等面向对象语言,这里我们首先应该意识到表形式的数据是与对象不同的。面向对象语言与RDB结合时,首先要面对就是这个数据构造问题。应用程序开发人员首先要从RDB中取出表形式的数据,然后将其转换为对象形式的数据,通常称为匹配(mapping)。这个匹配的过程看似单纯,但是造成开发过程繁琐、生产效率低下的原因之一。这个RDB与对象间的鸿沟(gap)被称为阻抗(impedance mismatch),图1-7所示说明了什么是阻抗。
作为解决阻抗的方法,尽管有如O/R(Object/Relational Mapping,就是使对象与表之间的变换自动化的技术)匹配这样的技术,随着类似“如果本来就没有匹配这个过程,就没有变换”这样的想法出现,面向对象型数据库(OODB,Object Oriented DataBase)技术应运而生。
面向对象型数据库,顾名思义在数据库中直接以对象的形式保存数据。对面向对象型数据库来说,因为从数据库中取得的数据就是能直接在应用程序中使用的对象,所以编写代码将变得简单。另外,彻底省略了数据变换这个步骤,所以也改善了处理速度。
OODB中代表性的产品有Cache(http://www.intersystems.com/cache)与ObjectStore(http://web.progress.com/en/objectstore/)。
1.2.5 XML型数据库
现在,在Internet上进行数据交换时,经常使用XML(eXtensible Markup Language)。在发布最新博客等信息时使用的RSS(RDF Site Summary),就是一种以XML为基础的技术。另外,在微软公司的Office 2007中已经支持以XML形式保存文件了。可以说现在使用XML格式的文档已经很常见了。
以XML的形式保存数据的数据库,就被称为XML型数据库(下面称之为NXDB,Native XML DataBase,直译为自然的XML数据库)。NXDB有个基本优点就是不用区分数据交换形式与数据保存形式了,当然它并不只有这些优点。
在关系型数据库中,保存具体数据前,首先必须对保存数据用的表进行严格的设计(后面的章节将会详细介绍具体的设计方法)。总之,数据项目以及数据类型必须事先决定下来,而且当数据结构改变时,首先要修改表的设计。
但是,对于NXDB来说,不用进行这样的表设计。什么样的数据都能保存进去,这就是使用NXDB好处。没有严密的用于放置数据的类似抽屉样的东西。当结构发生改变时,修改起来很方便,只是在既有的数据中添加“新枝”,即添上新项目就行了,如图1-8所示。
NXDB中代表性的产品有NeoCoreXMS(http://www.cybertech-cebu.com/product/neocore/)、CyberLuxeon(http://www.cybertech-cebu.com/product/luxeon/)、EsTerra XML Storage Server(http://www.mediafusion.co.jp/ )。
另外,目前在SQL Server、Oracle、DB2等主要的关系型数据库产品中也纷纷追加了对XML的支持。数据大部分以表的形式保存,如果其中一部分数据想以XML的形式保存时,采用这些支持XML的数据库产品,就能更方便地将数据导入XML文件了。