01 / 导读
导读
引用
Hernandez, M. J. (2020). Database Design for Mere Mortals: 25th Anniversary Edition (4th ed.). Addison-Wesley Professional.
章节概要
全书分三部分共十六章,另有八个附录和一份术语表,总计约640页。本书只讲关系数据库的逻辑设计:作者把逻辑设计与物理实现和应用开发分开,正文中不出现SQL、程序代码,也不涉及任何具体的数据库产品。第一部分(第1–3章)介绍数据库、设计目标和术语;第二部分(第4–13章)讲授设计流程;第三部分(第14–16章)讨论糟糕的设计和例外情况。第1–13章都以小结收尾,几乎每章都配有复习题;第四版还在第5–13章末尾新增了"Example"一节,用实例演示该章的步骤。
第1章:The Relational Database(关系数据库)
介绍什么是数据库、关系数据库如何存储和检索数据、它有哪些优点,以及关系数据库管理系统的作用。第四版删去了已经过时的内容,并新增"What's Next?"一节,谈作者对关系数据库现状与前景的看法。
第2章:Design Objectives(设计目标)
论证设计决定数据的一致性、完整性和准确性。本章列出良好设计的目标(既支持预定查询也支持临时查询、每张表只表示一个主题、在字段、表和关系三个层面实施完整性、支持业务规则、便于今后扩展)及其好处,随后把传统方法(需求分析、数据建模、规范化)与本书自己的方法加以比较。本书的方法保留需求分析和一种基本的实体–联系图画法,但不逐一套用范式。
第3章:Terminology(术语)
介绍这套方法所依赖的词汇,分为与值有关的术语(数据、信息、空值及空值带来的问题)、与结构有关的术语(表、字段、记录、视图、键、索引)、与关系有关的术语(关系类型、参与类型和参与程度)以及与完整性有关的术语(字段规格、数据完整性)。
第4章:Conceptual Overview(概念概览)
在逐步讲解之前先勾勒整个流程:使命陈述与目标、分析现有数据库、建立数据结构、关系、业务规则、视图,最后复查完整性。
第5章:Starting the Process(启动流程)
讲如何开展访谈(分别给参与者和访谈者的指导原则,本版针对线上会议和居家办公作了修订),以及如何撰写使命陈述和使命目标,为设计确定方向。
第6章:Analyzing the Current Database(分析现有数据库)
考察纸质数据库和遗留数据库、当前收集数据和呈现信息的方式、与用户和管理层访谈的技巧(当前的、补充的、未来的以及总体的信息需求),并整理出初步字段清单和计算字段清单供复核。
第7章:Establishing Table Structures(确立表结构)
把主题整理为初步表清单,再定为最终表清单,同时规范表名、标明表的类型并撰写表说明;把字段分配到各表;对照"理想字段"消除复合字段和多值字段;对照"理想表"完善表结构,其中包括子集表和冗余数据的处理。
第8章:Keys(键)
讲解候选键、主键、备用键和非键字段,如何选择主键,以及键所提供的表级完整性,最后复查初步的表结构。
第9章:Field Specifications(字段规格)
作者认为许多开发者忽视字段规格,本章把它作为字段级完整性的来源来讲。字段规格包括一般要素、物理要素和逻辑要素;本章还说明如何借助唯一规格、通用规格和复制规格,减少为每个字段编写文档的工作量。
第10章:Table Relationships(表关系)
全书最长的一章。内容包括一对一、一对多、多对多和自引用关系,如何识别并建立每种关系,如何完善外键,以及如何设定关系特性:删除规则、参与类型和参与程度。
第11章:Business Rules(业务规则)
说明什么是业务规则及其类型,把规则分为字段专属规则和关系专属规则,并展示如何与用户和管理层一起确定规则、把它们记录在规格表上。本章还引入验证表,作为通过数据本身来落实规则的手段。
第12章:Views(视图)
介绍数据视图、聚合视图和验证视图,以及如何确定、定义并记录用户所需的视图。
第13章:Reviewing Data Integrity(复查数据完整性)
重新检查表级、字段级和关系级完整性以及业务规则和视图,并汇总设计的最终文档。
第14–16章:Bad Design—What Not to Do(糟糕的设计:不该做什么);Bending or Breaking the Rules(变通或打破规则);In Closing(结语)
第14章告诫读者避免平面文件式设计、电子表格式设计,以及受某一产品功能左右的设计。第15章指出可以偏离这套方法的少数情形,即分析型数据库和处理性能,并要求每一次偏离都要记录在案。第16章是简短的结语。
附录
收录复习题答案、整个设计流程的图示、设计指导原则汇总、空白文档表格(字段规格、业务规则规格和视图规格)、图示符号、设计样例、关于如何把规范化融入本方法的讨论("On Normalization")以及推荐书目。
核心概念
第1–3章:基础
- 逻辑设计:在任何实现之前确定表、字段、键、关系和完整性;这是本书唯一涉及的阶段。
- 参与类型与参与程度:一条记录是否必须参与某个关系,以及它最多可以关联多少条记录。
第4–13章:设计流程
- 使命陈述与使命目标:简要说明数据库的用途和它必须支持的任务,用来指导后续的全部设计。
- 复合字段与多值字段:包含多项数据或多个值的字段,本方法把它们拆分为单独的字段或表。
- 主键、候选键与备用键:能唯一标识记录的字段,是表级完整性的基础。
- 字段规格:对字段的一般、物理和逻辑属性所作的书面说明,用以保证字段级完整性。
- 删除规则:关系中一方的记录被删除时,相关记录应如何处理。
- 业务规则与验证表:源于组织运作方式的约束,有时通过一张列出允许取值的表来落实。
- 完整性的层次:表、字段和关系三个层面的完整性加上业务规则,在流程末尾统一复查。
第14–15章:其他问题
- 平面文件设计与电子表格设计:常见的布局方式,本书视之为冗余和不一致数据的根源。
- 有记录的规则变通:只在分析或性能等理由下偏离本方法,并写明原因。
评析
优点
- 从访谈到文档的一整套方法。 第二部分按顺序走完同一个流程,从使命陈述一直到最后的完整性复查,反复使用的表格集中收在附录里。作者正因如此建议按顺序通读全书。
- 无需预备知识,也不依赖具体产品。 引言明确表示不需要任何数据库设计背景;正文避开SQL、编程语言和特定数据库系统的功能,因此无论日后使用哪种系统,这套方法都适用。
- 需求收集讲得充分。 第5章和第6章用了八十多页篇幅讲访谈、使命目标以及对现有纸质系统和遗留系统的分析,而许多数据库教材对这一阶段一笔带过。
- 适合自学。 附录A附有答案的复习题、流程图、设计指导原则清单,以及第5–13章末尾新增的实例,都便于读者独自学习。
局限
- 规范化被放在正文之外。 本方法不讲范式,而是把规范化的效果融入各个步骤;范式只在第2章简要出现,并在一个附录中讨论。如果课程要考查函数依赖和范式,学生需要另找教材学习这部分内容。
- 只讲逻辑设计。 引言把物理实现和应用开发排除在外,因此书中没有SQL、查询处理,也不涉及事务和存储。
- 有意简化的例子。 作者事先声明,为了演示某种技巧,有些例子被刻意简化、写得不完整,甚至故意写错;正如书中所建议的,读者应关注技巧本身,而不是例子。
在课程中的定位
在数据库这门课的书单中,本书是最容易入手的一本,也是唯一专讲设计的一本。Coronel 与 Morris 的 Database Systems: Design, Implementation, and Management 是一部覆盖面很广的入门教材,还讲SQL和组织中的数据管理;可以在读它之前先读本书,或与它的数据建模章节同步阅读,以更慢、更贴近实践的方式走一遍设计流程。Silberschatz、Korth 与 Sudarshan 的 Database System Concepts 以及 Elmasri 与 Navathe 的 Fundamentals of Database Systems 是更完整的计算机科学教材,以形式化的方式讲授范式、查询处理和事务;本书能为这类课程的设计部分提供直觉和练习,但不能替代它们。
Ramakrishnan 与 Gehrke 的 Database Management Systems 以及 Gray 与 Reuter 的 Transaction Processing 讨论数据库系统的内部工作原理,这正是本书有意不碰的领域。宜在熟悉关系设计和SQL之后再读。
如何使用本书
引言设想的读者包括:初次接触数据库工作的人、用过数据库软件而现在需要自己建库的人,以及一直没有方法、凭经验建库的程序员。本书不要求数学、编程或SQL基础。
- 核心: 第2–3章学习目标和术语,第4章了解流程全貌,然后是承载大部分设计内容的第7–10章(表、键、字段规格、关系)。
- 需求工作: 第5–6章对要为真实组织设计系统的读者最为重要;偏重理论的课程的学生可以略读。
- 完整性与规则: 第11–13章使整套方法完整;如果课程重视约束,请仔细读第11章。
- 选读: 已经了解关系数据库是什么的读者可以略过第1章;第14–16章篇幅短,很快就能读完。
建议自选一个小题目,例如社团、商店或选课系统,按全部步骤做一遍设计,并填写附录D中的表格。每章的复习题先自己作答,再对照附录A。之后把附录G与课程教材中讲规范化的章节对照阅读,看看本方法的各个步骤如何对应各级范式;最后在任意一个关系数据库系统中实现完成的设计,借此学习本书没有涉及的SQL。
