Preface

数据库系统在企业界是一种常见且显而易见的工具——员工经常直接与数据库系统交互以提交数据或生成报表。数据库系统也很常见,但通常作为软件系统的隐性组件存在。例如,考虑一个电子商务网站,它在服务器端使用数据库来存储客户、产品和销售信息;或者考虑一个 GPS 导航系统,它使用嵌入式数据库来管理道路地图。在这两种情况下,数据库系统对用户而言是隐藏的;应用程序代码负责所有的数据库交互。

从软件开发者的角度来看,直接学习使用数据库并不复杂,因为现代数据库系统包含了功能强大的前端,使查询和报表的创建变得十分简单。另一方面,将数据库功能整合到软件应用中则令人兴奋,因为这为开发者开启了大量新的、尚未探索的可能性。但“整合数据库功能”究竟意味着什么?数据库系统提供了许多功能,如持久化、事务支持和查询处理。那么,究竟需要哪些功能,又应如何将它们集成到软件中?假设某程序员被要求修改现有应用,例如增加保存状态的能力、提高可靠性或改进文件访问效率。她面对多种架构选项,可以:

• 购买一个功能齐全的通用数据库系统,然后将应用修改为以客户端身份连接该数据库 • 获取一个仅包含所需功能且代码可直接嵌入应用的专用系统 • 亲自编写所需功能

为了做出正确选择,程序员需要了解每种方案的利弊。她不仅要知道数据库系统能做什么,还要知道它们如何实现以及为什么要这样做。

本节从软件开发者的视角来考察数据库系统。这一视角使我们能够探究数据库系统为何如此设计。当然,会编写查询非常重要,但同样重要的是要了解查询的处理过程。我们不希望仅仅会使用 JDBC,还要知道该 API 中的类和方法为何如此设计。我们需要了解编写磁盘缓存或日志记录功能的难度究竟有多大。那么,数据库驱动究竟是什么?

文本组织结构

前两章提供了数据库系统及其应用的快速概览。第 1 章讨论数据库系统的目的和特性,并介绍 Derby 和 SimpleDB 系统。第 2 章解释如何使用 Java 编写数据库应用,介绍了 JDBC 基础,这是 Java 程序与数据库交互的核心 API。

第 3~11 章深入研究典型数据库引擎的内部结构。每章聚焦不同的数据库组件,从最低层(磁盘与文件管理器)一直到最高层(JDBC 客户端接口)。每章都会阐述相关问题并探讨可能的设计决策,从而让你清晰了解每个组件提供的服务以及它们在系统中如何相互协作。到本部分结束时,你将见证一个简单但功能完整的系统的逐步构建。

后面四章集中讨论高效查询处理,探讨可替代前面简单设计的高级技术和算法。主题包括索引、排序、智能缓冲区使用以及查询优化。

文本先决条件

本书适用于高校计算机科学本科高年级或研究生初级课程,假定读者熟悉基础 Java 编程;例如,会广泛使用 java.util 包中的集合和映射。高级 Java 概念(如 RMI 和 JDBC)在文本中会有充分解释。

本书通常作为数据库系统课程的第二门教材使用,但我也曾成功地用于没有数据库经验的学生。为此,本书仅假定读者对 SQL 有初步了解,没有更多数据库背景知识也能轻松上手。

SimpleDB 软件

在我看来,学生理解概念性思想(如并发控制、缓冲区管理和查询优化算法)比理解这些思想如何交互要难得多。理想情况下,学生应当像在编译原理课程中编写完整编译器一样,在课程中编写一个完整的数据库系统。但数据库系统远比编译器复杂,这种做法并不现实。我的解决方案是编写一个简单但功能完整的数据库系统,称为 SimpleDB。学生可以通过阅读和修改 SimpleDB 代码,将概念知识付诸实践。

功能上,SimpleDB 像商业数据库系统一样,是一个多用户、面向事务的数据库服务器,支持执行 SQL 语句并通过 JDBC 与客户端交互。结构上,它包含与商业系统相同的基本组件,并具有类似的 API。SimpleDB 每个组件都有对应章节,讨论其代码和背后的设计决策。

SimpleDB 是有用的教学工具,因为它的代码规模小、易读易改。它省略了所有不必要的功能,仅实现了极少量的 SQL,并采用最简单(往往不切实际)的算法。因此,学生有大量机会为系统扩展新功能、改进算法;许多扩展都作为章末练习出现。

SimpleDB 可从 http://cs.bc.edu/~sciore/simpledb 下载。关于安装和使用的详细说明见该网页和第 1 章。如有改进建议或 bug 报告,欢迎发邮件至 sciore@bc.edu

章末阅读材料

本书围绕两个问题展开:数据库系统提供哪些功能?哪些算法和设计决策最能实现这些功能?市面上有大量专著分别探讨这些问题的不同方面,一本书无法面面俱到,因此本书只呈现最能说明相关问题的算法和技术。我的首要目标是教授技术背后的原理,即便因此省略或弱化了最具商业价值的实现方法。每章末都设有“建议阅读”部分,讨论本章未及的有趣思路和研究方向,并提供相关网页、研究论文、参考手册和书籍的参考文献。

章末习题

每章末都有大量习题。有些是纸笔题,旨在巩固本章概念;另一些则建议对 SimpleDB 进行有趣的改造,许多都可作为编程项目。我已编写了大部分习题的参考答案。如您是采用本教材授课的教师并希望获取教师用书,请发邮件至 sciore@bc.edu