
数据库在大多数企业或机构的运营中扮演着至关重要的角色;它们作为核心存储库,储存着产品、客户、供应商、销售等关键信息和其他大量的必备信息。毫无疑问的是,大部分商务计算都涉及数据库应用。
本书向读者提供了许多实用的方法和工具,用来设计高效、可靠和安全的数据库。本书作者Rod Stephens详细讲解了应该如何组织数据库以便在不降低性能的前提下确保数据完整性,为开发各种数据库应用程序提供了坚实的基础。书中提到的方法和技术适用于各种数据库环境,包括Oracle、Microsoft Access、 SQL Server和MySQL。通过学习本书,读者将会了解优秀数据库设计的基本过程并最终掌握实际设计数据库的方法。
前 言
据估计,世界上超过80%的计算机程序是与数据库相关的。这个事实勿庸置疑,不管怎么样,数据库很擅长精确执行计算机程序,如数据的存储、操作和显示。
尽管很多程序乍看起来几乎不涉及传统的面向业务的数据,但是使用数据库可以简化处理。实际上,回顾20多年从事软件开发的经历,在我碰到过的所有重要的应用程序中,想不出哪一个应用程序不使用数据库。
数据库不仅在很多应用程序中发挥作用,而且它们起到的作用往往是非常关键的。如果数据没有被正确地存储,那么将会出错并且程序将无法使用它完成特定任务。如果没有恰当地组织数据,程序可能难以在合理的时间内找到它需要的数据。
如果数据库不能安全和有效地存储数据,不管系统其余部分设计得如何完善,应用程序都将是无价值的。数据库就像建筑物的地基:没有坚实的地基,即使采用最好工艺的建筑也是不合格的,虽然有时也可能会成为奇观(如比萨斜塔)。
考虑到绝大多数应用程序都非常依赖数据库,因此希望从事应用程序开发的所有人员在数据库设计和构造方面都应打下坚实牢靠的基础。理想情况下,包括数据库设计人员、应用程序创建人员、编程人员、数据库管理人员和项目经理在内的所有人都应该了解设计优良数据库的方法。甚至连应用程序的重要客户和使用者都将会从了解数据库的工作原理中受益。
但是令人沮丧的是,实际情况并非如此。许多IT专家是通过他人表述、试错和痛苦的经历才获得对数据库的认识的。多年以来,一些人对构成优良数据库设计的要素形成了一种直观的看法,但是他们可能仍不了解是何种原因造成设计的优劣,并且很可能会留下构建在不可靠数据库基础上的性能不稳定且结构化很差的程序。
本书介绍了设计数据库需要的工具,解释了确定数据库中应该包含哪些要素的方法、应该如何组织数据库以确保数据的完整性和适当的性能级别。此外,本书还讲解了如何设计健壮的数据库的各种技术以便安全一致地存储数据。数据库足够灵活才能允许应用程序快速、可靠地检索其需要的数据,并且对现实中的各种变化有很强的适应性。
通过学习本书介绍的思想和技术,将为开发数据库应用程序打下坚实的基础。
读者对象
本书是为希望学习如何设计、分析和理解数据库的IT专业人员和学生编写的。本书的内容对那些希望更深入地了解数据库的人来说也大有帮助,如投标经理、体系结构设计师、项目经理乃至客户。那些实际设计、构建和使用数据库的人员,如数据库设计人员、数据库管理人员和编程人员,也将从本书中受益。在很多项目中,上述这些角色都是重叠的,因此同一个人可能既负责投标和管理部分项目,也从事数据库的设计和构建。
本书适用于各种专业水平的IT专业人员和学生。本书并不要求读者具备任何使用数据库或基于数据库的应用程序的经验,甚至不要求读者会使用计算机。对读者的要求就是拥有学习的意愿和渴望。
本书主要内容
本书讲解了数据库设计,说明了规划数据库结构的方法和过程,这些知识可以让数据库健壮、抗错和足够灵活,以适应未来一定程度的变化。本书介绍了洞悉数据库要求、构建数据模型来研习数据需求的方法,以及优化这些模型来改善数据库效用的方法。
本书通过完成实际数据库设计的详尽实例来巩固这些概念。本书后半部分介绍了使用两款常见的数据库产品实际创建数据库的方法,这两款产品是Access 2007和MySQL。
本书最后还谈到一些为保持数据库高效运行有必要了解的主题,如:数据库维护和安全性。
使用本书的要求
本书主要讲解数据库设计,说明如何确定数据库应该包含哪些要素的原则和构造数据库的方法以便获得最佳的结果。
本书并不关注实际的数据库创建。不同的数据库工具构造数据库的细节各不相同,因此为了使本书尽可能通用,本书不专门讨论任何特定的数据库系统,可以将本书介绍的技术同等地应用到使用的任意数据库工具中,无论是Access、SQL Server、Oracle,还是MySQL和其他数据库产品。
大多数数据库产品都含有供小型项目使用的免费版本。例如,SQL Server Express Edition(速成版)、Oracle Express Edition和MySQL Community Server(社区服务器)都是免费的。
为了公平起见,本书不专门针对某种特定的数据库进行讲解,因此不要求配置任何特殊的软件或硬件。要想完成书中的练习,读者只需要一支笔和一些纸。当然读者也可以根据自己的喜好将解决方案键入到计算机中,而且,很可能会发现使用笔和纸比使用图形设计工具绘图更加方便,至少在熟悉数据库设计并且已准备采用计算机设计工具之前是这样的。
第15章将讲解如何使用Microsoft Access 2007数据库产品来构建数据库。如果希望遵照该章的示例进行操作并完成练习,那么需要安装Microsoft Access 2007(尽管也能使用其他版本的Access,但是会略有不同),同时可以使用运行Microsoft Access 2007的任何操作系统。
与此类似,第16章将讲解如何使用MySQL Community Server数据库产品来构建数据库。如果希望遵照该章的示例进行操作并完成这些例子,则需要安装MySQL Community Server,并且可以使用运行MySQL的任何操作系统。
为了体验第17章和第18章介绍的SQL数据库语言,则需要在任意操作系统上运行支持SQL的数据库产品(包括几乎所有关系数据库)。
内容架构
本书的所有章节被划分成5个部分及两个附录。在此介绍每部分包含的章节。如果以前使用过数据库,那么可以根据这些介绍来决定略读哪些章和精读哪些章。
第I部分:数据库和数据库设计介绍
本部分的章节提供了了解后续章节必备的背景知识。如果熟悉的话,可以略读其中一部分内容,但是不要过分忽视这些内容。如果了解数据库底层设计的基本概念,那么将有助于理解后面介绍的重要概念的要点。
第1章“有效数据库设计的目标”解释了人们和机构使用数据库的原因。本章说明了数据库的目的以及使用数据库必须满足的条件,此外还介绍了任何优良数据库应该具有的基本的ACID(原子性、一致性、隔离性和持久性)和CRUD(创建、读取、更新、删除)特性。本章使用简洁的话语解释了构成优良数据库和低劣数据库的要素。
第2章“数据库类型”讲解了可以使用的一些不同类型的数据库,包括平面文件、电子数据表、层次数据库(XML)、对象数据库和关系数据库。其中关系数据库是最强大且最常用的一种数据库,因此也是本书讲解的重点。但是有必要认识到在某些情况下采用其他数据库类型可能更合适。本章还提供一些技巧用于确定最适合特定项目的数据库类型。
第3章“关系数据库基础知识”讲解了关系数据库的基本概念,如表、行和列。除了数据库理论学者有时会用到的技术性更强的术语外,本章还介绍了通用的关系数据库术语。最后本章还说明了数据库使用的不同类型的约束以保证安全、一致地存储数据。
第II部分:数据库设计过程和技术
本部分包含的章节主要讨论数据库设计,讲解的内容涉及了解数据库应该包含哪些要素、开发初始的设计、分离数据库的重要部分以提高其灵活性,以及改进和调整设计以便尽可能提供最稳定和有用的设计。
第4章“了解用户需求”说明如何了解和收集用户的需求。本章讲解了如何调研用户当前的操作、现存的任何数据库和期望的改善。本章介绍了为了了解用户的操作、期望和需求常会询问的一些问题,并且说明了将这些询问的结果写进需求文档和规范的方法。本章还解释了用例的作用,并说明了它们的使用方法和要求以便指导数据库设计和定位成功。
第5章“将用户需求转换成数据模型”介绍数据建模。本章讲解如何将用户的概念模型和要求转换成其他更为精确的模型,从而严格地定义数据库设计。本章介绍了几种数据库建模技术,包括用户界面模型、语义对象模型、实体关系图和关系模型。
第6章“提取业务规则”介绍了数据库处理业务规则的操作方式。本章解释了业务规则的概念、它们在哪些方面与数据库结构要求不同以及识别业务规则的方式。本章说明了将业务规则与数据库结构相分离的好处,并介绍了实现这种分离的操作方式。
第7章“规范化数据”说明了数据库设计使用的最强大的一个工具:规范化。规范化技术允许重新构造数据库以增加其灵活性并使它更加健壮。本章解释了各种形式的规范化,强调最常见且重要的阶段:第一、第二和第三范式(1NF、2NF和3NF)。此外,本章阐述了如何使用这些范式防止出错,并说明为何有时最好降低数据库的规范化程度来改善性能。
第8章“设计数据库以支持软件应用程序”说明了数据库如何适应应用程序设计和生命周期的更大情景。本章解释了后续的开发在哪些方面依赖于底层的数据库设计,讨论了多层体系结构,这种结构有助于分离应用程序和数据库设计从而使得至少对任何一方做出的一些改动不要求更改另一方。
第9章“常见的设计模式”说明了一些可以用于很多应用程序的常见模式。这样一些技术包括在对象之间实现各种关系、存储分级和网络数据、记录临时数据、日志记录和锁定。
第10章“常见的设计陷阱”说明了数据库开发过程中出现的一些常见设计错误。本章描述了由于规划不周全、规范化不正确以及过分关注ID字段和性能带来的问题。
第III部分:详尽的案例分析
如果逐步学习了前面章节中的所有示例和练习,到这里将会知道生成优良数据库设计的所有重要步骤。但是,在一个顺序展开的已完成的复杂过程中查看所有这些步骤往往是很有用的。本部分的各章将会讲解一个详尽的案例,包含针对假想的Pampered Pet(娇贵的宠物)数据库的数据库设计的所有阶段。
第11章“用户需要和要求”讲解了分析了解用户的各种问题需要采取的步骤,定义了需求并创建了用例。本章描述了对虚构客户的采访以便确定应用的需求并将其转换成数据库设计要求。
第12章“构建数据模型”将上一章收集到的要求转变成一系列数据模型,用来精确定义数据库的结构。本章构建了用户界面模型、实体关系图、语义对象模型和关系模型来细化数据库最初的设计。最后提到的关系模型与关系数据库的结构匹配得相当紧密,因此它们很容易实现。
第13章“提取业务规则”用于识别在第12章构造的关系模型中嵌入的业务规则。本章说明了提取这些规则的方法以便在逻辑上将它们从数据库的结构中分离出来。这样做使得数据库在今后遇到业务规则的变化时更加健壮。
第14章“规范化和优化”通过规范化第13章开发的关系模型来优化它。本章讲解了采用不同范式的数据库的多个版本,然后选择规范化程序以便在健壮性设计和可接受性能之间做出合理的权衡。
第Ⅳ部分:实现数据库(以Access和MySQL中的示例为例讲解)
尽管本书关注不依赖于特定数据库产品的抽象数据库概念,但在更具体的实现问题上花上少许时间也是值得的。本部分的各章将阐述这样一些问题并说明如何使用两种不同的数据库产品来构建数据库:Access 2007和MySQL。
第15章“Microsoft Access”解释了使用Microsoft Access 2007构造数据库的方法。本章并不涵盖有关Access的所有内容,而仅说明足够了解和使用Access来构建较大数据库的内容。学习本章也可以使用其他版本的Access,尽管对于不同的版本而言,菜单和按钮的位置及其他Access特性会有所不同。
第16章“MySQL”解释了使用MySQL构造数据库的方法。本章介绍了在哪里能下载免费版本的MySQL,此外本章还说明了如何使用MySQL命令行客户程序(Command Line Client)以及一些有用的图形工具,包括MySQL Query Browser和MySQL Workbench。
第Ⅴ部分:高级主题
尽管本书不要求读者以前拥有使用数据库的经验,但这并不意味着本书不涉及一些更高级的主题。本部分各章讲解了一些较为重要但是并非是数据库设计核心的更高级的主题。
第17章“SQL简介”介绍了SQL(结构化查询语言),说明如何使用SQL命令来添加、插入、更新和删除数据。通过使用SQL,有助于程序独立于用来存储数据的特定数据库产品的特质性。
第18章“使用SQL脚本来构建数据库”解释了使用SQL脚本构建数据库的方法。本章说明了这种技术的好处,比如在执行测试之前创建脚本以便初始化数据库的能力。此外,本章还指出了这种方法的一些限制,例如用户必须按照特定次序创建和删除表以满足表关系的事实。
第19章“数据库维护”描述了任何数据库应用程序都应具有的一些数据库维护问题。尽管严格地说,执行和恢复备份、压缩表、重新构建索引和填充数据仓库并不是数据库设计任务,但是它们对于任何可运作的应用程序而言都是必需的。
第20章“数据库安全”说明了数据库安全问题。本章解释了一些数据库产品提供的各种安全性。此外,本章还阐述了一些额外的技术用以增强数据库安全性,如使用数据库来适当限定用户对数据的访问。
附录
本书的附录提供了补充前面各章节内容的额外参考资料。
附录A“练习题答案”提供了练习题的答案,因此读者在阅读本书的时候可以检查其进展情况。
附录B“数据库设计样例”包括用于各种常见的数据库情形的设计。这些设计存储有关图书、电影、文档、客户订单、雇员工作时间记录、租金、学生、团队和车队此类主题的信息。
术语表提供了有用的数据库和软件开发术语的定义。除了在阅读其他数据库资料时可能遇到的有用的术语外,术语表还提供了本书中定义和使用的术语。当在Web或数据库文章中遇到不熟悉的术语时,本附录也是有用的参考资料。
使用本书的方法
由于本书针对的是各种经验水平的读者,如果以前使用过数据库,则会发现其中的一些内容比较眼熟。在这种情况下,读者可能希望略读涵盖自己非常熟悉的那些内容的章节。
如果熟悉关系数据库,那么可以略读第1章“有效数据库设计的目标”、第2章“数据库类型”和第3章“关系数据库基础知识”。如果以前尝试过撰写项目方案,则可能了解一些需要向用户询问的问题,这些问题可以帮助读者正确获悉需求。在这种情况下,则可以略读第4章“了解用户需求”。
如果以前构建过数据库,那么至少了解一些第7章“规范化数据”中讲解的一些数据规范化概念。但是这是一个复杂的主题,因此我推荐不要跳过本章,除非真正彻底了解数据规范化。
如果具有使用SQL数据库语言的丰富经验,则可以略读第17章“SQL简介”(很多使用过但是没有设计过数据库的开发人员属于这一类人)。
在任何一种情况下,都应至少略读每章的内容以便了解是否可以从中获悉任何新的概念。在确定确实可以略过某章之前要查看一下本章结尾处的练习。如果不知道如何求解练习,那么应该考虑更仔细地阅读本章。
适合不同的人的学习方法各有不同。一些人的最好学习方式是听课,另一些人的最好学习方法是阅读,还有一些人则是通过实践。不管怎样,通过组合学习方式,每个人都可以学得更好。首先阅读资料,然后完成练习会从本书中获益良多。很容易自认为“是的,这样做有意义”并且认为自己已理解了书上的内容,但是完成几个练习将会帮助你巩固头脑中记忆的内容。此外,这样做还有助于发现应用本章讲解的概念的新方式。
通常来说,当我阅读一般新的技术书籍时,我会自己完成每个示例,更改问题以了解如果尝试该书作者没有提到的做法将会出现什么情况。我尽可能多地解答各种问题和练习,直到我认为做更多的示例不会再学到任何新的知识为止。然后,我才会继续往后学习。了解章节中的概念是一回事,而设法将它应用到对您有意义的数据上是另一回事。
在掌握了本书的思想后,可以将本书用做参考资料。当开始新的项目时,可能想参考第4章“了解用户需求”来更新自己脑海中有关向用户询问以真正了解其需求的各种问题。
可以访问本书的网站和www.tupwk.com.cn/downpage下载补充材料,如询问用户的问题清单和关键技术的简略摘要。这些材料包含在本书中但是也可以从本书的网站上方便地下载。
此外,还可以访问本书的网站以查看更新和补遗。如果读者发现印刷错误或需要额外解释的地方,我将会在网站上公布更新。
最后,如果对确实难理解的概念感到困惑并需要少许帮助的话,那么可以向RodStephens@vbhelper.com发送电子邮件,我们会设法帮您解决问题。
教学时的注意事项
数据库编程很麻烦。对于已经沉迷于数据设计乐趣的人来说,数据规范化令人激动,一定程度上降低数据库的规范化以优化其性能也会带来一点满足。但是让我们正视现实,对于新手来说,数据库设计和开发是一项乏味的工作。
对于基本概念,基本上没有什么可以操作的,但是对于数据实际可以进行任何操作。有时候,讲解如何设计一个简单的存货清单系统很有用,但是这并不意味着不能使用其他设计示例来引起学生的注意。与学生个人经历相关的数据或者那些令人震惊的数据能使他们保持警醒(大多数人知道给清醒的学生上课比较容易)。
本书中的示例旨在验证手边的主题,但是并非所有主题都是严格面向业务的。本书将设法使内容涵盖从严肃到轻松的非常宽泛的主题。为了使学生感兴趣并保持活跃,还可以添加来源于个人经历和学生兴趣范围内的新示例。
我在上课时使用了涉及运动队(尤其是当地的比赛)、音乐(结合古典音乐,如Bach、Beethoven和Tone-Loc)、课堂上的学生(但是确保不要将任何人都置于现场)、电视表演和明星、喜剧演员和政治候选人的示例。
就练习而言,应鼓励学生设计他们个人觉得有用的数据库。我曾经让学生构建数据库来跟踪他们喜欢的球员的统计信息、编制他们收集的DVD或CD的目录清单、跟踪文件和搜索各种食谱、跟踪角色扮演游戏的人物、记录有关经典轿车的信息以及安排运动比赛日程(尽管比赛日程安排程序工作得并不太好——日程安排算法过于复杂)。一个学生甚至为其母亲的商业活动构建了一个虽小但完整的存货清单应用程序,他的母亲确实发现该程序很有用。我想他像其他人一样惊奇地发现自己已经学到了一些有用的东西。
当学生发现作业有趣且有用处,他们在感情上会更愿意投入并会像通常玩计算机游戏那样投入大量精力和高度注意力来构建数据库。他们可以花费数小时精心创建数据库来跟踪WoW联盟,而这仅仅是为了完成5分钟的作业。他们可能无法捕获域/键范式的每处细微差别,但是他们很可能学会构建实用数据库的方法。
学习时的注意事项
如果您是学生并且偷看了上一节“教学时的注意事项”,那应该感到羞愧。如果没有看过上一节,那么现在就看一下本节。
构建有用的数据库可能需要做很多工作,但是当完成数据库后有理由相信它是有趣的和有用的。在刚开始阅读本书时,挑选某类您觉得有用的数据库(阅读上一节来了解这样一些思想)并在通读正文的时候思考它。当本书谈到创建一个初始设计时,为您的数据库大致规划一下设计。当本书讲到规范化数据库的方法时,规范化您的数据库。当您完成练习时,思考如何将它们应用到自己设想的数据库中。
不要害怕询问老师针对某个特定的作业能否使用自己的数据库而不是书上建议的数据库(除非您的老师向不遵循其要求的学生分配额外的作业,这种情况下还是遵照老师的要求)。通常而言,一个老师的思维过程非常简单,“不关心学生使用什么样的数据库,只要能掌握学习的内容即可”。您的数据库可能需要包含多个相关的表以获得特定练习要求的复杂性,但是使数据库变得较为复杂并不是太困难。
当按照这些要求完成作业时,将会很有希望知道比现在更多的有关数据库设计的知识,并且如果坚持这样做,可能就可以获得有实际用处的数据库。如果顺利的话,还将会掌握今后如何设计其他有用的数据库(当完成自己的设计时,可以给我发电子邮件RodStephens@vb-helper.com,好让我知道您构建的是什么数据库)。
源代码
在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点http://www.wrox.com/和http://www.tupwk.com.cn上下载。登录到站点http://www.wrox.com/,使用Search工具或使用书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。
注释:
由于许多图书的标题都很类似,所以按ISBN搜索是最简单的,本书英文版的ISBN是978-0-470-38549-4。
在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入http://www.wrox.com/dynamic/books/download.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。
勘误表
尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。
请给wkservice@vip.163.com发电子邮件,我们会检查您的反馈信息,如果是正确的,我们将在本书的后续版本中采用。
要在网站上找到本书英文版的勘误表,可以登录http://www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.com/misc-pages/booklist.shtml。
P2P.WROX.COM
要与作者和同行讨论,请加入p2p.wrox.com上的P2P论坛。这个论坛是一个基于Web的系统,便于您张贴与Wrox图书相关的消息和相关技术,与其他读者和技术用户交流心得。该论坛提供了订阅功能,当论坛上有新的消息时,它可以给您传送感兴趣的论题。Wrox作者、编辑和其他业界专家和读者都会到这个论坛上来探讨问题。
在http://p2p.wrox.com上,有许多不同的论坛,它们不仅有助于阅读本书,还有助于开发自己的应用程序。要加入论坛,可以执行下面的步骤。
(1) 进入p2p.wrox.com,单击Register链接。
(2) 阅读使用协议,并单击Agree按钮。
(3) 填写加入该论坛所需要的信息和自己希望提供的其他信息,单击Submit按钮。
(4) 您会收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。
不加入P2P也可以阅读论坛上的消息,但要张贴自己的消息,就必须加入该论坛。
加入论坛后,就可以张贴新消息,响应其他用户张贴的消息。可以随时在Web上阅读消息。如果要让该网站给自己发送特定论坛中的消息,可以单击论坛列表中该论坛名旁边的Subscribe to this Forum图标。
关于使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作情况以及P2P和Wrox图书的许多常见问题。要阅读FAQ,可以在任意P2P页面上单击FAQ链接。