数据库管理已经从一种专门的计算机应用发展为现代计算环境中的一个重要成分,因此,有关数据库系统的知识已成为计算机科学教育中的一个核心的部分。在本书中,我们讲述数据库管理的基本概念。这些概念包括数据库设计、数据库语言、数据库系统实现等多个方面。
本书可作为本科生三年级或四年级数据库入门课程的教科书,也可作为研究生一年级的教科书。除了作为入门课程的基本内容外,本书还包括了可作为课程补充或作为高级课程介绍性材料的高级内容。
我们仅要求读者熟悉基本的数据结构、计算机组织结构和一种高级程序设计语言,例如
Java、C或Pascal。书中的概念都以直观的方式加以描述,其中的许多概念都基于我们大学运行的例子加以阐释。本书中包括重要的理论结果,但省略了形式化证明,取而代之的是用图表和例子来说明为什么结论是正确的。对于形式化描述和研究结果的证明,读者可以参考文献注解中列出的研究论文和高级教材。
计算机书籍中所包括的基本概念和算法通常是基于当今的商品化或试验性的数据库系统中采用的概念和算法。我们的目标是在一个通常环境下描述这些概念和算法,而没有与某个特定的数据库系统绑定。特定的数据库系统的细节将在第九部分“实例研究”中讨论。
在本书第6版中,我们保持了前面版本的总体风格,同时对内容和结构进行了扩展来反映数据库设计、管理和使用的方式所发生的变化。我们还考虑了数据库概念的教学方面的趋势,并在适当的地方做出了推动这种趋势的修改。
本书的组织
本书组织成十个主要部分:
综述(第1章)。第1章对数据库系统的性质和目标进行了一般性综述。
计算机书籍我们解释了数据库系统的概念是如何发展的,各数据库系统的共同特性是什么,数据库系统能为用户做什么,以及数据库系统如何与操作系统交互。我们还引入了一个数据库应用的例子:包括多个系、教员、学生和课程的一个大学机构。这个应用作为贯穿全书的运行实例。这一章本质上是诱导性、历史性和解释性的。
第一部分:关系数据库(第2章至第6章)。第2章介绍了数据的关系模型,包括基本概念,诸如关系数据库的结构、数据库模式、码、模式图、关系查询语言和关系操作等。
计算机书籍第3~5章主要介绍最具影响力的面向用户的关系语言——SQL。第6章介绍形式化的关系查询语言,包括关系代数、元组关系演算和域关系演算。
这部分描述了数据操纵,包括查询、修改、插入和删除(假设已有一个模式设计)。关于模式设计的问题延迟到第二部分讲述。
第二部分:数据库设计(第7章至第9章)。第7章给出了数据库设计过程的概要介绍,主要侧重于用实体-联系数据模型来进行数据库设计。实体-联系模型为数据库设计问题,以及我们在数据模型的约束下捕获现实应用的语义时所遇到的问题提供了一个高层视图。UML类图表示也在这一章中讲述。
第8章介绍关系数据库设计理论。这一章讲述函数依赖和规范化,重点强调提出各种范式的动机,以及它们的直观含义。这一章以关系设计的概览开始,依赖于对函数依赖的逻辑蕴涵的直观理解。这使得规范化的概念可以在函数依赖理论的完整内容之前先作介绍。函数依赖理论将在本章中稍后部分讨论。教师可以只选用8.1节至8.3节这些较前面的章节,而不会丢失连贯性。不过,完整地讲授这一章将有利于学生对规范化概念形成较好的理解,从而诱导出函数依赖理论中一些较艰深的概念。
第9章讲述应用设计和开发。这一章侧重于用基于Web的界面构建数据库应用。另外,这一章还讲述了应用安全性。
第三部分:数据存储和查询(第10章至第13章)。第10章讨论存储设备、文件和数据存储结构。在第11章中介绍多种数据存取技术,包括B+树索引和散列。第12章和第13章阐述查询执行算法和查询优化。这两章使用户能更好地理解数据库的存储和检索的内部机制。
第四部分:事务管理(第14章至第16章)。第14章着重介绍事务处理系统的基本概念,包括原子性、一致性、隔离性和持久性。它还提供了用于保证这些特性的方法的一个概述,包括封锁和快照隔离性。
第15章重点讲述并发控制,并介绍保证可串行化的几种技术,包括封锁、时间戳和乐观(有效性检查)技术。在这一章中还讨论死锁问题,并介绍保证可串行化的其他方法,特别是详细讨论广泛使用的快照隔离方法。
第16章讨论在系统崩溃和存储器故障情况下保证事务正确执行的主要技术。这些技术包括日志、检查点和数据库转储。被广泛使用的ARIES算法也在这里做了介绍。
第五部分:系统体系结构(第17章至第19章)。第17章介绍计算机系统体系结构,并描述了作为基础的计算机系统对于数据库系统的影响。在这一章中讨论了集中式系统、客户-服务器系统、并行和分布式体系结构。
在第18章关于并行数据库的讨论中,我们探讨了各种并行技术,包括I/O并行、查询间并行和查询内并行,以及操作间并行和操作内并行。这一章中还讨论了并行系统设计。
第19章讨论分布式数据库系统,在分布式数据库系统的环境下重新讨论数据库设计、事务管理、查询执行和优化问题。这一章还包括了故障时的系统可用性问题,并介绍了异构分布式数据库、基于云的数据库和分布式目录系统。
. 第六部分:数据仓库、数据挖掘与信息检索(第20章和第21章)。第20章介绍数据仓库和数据挖掘的概念。第21章描述用于查询文本数据的信息检索技术,包括在Web搜索引擎中使用的基于超链接的技术。
第六部分使用了第一部分和第二部分的模型和语言概念,但并不依赖于第三部分、第四部分或第五部分。因此它可以很容易地结合到侧重于SQL和数据库设计的课程中。
第七部分:特种数据库(第22章和第23章)。第22章介绍基于对象的数据库。该章讲述了对象-关系数据模型,该模型扩展了关系数据模型以支持复杂数据类型、类型继承和对象标识。该章还描述了用面向对象的编程语言来访问数据库。
第23章介绍数据表示的XML标准,它正日益广泛地应用于复杂数据交换和存储。这一章还描述了XML的查询语言。
第八部分:高级主题(第24章至第26章)。第24章讨论应用开发中的高级话题,包括性能调整、性能评测标准、数据库应用测试和标准化。
第25章介绍空间和地理数据、时间数据、多媒体数据以及移动和个人数据库管理中的问题。
最后,第26章讨论高级事务处理。这一章的内容包括事务处理监控器、事务工作流、电子商务、高性能事务系统、实时事务系统和持续长时间的事务。
第九部分:实例研究(第27章至第30章)。在这一部分我们对四个领先的数据库系统进行实例研究,包括PostgreSQL、Oracle、IBM DB2和Microsoft SQL Server。这几章中列举了上述每一种系统的独有特性,描述了它们的内部结构,提供了关于各个产品的丰富的有用信息,帮助读者了解前面各部分描述的各种实现技术是如何使用到实际系统中的。这几章中还包括实际系统设计中的几个有趣的方面。
第6版
对于本书第6版的产生起指导作用的包括我们收到的关于前面几版的许多意见和建议,我们在耶鲁大学、利哈依大学、孟买印度理工学院讲授本课程的体会,以及我们对于数据库技术发展方向的分析。
我们用一个大学的例子替换了原先的银行企业的运行例子。这个例子与学生相关,不仅有助于他们记住这个例子,而且更重要的是,使他们能够更深地洞察所需进行的各种设计决策。
我们重新组织了这本书,将我们关于SQL的介绍都集中在一起,放在本书的开头部分。第3章、第4章和第5章对SQL进行完整的介绍。第3章给出该语言的基础,而将更高级的特性放在了第4章。在第5章中,我们介绍从通用的程序设计语言访问SQL的JDBC和其他方法。我们介绍触发器和递归,最后讨论联机分析处理(OLAP)。入门性的课程可以选择只包括第5章的某些节,或者将一些节延迟到讲过了数据库设计之后再讲,这样也不失连续性。
除了这两个主要的改变外,我们修订了每一章中的素材,对旧的素材进行更新,增加对于数据库技术的新的发展的讨论,并且改进学生难于理解的那些内容的描述。我们还增加了新的练习并更新了参考文献。具体的改变如下。
较早介绍了SQL。许多讲课教师使用SQL作为课程实习的核心成分。为了给学生充足的时间做课程实习,尤其对于那些四学期制的大学和学院来说,尽早教授SQL非常重要。有了这个认识,我们在内容组织方面做了几个改动:
□ 用新的一章(第2章)介绍关系模型,放在SQL之前,打下概念基础,而不使学生迷失在关系代数的细节中。
□ 第3章、第4章和第5章详细介绍SQL。这几章还讨论不同的数据库系统支持的变体,从而当学生在实际的数据库系统上执行查询时会少遇到一些问题。这几章涵盖了SQL的所有方面,包括查询、数据定义、约束说明、OLAP和从各种语言(包括
Java/JDBC)内部使用SQL。
□ 形式语言(第6章)推迟到SQL之后,而且可以略掉不讲,而不会影响其他章的顺序。只有在第13章关于查询优化的讨论依赖于第6章介绍的关系代数。
新的数据库模式。我们采用了一个新的模式作为贯穿全书的运行实例,基于大学的数据。对于学生来说,这个模式比以前的银行模式更加直观和有意义,而且在数据库设计的章节中展示了更复杂的设计权衡。
对学生的亲手实践提供了更多的支持。为了推动学生跟着我们的运行实例进行实践,我们在附录A中列出了大学数据库的数据库模式和样例的关系实例,并在用到大学实例的各个章中也进行了说明。另外,在我们的Web站点http://www.dbbook.com上,提供了对于整个例子的SQL数据定义语句,以及建立我们的样例关系实例的SQL语句。这鼓励了学生直接在一个实际的数据库系统中去运行样例查询,并且试着去修改这些查询。
修订了对ER模型的涵盖。我们修改了第7章中ER图的符号表示,以使得它与UML更兼容。这一章还充分利用了新的大学数据库模式来描述更复杂的设计权衡。
修订了对关系设计的涵盖。第8章的风格现在更具可读性,它在阐述函数依赖理论之前提供了对函数依赖和规范化的一个直观的理解,其结果是理论的动机更清晰了。
扩充了关于应用开发和安全性的素材。第9章包括了关于应用开发的新的素材,以反映该领域的快速变化。特别地,扩展了关于安全性的介绍,包括它在当今紧密互联的世界中的至关重要性,并重点强调了抽象概念外的实际问题。
修订和更新了对数据存储、索引和查询优化的涵盖。对第10章进行了新技术方面的更新,包括对闪存的更多的讨论。
更新了第11章对B+树的讨论,以反映实际的实现,包括对批量载入的介绍,并且对陈述方式也进行了改进。第11章中B+树的例子修改成了n=4,以避免(不切实际的)n=3时发生的空结点的特殊情况。
第13章中有关于高级查询优化技术的新的素材。
修订了对事务管理的涵盖。第14章全面涵盖了入门性课程中的基础知识,而高级的细节在第15章和第16章中介绍。我们扩展了第14章,以涵盖数据库用户和数据库应用开发人员所面对的事务管理的实际问题。这一章还包括了对第15章和第16章所讨论话题的扩展的综述,以确保即使略掉第15章和第16章,学生仍能对并发控制和恢复的概念有基本的了解。
第14章和第15章现在包括了对当今被广泛支持和使用的快照隔立性的详细介绍,对于使用它的潜在风险也做了介绍。
第16章现在对基本的基于日志的恢复进行了简化的描述,进一步介绍了ARIES算法。
修订和扩充了对分布式数据库的涵盖。我们现在涵盖了云数据存储,它在商业应用中正日益受到极大的重视。云存储为企业提供了改进成本管理和增加存储可扩充性的机遇,特别是对于基于Web的应用。我们分析了这些优点,也指出了可能的缺点和风险。
我们原来在高级事务处理这一章中讨论多数据库,现在对它更早地进行了介绍,作为分布式数据库这一章中的一部分。
推迟了对对象数据库和XML的介绍。虽然面向对象的语言和XML在数据库的范围之外被广泛使用,但在数据库中的使用仍然有限,这使得它们对于高级课程或作为入门性课程的补充材料更适合一些。因此这些话题在本书中向后移了,放到了第22章和第23章。
QBE、Microsoft Access和Datalog放在联机附录中。这些话题原来是“其他关系语言”这一章中的一部分,现在放在联机附录C中了。
上面没有列出的所有话题都在第5版的基础上做了更新,虽然相对地它们的总体组织没有改变。
回顾材料和习题
每一章都有一个术语回顾表,还有一个总结,这可以帮助读者回顾这一章中涵盖的关键话题。
练习划分成两部分:实践习题(practice exercise)和习题(exercise)。实践习题的解答在本书的Web站点公开发布。我们鼓励学生独立解决这些实践习题,然后用Web站点上的解答来检查自己的答案。其他练习题的解答只有讲课教师能得到(参看下面的“讲课教师注意事项”以获取如何得到题解的信息)。
许多章的末尾有一个“工具”节,它提供与该章的话题相关的软件工具的信息;这些工具中的一些可以用于实验室练习。大学数据库和习题中用到的其他关系的SQL DDL和样例数据在本书的Web站点可以得到,也可以用于实验室练习。
讲课教师注意事项
本书包括基本内容和高级内容,在一个学期内也许不能讲授所有这些内容。我们以符号“**”把某些节标记为高级内容,如果愿意的话可以省略这些节,而仍能保持内容的连续性。较难的(可以忽略的)练习同样用符号“**”标记出来了。
可以用本书各章的不同子集来设计课程。某些章也可以用不同于本书中的顺序来讲授。我们列出一些可能的安排如下:
第5章可以跳过或推迟到后面讲,而不失连续性。我们期望大多数的课程至少5.1.1节较早地讲授,因为JDBC很可能会是学生实习的一个有用工具。
第6章可以在第2章之后、讲SQL之前讲。也可以把这一章从入门性的课程中省略掉。
我们建议如果课程中讲查询处理的话,那么把6.1节也包括在课程中。但是,如果学生在课程中不使用关系演算的话,那么6.2节和6.3节可以省略。
如果教师愿意的话,第7章可以在第3章、第4章和第5章之前讲,因为第7章完全不依赖于SQL。
第13章可以从入门性的课程中省略掉,而对于其他任何章的讲授都没有影响。
我们对事务处理的讨论(第14章至第16章)和对系统体系结构的讨论(第17章至第19章)都包括一章综述(分别为第14章和第17章)和后续的两章详细讨论。如果计划把后面几章推迟到高级课程中去讲授,可以选择使用第14章和第17章,省略第15章、第16章、第18章和第19章。