目录
1.11.1 基于对象的数据模型(object-oriented data model)
第一章 引言
1.1 数据库系统的应用
数据库管理系统 Database Management System - DBMS: 由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这些数据的集合通常叫做数据库(Database)。
数据库系统的目的:
- 管理大量信息:信息存储结构的定义 + 信息操作机制的提供
- 存储信息的安全性保证:系统崩溃或者有人企图越权访问时也能保障信息的安全性。
- 避免数据被多用户共享时可能的异常结果
1.2 数据库系统的目标
- 文件处理系统 file processing system: (DBMS未出现之前的存储方式)
- 永久记录被存储在不同的文件中,人们编写不同的应用程序来将记录从有关文件中取出或者加入到适当的文件中。
- 缺点:
- 数据的冗余和不一致(data redundancy and inconsistency):不同的文件可能会有不同的结构;相同的信息可能在几个地方重复存储导致冗余;冗余导致存储和访问开销增大,还可能导致数据不一致性
- 数据不一致性(data inconsistency):即统一数据的不同副本不一致
- 数据访问困难(difficulty in accessing data):无法方便而高效的获取所需数据
- 数据孤立(difficulty in accessing data):数据分散在各个文件中,文件的格式可能不同,编写新的程序来检索适当数据是困难的。
- 完整性问题(integrity problem):数据中存储的数据需要满足特定的一致性约束(consistency constraint)。传统的文件处理系统维护数据的一致性约束非常困难。
- 例如:A转账给B,A和B的账户的总劲儿要保证不变。
- 原子性问题(atomicity problem):保证在发生故障时,数据能够被恢复到故障发生以前的一致的状态是非常重要的。
- 原子性:指的是一组操作,要么都发生,要么都不发生。而传统的文件处理系统很难保持原子性。
- 并发访问异常 (concurrent-access anomaly):为了提高系统的总体性能及加快响应速度,许多系统允许多个用户同时更新数据。这种情况下,并发的更新操作可能会相互影响,导致数据不一致。如何管理协调不同的应用程序访问,对传统的文件处理系统而言很困难。
- 例如:A账户余额100元,用户1和用户2同时分别从中取出50和10元,这时如果并发执行就可能导致账户A处于一种错误的状态。假设每个取款操作对应执行的程序读取的是原始账户余额,在其上减去取款的金额再写会结果。那么,如果是并发执行,可能它们读到的余额都是100元,最后写会结果可能是50或90元,而不是正确的40元。
- 安全性问题(security problem):不同的用户对不同的数据有不同的权限。并非所有用户都可以访问你所有数据。传统的文件系统很难实现管理权限和安全性约束。
1.3 数据视图
数据库系统的一个主要目的就是:给用户提供数据的抽象视图,即系统隐藏关于数据存储和维护的某些细节。
1.3.1 数据抽象
数据库系统通过如下三个层次的抽象,来向数据库系统用户屏蔽复杂性:
1.3.2 实例和模式
实例(instance):特定时刻存储在数据库中信息的集合称作数据库的一个实例。
模式(schema):数据库的总体设计称为数据库schema。数据库模式即使发生变化,也不频繁。
根据前面所探讨的不同的抽象层次,数据库系统可以分为几种不同的模式:
- 物理模式(physical schema):在物理层描述数据库的设计
- 逻辑模式(logical schema):逻辑层描述数据库的设计。程序员使用逻辑模式来构造数据库应用程序。
- 数据库在视图层也可以有几种模式,有时称为子模式(subschema),它描述了数据库的不同视图。
应用程序如果不依赖于物理模式,他们就被称作具有物理数据独立性(physical data independence),因此即使物理模式放生改变也不会影响它们。
1.3.3 数据模型
数据模型(data model): 数据模型是数据库的基础。数据模型是一个描述数据、数据联系、数据语义和一致性约束的概念工具的集合。数据模型提供了一种描述物理层,逻辑层和视图层数据库设计的方式。
数据模型的种类:
- 关系模型(relational model): 关系模型用表的结合来表示数据和数据间的联系。关系模型是使用最广泛的数据模型,当今大量数据库系统都基于这种关系模型。(第2-8章)
表、列、记录。 每个表有多个列,每列有唯一的列名。 关系模型是一种基于记录的模型。基于记录的模型指的是数据库是由若干种固定格式的记录构成的。 每个表包括某种特定类型的记录。每个记录类型定义了固定数目的字段(或属性)。表的列对应于记录类型的属性。 |
- 实体-联系模型(entity-relationship model):E-R模型被广泛的用于数据库设计。E-R数据模型基于对现实世界的这样的一种认识:现实世界由一组称作实体的基本对象以及这些对象间的联系构成。实体是现实世界中可区别于其他对象的一件”事情“或”物体“。(第7章)
- 基于对象的数据模型(object-based data model):面向对象的数据模型可以看成是对E-R模型增加了封装、方法(函数)和对象标识等概念后的扩展。它结合了面向对象的数据模型和关系数据模型的特征。(第22章)
- 半结构化数据模型(semistructured data model):半结构化数据模型允许那些相同类型的数据项含有不同的属性集的数据定义。这与前面的数据模型形成对比:在前面数据模型中所有特定类型的数据项必须具有相同额属性集。可扩展标记语言(eXtensible Markup Language, XML)被广泛的用于表示半结构化数据结构。(第23章)
1.4 数据库语言
数据定义语言(data-definition language,DDL):定义数据库模式。
数据操纵语言 (data-manipulation language,DML):来表达数据库的查询和更新。
1.4.1 数据操纵语言 DML
数据操纵语言(DML)使得用户可以访问或操纵那些按照某种适当的数据模型组织起来的数据。
访问类型包括:增删改查。
两种基本的数据操纵语言:
- 过程化DML(procedural DML):要求用户指定需要什么数据以及如果获得这些数据。
- 声明式DML(declarative DML,也称非过程化DML):只要求用户指定需要获得什么数据,而不需要指定如何获得这些数据。
查询(Query)是要求对信息进行检索的语句。DML中涉及信息检索的部分称为查询语言(query language)。
1.3节中的抽象层次不仅可以用于定义或构造数据,还可以用于操纵数据。
- 在物理层我们必须定义可高效访问的算法
- 在更高的层次,我们则更强调易用性,目标是使得用户能够高效的和系统交互。
1.4.2 数据定义语言 DDL
数据定义语言(DDL)用来定义数据库模式。
DDL以一些指令(语句)作为输入,生成一些输出。
DDL的输出放在数据字典(data dictionary)中,数据字典包含了元数据(metadata),元数据是关于数据的数据。
可以将数据字典看成一种特殊的表,该表只能由数据库系统本身来访问和修改。
在读取和修改数据前,数据系统要参考数据字典。
数据存储和定义语言(data storage and definition)是一种特殊的DDL,用来定义数据库系统所使用的存储结构和访问方式。
一致性约束(consistency constraint):存储在数据库中的数据需要满足一致性约束。
如:假设大学要求一个系的账户余额不能为负值。
DDL语言提供了指定这样的约束的工具,每当数据库被更新时,数据库系统都会自动检查这些约束。
- 常见的完整性约束有:
- 域约束(domain constraint):每个属性都必须对应于一个所有可能的取值构成的域(如:整数型、字符型等)。每当有新数据插入到数据库中,数据库系统就能方便的进行域约束的检测。
- 参照完整性(referential integrity):一个关系中给定的属性集上的取值必须也在另一关系的某一属性集的取值中出现(参照完整性)。数据库的修改会导致参照完整性的破坏,当参照完整性被破坏时,通常的处理是拒绝执行该操作。例如:每门课程列出的系必须是实际存在department表的dept_name属性中。
- 断言(assertion):一个断言就是数据库需要时刻满足的某一条件。域约束和参照完整性是断言的特殊形式。
- 授权(Authorization):授权可以实现不同的用户在数据库中不同的数据上允许不同的访问类型。
- 读权限 (read authorization):允许读取数据,但是不能修改数据
- 插入权限(insert authorization):允许插入数据,但是不能修改已有数据
- 更新权限(update authorization):允许修改数据,但是不能删除数据
- 删除权限(delete authorization):允许删除数据
1.5 关系数据库
1.5.1 表
表、列、记录。
每个表有多个列,每列有唯一的列名。
关系模型是一种基于记录的模型。基于记录的模型指的是数据库是由若干种固定格式的记录构成的。
每个表包括某种特定类型的记录。每个记录类型定义了固定数目的字段(或属性)。表的列对应于记录类型的属性。
1.5.2 数据操纵语言
SQL查询语言是非过程化的。
1.5.3 数据定义语言
通过DDL,可以定义表、完整性约束、断言等。
1.5.4 来自应用程序的数据库访问
为了访问数据库,DML语句需要由宿主语言来执行。有两种途径:
- 通过应用程序接口(过程集),它可以将DML和DDL的语句发送给数据库,再取回结果。
与C语言一起使用的开放数据库连接是ODBC标准,是一种常用的应用程序接口标准。
Java数据库连接(JDBC)标准为Java语言提供了相应的特性。
- 通过扩展宿主语言的语法,在宿主语言的程序中嵌入DML调用。通常用一个特殊字符作为DML调用的开始,并且通过预处理器,称为DML预编译器(DML precompiler),来将DML语句转变成宿主语言中的过程调用。
1.6 数据库设计
数据库设计的主要内容是数据库模式的设计。
1.6.1 设计过程
- 全面刻画预期的数据库用户的数据需求
输出: 用户需求的规格文档 参与者:数据库设计者,领域专家,数据库用户 |
- 概念设计( conceptual-design)阶段
设计者选择一个数据模型,并运用选定的数据模型的概念,将那些需求转换成一个数据库的概念模式。 生成的概念模式提供了企业的详细概述。 设计者再复审这个模式,确保无冲突,也可以去掉一些冗余。 概念设计阶段需要:
解决方案有:
|
- 逻辑设计(logical-design)阶段:设计者将高层的概念模式映射到要使用的数据库系统的实现数据模型上
- 物理设计(physical-design)阶段
设计者将逻辑设计阶段生成的基于特定于系统的数据库模式用到物理设计阶段。 在该阶段中指定数据库的物理特性,包括:文件组织的形式以及内部的存储结构。 |
1.6.2 大学机构的数据库设计
初始的用户需求说明可以通过与数据库用户交流以及设计者自己对大学机构的分析得到。例如:
- 大学有多个系,每个系有自己唯一的名字(dept_name),坐落在特定的建筑物(building)中,有自己的经费预算(budget)
- 每个系有课程列表.......
1.6.3 E-R模型
E-R模型使用一组称作实体的基本对象,以及这些对象之间的联系。
实体(entity):代表一个物体或一件事情。例如:每个人是一个实体。
实体集(entity set):同一类型的所有实体构成一个实体集。
数据库中的实体通过属性(attribute)集合来描述,如:dept_name,building,budget等可以描述大学中的一个系。
联系(Relationship)是几个实体之间的关联。例如:member将老师和他所在的系关联起来。
数据库的逻辑结构(模式)可以使用E-R图进行图形化表示。
最常用的绘制E-R图的方法是采用同意建模语言(Unified Modeling Language, UML)。
UML中,E-R图如下表示:
- 实体集 用 矩形框表示,实体名在头部,属性名称在下部
- 联系集用连接一对相关的实体集的菱形表示,联系名放在菱形内部。
- E-R模型还能描绘数据库必须遵守的对其内容的一些约束。例如:映射基数(mapping cardinality),表示通过某个联系集能与一实体进行关联的实体数目。
1.6.4 规范化
规范化过程:目标是生成一个关系模式集合,使得我们存储信息时没有不必要的冗余,同时又能很轻易的检索数据。它是设计关系数据库时常用到的另外一种方法。涉及:
- 范式(normal form)
- 函数依赖(functional dependency)
一个不好的设计将包括如下不良特性:
- 信息重复 ===> 导致浪费存储空间,更新代价加大
- 缺乏表达某些信息的能力 ===> 无法直接表达一些信息/概念
空值(null):表示这个值不存在或者未知。未知值可能是缺失(该值存在,但是我们没有得到)或者不知道(我们不知道该值存不存在)
1.7 数据存储和查询
数据库系统的功能部件大致可分为:存储管理器和查询处理部件。
1.7.1 存储管理器
存储管理器是数据库中负责在数据库中存储的低层数据 与 应用程序 以及 向系统提交的查询 之间 提供接口的部件。
存储管理器负责与文件管理器进行交互。原始数据通过操作系统提供的文件系统存储在磁盘上。
存储管理器将各种DML语句翻译为底层文件系统命令。
因此,存储管理器负责数据库中数据的存储、检索与更新。
存储管理部件包括:
- 权限及完整性管理器(authorization and integrity manager):检测是否满足完整性约束,并检查试图访问数据的用户的权限。
- 事务管理器(transaction manager):保证即使发生了故障,数据库也保持在一致的状态,并保证并发事务不会发生冲突。事务管理器包括恢复管理器(recovery manager)和并发控制管理器(concurrency-control manager)。
- 文件管理器(file manager):管理磁盘存储空间的分配,管理用于表示磁盘上所存储信息的数据结构
- 缓冲区管理器(buffer manager):负责将数据从磁盘读取到内存中来,并决定哪些数据应被缓冲存储到内存中。缓冲区管理器是数据库系统中的一个关键部分,因为它使得数据库能够处理比内存更大的数据。
存储管理器实现了几种数据结构,作为物理实现的一部分:
- 数据文件(data files):存储数据库自身
- 数据字典(data dictionary):存储关于数据库结构的元数据,尤其是数据库模式。
- 索引(index):提供数据项的快速访问。数据库索引提供了指向包含特定值的数据的指针。
1.7.2 查询处理器
查询处理器组件包括:
- DDL解释器(DDL Integrator):解释DDL语句并将这些定义记录在数据字典中。
- DML编译器(DML compiler):将查询语言中的DML语句翻译成一个执行方案,包括一系列查询执行引擎能够理解的低级命令。DML编译器还能进行查询优化(query optimization),就是从多个执行方案中找出代价最小的
- 查询执行引擎(query evaluation engine):执行有DML编译器生成的低级命令。
1.8 事务管理
事务(transaction):是数据库应用中完成单一逻辑功能的操作集合。每一个事务是一个既具有原子性,也具有一致性的单元。
ACID: 数据库管理系统(DBMS)在寫入或更新資料的過程中,為保證事务是正確可靠的,所必須具備的四个特性:
- 原子性(atomicity):一個事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
- 一致性(consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
- 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性(durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务管理器包括的组件有:
- 恢复管理器(recovery manager)需要保持数据库的原子性+持久性:
没有故障发生==》所有事务均成功完成 ===》保持原子性很容易
有故障发生==》事务不总能成功执行 ===》为了保证原子性,失败的事务必须对数据库状态不产生任何影响===》数据库需要恢复到该失败事务开始执行前的状态===》因此,需要进行故障恢复(failure recovery),即:检查系统故障并将数据库恢复到故障发生以前的状态。
- 并发管理控制器(concurrency-control manager):
控制并发事物间的相互影响,保证数据库的一致性
1.9 数据库体系结构
两层体系结构:客户-数据库系统
三层体系结构:客户-应用服务器-数据库系统
1.10 数据挖掘和信息检索
数据挖掘(Data mining):半自动的分析大型数据库并从中找出有用的模式/知识的过程。
规则(Rule):从数据库中发现的某些类型的知识可以用一套规则表示。
数据仓库(Data warehouse):从多个数据来源收集数据,建立统一的模式,驻留在单个节点上。
信息检索(Information Retrieval):查询非结构化的文本数据称为信息检索。
信息检索系统与数据库系统的异同?
- 他们都是基于辅助存储器的数据存储和检索。
- 区别在于他们强调的重点不同。信息检索系统重点强调:基于关键词的查询,文档与查询的相似度,以及文档的分析、分类和索引。
1.11 特种数据库
1.11.1 基于对象的数据模型(object-oriented data model)
面向对象模型:在E-R模型的基础上,增加了封装、方法(函数)和对象标识。它支持丰富的类型系统,包括集合和结构类型。
面向对象程序设计的关键概念:继承、对象标识、信息封装、以及对外提供方法作为访问对象的接口。
现在主流的数据库厂商都支持对象-关系数据模型(object-relational data model):将面向对象数据模型和关系数据模型的特点结合在一起的数据模型。它扩展了传统的关系模型,增加了新的特征如:结构和集合类型,以及面向对象特征。
1.11.2 半结构化数据模型
半结构化数据模型允许具有相同类型的数据项有不同的属性集的数据说明。
XML语言在数据交换中的应用非常重要。
1.12 数据库用户和管理员
使用数据库的人包括:数据库用户 和 数据库管理员
1.12.1 数据库用户和用户界面
数据库系统的用户可分为四类:
- 无经验的用户(naive user):通过激活事先已经写好的应用程序同数据库系统进行交互,如表格界面。
- 应用程序员(application programmer):百姓捏应用程序的计算机人员。快速应用开发(Rapid Application Development,APD)工具。
- 老练的用户(sophisticated user):不通过编程来与系统交互,而是用数据库查询语言或者数据分析软件来实现目的。分析员属于这一类用户。
- 专门的用户(specialized user):编写专门的、不适合与传统数据处理框架的数据库应用的富有经验的用户。这样的应用包括:计算机辅助设计系统,知识库和专家系统等。
1.12.2 数据库管理员
数据库管理员(database administrator, DBA)对数据库系统进行集中控制。
DBA的作用包括:
- 模式定义(schema definition):DBA通过DDL定义数据库模式
- 存储结构及存取方法定义(storage structure and access-method definition)
- 模式及物理组织的修改(schema and physical-organization modification),以反映需求变化,或为提高性能而选择不同的物理组织。
- 数据访问授权(granting of authorization for data access): 规定不同用户可以访问的数据
- 日常维护(routine maintenance),包括:
- 定期备份数据库
- 确保正常运转时所需的空余磁盘空间,并且在需要时升级磁盘空间
- 监视数据库的运行,并确保数据库的性能不因一些用户提交了花费时间较多的任务就下降很多。
总结
- 数据库管理系统(DBMS):由相互关联的数据集合 及 一组用于访问这些数据的程序组成。
- DBMS的主要目标:为人们提供方便、高效的环境来存储和检索数据
- 数据库系统设计用来存储大量的信息。数据的管理包括:
- 信息存储结构的定义,
- 提供处理信息的机制,
- 提供存储信息的安全性保证,以应对系统崩溃或者非授权访问企图,以及并发访问数据可能导致的异常结果。
- 数据库系统的一个主要目的:是为用户提供数据的抽象视图,隐藏数据存储和维护的细节。
- 数据库结构的基础是数据模型(data model)。它是一个用于描述数据、数据之间的联系、数据语义和数据约束的概念工具的集合。
- 数据模型的种类:关系数据模型,面向对象模型、对象-关系模型、半结构化的数据模型
- 数据操纵语言DML,使得用户可以访问和操纵数据的语言。目前广泛使用的是非过程化的DML,用户只需要知道需要什么数据,而不需要知道如何获得数据
- 数据定义语言DDL:定义数据库模式 和 数据的其他特性的语言
- 数据库设计主要包括数据库模式的设计。E-R模型广泛用于数据库设计,它提供了一种方便的图形化方式来观察数据、联系和约束
- 数据库由几个子系统构成:
- 存储管理器(storage manager):在数据库中存储的低层数据与应用程序和向系统提交的查询之间提供接口。包括:
- 事务管理器
- 故障恢复器
- 并发管理控制器。
- 缓冲区管理器
- 文件管理器
- 权限及完整性管理器。
- 事务管理器
- 查询处理器(query processor):编译和执行DDL和DML。包括
- DDL解释器
- DML编译器
- 查询执行引擎。
- 存储管理器(storage manager):在数据库中存储的低层数据与应用程序和向系统提交的查询之间提供接口。包括:
- 事务管理(transaction management):保证不管是否有故障发生,数据库都是处于一致状态。并保证并发事务的执行不会互相冲突。
- 数据库系统的体系结构:集中式/分布式。
- 两层结构/三层体系结构
- 数据挖掘、信息检索
- 四类数据库用户 + DBA
实践习题
- 1. 陈述数据库系统的两个缺点
答案: (a)安装和配置数据库系统需要相关知识,金钱,技能和时间 (b)数据库的复杂性节能会导致性能较差 |
- 2. 列举出Java和C++之类的语言中的类型说明系统和数据库系统中使用的数据定义语言的5个不同之处。
答案: (a)DDL语句的执行结果是在数据库创建一个对象;而编程语言类型声明只是程序中使用的抽象。 (b)DDL允许指定一致性约束,而编程语言通常不支持这点。约束包括域约束(domain constraint)和参考完整性(referential integrity) (c)DDL能够给用户授权,而编程语言则不支持,最多可以限制属性和方法是否能够被其他类访问。 (d)编程语言的类型说明系统通常包含更丰富的类型;而DDL通常只支持一些基本类型(如:数字和字符串),虽然有一些也能够支持复杂类型,如:数组和对象。 (e)DDL还能够指定特定类型的属性之间的关系;而编程语言允许创建对象的集合。 |
- 3. 列出一个企业创建数据库的6个步骤
答案:
|
- 6. 在web查找中使用的关键字和数据库查询很不一样,列出二者在查询表达式和查询结果之间的主要差异。
答案: web查找是通过一组关键字进行查找,其结果通常是一组排序过的URL,以及一些URL相关的消息嫖断。而数据库查找支持复杂查询,其结果通常是一个table。 |
习题
- 8. 列出文件处理系统和DBMS的主要差异。
答案:
|
- 9. 解释物理数据独立性的概念,以及它在数据库系统中的重要性。
答案: 物理数据独立性是指修改物理层schema而不必重写应用程序的能力。这些修改包括从未阻塞的记录存储更改为阻塞的记录存储,或者从顺序访问文件更改为随机访问文件。这样的修改可能是向记录添加一个字段; 应用程序的视图层对程序隐藏了此更改。 |
- 10. 列出DBMS的五个职责,并说明如果职责没有被履行会有哪些问题。
答案:
|
- 11. 给出至少两个理由说明为什么DBMS使用声明式查询语言,如SQL,而不是只提供C或者C++的函数库来执行数据操作。
答案:
|
- 12. 解释用图1-4中的表来设计会导致哪些问题
答案:
|
- 13. 数据库管理员的5种主要作用是什么?
答案:
|
- 14. 解释两层和三层体系结构之间的区别。对Web应用来说哪一种更合适?为什么?
答案: 在两层的体系结构中,应用程序运行在client machine上,并直接与服务器上的数据库系统进行交互; 在三层的体系结构中,应用程序运行在client machine上,与application server进行交互,而不和数据库系统直接交互。application server与数据库系统进行通信。 三层体系结构更适合web应用。因为可以将业务逻辑封装在application server上,而进行解耦。 |