本书详细讲解了数据库的基本理论与技术,包括数据模型、查询语言、存储结构、逻辑设计以及与实现和性能有关的问题,如并发、恢复、安全和优化等。全书分为四部分,共2章,每章后面均附有小结和练习。此书的最大特点是对数据模型做了较全面的论述,讲解了5种数据模型:关系模型、面向对象模型、逻辑模型、网状模型和层次模型。每种数据模型都围绕着数据模型的三要素(即实体-联系的表达、查询和约束)来讲解,并对不同数据模型的表达能力及特点进行了比较分析,此外,还讲述了不同数据模型的存储结构。关系模型是现在很流行的数据模型;面向对象模型和逻辑模型(演绎数据模型)在2世纪8年代至9年代形成,虽然没有流行起来,但其不少研究成果已被关系模型所吸收;网状模型和层次模型已成为历史,但在数据库新技术(如面向对象模型和XML查询)的研究中仍继续发挥着借鉴作用。本书可作为计算机相关专业研究生和本科生的教材,也适合于数据库领域的研究者和工作人员参考阅读,以了解各种数据模型的基本思想和特点。译者序数据库技术是最重要的计算机技术之一,在计算机应用中起着举足轻重的作用。数据库理论和技术的核心是数据库模型。自数据库技术产生以来,大约出现过6种主要的数据库模型:网状模型和层次模型、关系模型、面向对象模型和演绎模型,以及正在研究的半结构化和XML模型。数据库系统采用什么数据模型,一般就称为什么类型的数据库系统。其中网状和层次数据库是2世纪7年代之前得到广泛应用的数据库技术,早已被关系数据库代替,但在其他模型数据库的研究中(如面向对象数据库和半结构化与XML数据库),仍然发挥着积极的作用。关系模型自2世纪7年代产生以来一直是数据库技术的主流;面向对象数据库和演绎数据库在2世纪8年代至2世纪9年代的研究取得了丰硕的成果,但由于种种原因没有在应用中流行起来,而其研究成果却大量地被关系数据库所吸收,并且在数据库领域中具有重要的理论意义;半结构化和XML数据库是2世纪9年代末开始研究的数据库技术,目前还不成熟并且没有统一的名字。关系模型由于其简洁性、良好的数学基础和突出的表达与适应能力,一直在利用数据库技术的最新研究成果不断扩充,并在数据产品中得以应用;查询语言SQL3(或SQL99)标准就是在面向对象数据库技术的推动下产生的,它吸收了演绎数据库的研究成果,闭包和递归计算就是其中一例。特别是,还把关系和对象技术的结合命名为对象-关系数据库技术;进而,在目前的关系数据库产品中一直在不断地吸收半结构化和XML数据库的研究成果。这几种数据库模型虽然各有特点,甚至看起来截然不同,但它们之间却存在着深刻的联系。在表现数据结构、数据操作和完整性约束上(被称为数据库模型的三大要素),以及在表达能力上都有相通之处并各有千秋。目前,论述网状和层次数据库的书很少,而论述面向对象和演绎数据库的书则往往是大部头的专著,但在一本书中系统地论述各种数据库模型及其相互关系的书却不多见,本书正好弥补了这一缺憾。全书较详细地论述了前5种数据库模型,并论述了适用于各种模型的存储结构,以及规范化和数据库逻辑设计问题,最后简述了数据库管理系统的实现及性能上的有关问题,如并发处理、恢复、安全和性能优化等。本书的最大特色是,对5种数据库模型统一以数据结构、数据操作、数据完整性约束和表达能力为主线进行论述和比较,其中对一些问题的提法和思路颇有独到之处,极具启发性。总而言之,本书是数据库研究者不可多得的一本参考书。遗憾的是,由于本书出版较早,没有把半结构化和XML数据库研究的有关内容包含进来,并且书中在讲解面向对象部分时以典型的面向对象数据库GEMESTONE为例子,与ODMG标准和SQL3标准的有关内容及表达方法有一些区别。不过,关于后者,读者可以由作者网页的授课大纲得到一些相关信息。另外,对演绎数据库,本书未出现DATALOG这个通常用于说明逻辑数据库模型和查询语言的名字,但本书所讲的内容就是DATALOG的核心内容。本书适合作为研究生和本科生的教材,也适用于数据库研究者及数据库研发人员参考阅读。原书中使用了一些不常用的术语,如shell,anchor,signal等,因为书中有明确的常规术语与之相对应,含意不难理解,故译文中按常规字面译法翻译,而没有改为常规术语。原书中的一些文字上的错误,译文中已加以改正。参加本书翻译工作的有:李天柱(第9章和第1章)、肖艳芹(第6章至第8章和第11章至第13章)、杨文柱(第14章至第16章和第2章)、任建利(第1章、第2章及第5章的一部分)、马颖丽(第17章和第19章)、黄炜(第18章)、郝亚南(第3章、第4章及第5章的一部分)等;在李天柱的指导下,杨文柱、肖艳芹、郝亚南对全书进行了审校及定稿。对本书的翻译工作做出贡献的还有张波、张志强、孙兆豪、宋鑫、陈少飞、徐林昊、张邵华、肖计田、边小凡、李俊、罗朝晖、高丽敏、袁方、朱亮、刘大中等。由于译者水平所限,书中难免有不妥之处,敬请读者批评指正。前言本书介绍了大学计算机科学课程中数据库理论方面的传统主题。此书并不具有独创性,因为所阐述思想的大部分都是为大家所熟知的。本书的特点在于通过对内容的组织和概念解释,从而更加清晰地阐明了数据库的理论。但书中没有包含数据库实现技术及分布式数据库技术,除最后一章之外也没有在其他地方讨论性能问题。在学生熟悉了本书所讨论的这些模型、语言和设计等问题之后,可以为进一步的学习打下坚实的基础。第一部分介绍了五种数据库模型。这些模型代表了现在(关系模型)、将来(面向对象和演绎模型)和过去(网状和层次模型)的研究成果。为了与当前关系模型的重要性保持一致,本书中占篇幅最大的是关系模型,包括了关系表示(数据、联系和约束)、关系代数和演算,以及对结构化查询语言(SQL)的全面介绍。作者没有试图去遵循任何商业数据库产品的特有细节,而是强调了对所有这些产品都通用的概念。在掌握了这些内容之后,读者就可以在任何与SQL兼容的关系数据库中去实现应用了。在讲解面向对象数据库和演绎数据库时各占用了两章的篇幅:第一章描述模型本身,即讲解数据项以及它们之间联系和约束的技术;然后在第二章中说明如何针对这种数据库来组织查询;接下来,限于近年来网状和层次模型的使用范围,对它们分别使用一章的篇幅来做介绍,因为这两种模型已被关系模型所取代了。不过,这五种模型既相互区别,也彼此联系,揭示了数据库模型研究的发展历程。最后,对这五种数据库模型进行了清晰的比较。第二部分介绍了物理数据存储的问题,以使本书体系完整。许多学校在讲授数据库课程时都包含了文件部分,尤其是关于记录存储的概念,所以本书也相应地适应了这些需要。第三部分涉及到了应用设计问题。首先作为语义数据库模型的例子,介绍了实体-联系图(ER图)和对象建模技术(OMT),这有助于应用设计者对应用实体及其联系进行识别和结构化。在第一部分中,使用了简单的ER图来说明贯穿于各种不同数据库模型的应用示例。在学习了这些数据库模型后,学生会进一步想了解ER图的高级特性,例如类层次和相关问题。所以,在第三部分中讨论了这些问题。然后,使用两章的篇幅对函数依赖和连接依赖进行了分析。这些技术说明了应如何选择相关的表以加强特定约束。本书的第四部分只有一章,在这一章中,对通常在性能问题中所选的高级主题进行了分组,就并发性、恢复、安全性和查询优化等问题进行了简要介绍。对于本书中的大部分例证,都使用了一个单一、简单的例子。所以读者在学习一种新的数据库模型时,会遇到相同或相似的应用。所有这些模型都简单地说明了组织数据元素之间的联系和约束的不同方法。这个通用的应用示例强调了这五种模型之间的相似性。通过重复使用某种说明大部分数据库查询的模式,进一步强调了这一思想。本书的目标、使用方法和预备知识本书可以作为大学数据库课程的教材,为高年级课程提供充足的资料。在阅读本书之前,需要具备以下知识:●程序设计:程序语言中的数据结构和算法表达。本书用C语言来说明算法,但是没有支持堆栈、列表、队列等常用操作的程序。如果读者理解块结构化的程序语言,即使不是C语言,即使不会写,也应该能够读懂这些算法。●谓词演算:尽管本书对谓词演算有一个简要的回顾,但读者还是应该有这方面的预备知识。●集合理论和某些离散数学问题:布尔代数、关系和归纳证明。●断言和循环不变式:书中采用这些方法来证明算法的正确性。●初步的组合数学和概率理论:在第二部分的Hash表讨论中使用了一些这两方面的知识。在讲授数据库课程时可以灵活安排教学内容。因为我的学生已经学习过第二部分中文件的内容,所以我用一个学期的6%的时间来讲授第一部分的模型和语言,跳过了第二部分,然后在剩余的4%的时间里尽可能多地讲述第三部分的内容。在授课时,首先讲述关系模型导言和有关内容,包括较复杂的SQL的内容。然后讲解面向对象和演绎模型。因为我强调数据库的通用特征,所以学生应学习怎样得出关系模型和这些新模型之间的相似性,这样就可以用更简短的讲义来讲述它们之间的关系。将过去使用的模型作为课外读物留给学生自学,这样就需要一个较短的总结来将网状或层次模型与课上讲过的模型做对比。在深入研究函数依赖和连接依赖的数学理论之前,我在第二部分的授课中包括了实体-联系概念的所有特征。因为对数学知识的要求更加苛刻,所以这一部分的速度慢了下来。在讲解时介绍了主要结论,并且进行了详细的推导。以这种方式使用这本教材,我通常都是在连接依赖这一章的某一部分结束这门课程。即使讲授全部内容,教师也不必覆盖教材中的每一个细节。尽管我没有讲授教材中的全部细节,但我估计讲授完整的这本书可能需要一学年。对于教学方法,我的建议是首先选择重点章,然后进一步选择这一章的重点内容和相应示例并指导学生完全掌握所选章节。如果在教授数据库课程时需要讲解第二部分的文件概念,我推荐用与上面相同的方式来讲授这些模型,但第三部分的数据库设计方面的内容可以相应缩减。如果课程要求开设实验来使用一种商业数据库产品,那么可以上完三分之一课时后开始实验,也就是在讲完第5章之后。我在开设实验课程时要求学生创建一个包含五个表的小型关系数据库(与书中的通用应用示例相似),并针对这个数据库来实现查询。最后要说明的是,这本书也适合那些既熟悉关系数据库技术又打算学习面向对象和演绎模型的数据库工作者。第1章到第6章是对关系数据库的全面回顾,并以向其他模型引申的方式来解释这些特征。第7章到第1章继续讲述后关系模型,并讨论了演绎和面向对象数据库。表达风格本书的表达风格与大部分数据库教材不同。首先,提供了更多的解释和示例。其次,强调通用概念,而不是已有商业产品的特殊细节。与其他教材的相同之处是,选择了C语言来描述算法,并且使用C代码片段来解释一些非算法的内容,例如嵌入式SQL和网状查询。这样,大部分学生会通过数据库课程在一定程度上进一步熟悉C语言。所采用的示例都是简短的摘录,而不是完整的程序,但也足以说明概念了。最后,完成此书时所参考的全部文献统一列在了本书的结尾处,而不是分散在每一章的末尾。