文档内容
《数据库系统讲义》
第1章 绪论
第一节 数据库系统概述
1.1.1 数据、数据库、数据库管理系统、数据库系统
数据、数据库、数据库管理系统和数据库系统是与数据库技术密切相关的四个基本概念。
一、数据(DATA)
数据是数据库中存储的基本对象。数据在大多数人头脑中的第一个反应就是数字。其实数字只是
最简单的一种数据,是数据的一种传统和狭义的理解。广义的理解,数据的种类很多,文字、图形、图像、
声音、学生的档案记录、货物的运输情况等,这些都是数据。
可以对数据做如下定义:描述事物的符号记录称为数据。描述事物的符号可以是数字,也可以是文
字、图形、图像、声音、语言等,数据有多种表现形式,它们都可以经过数字化后存入计算机。
为了了解世界,交流信息,人们需要描述这些事物。在日常生活中直接用自然语言(如汉语)描述。
在计算机中,为了存储和处理这些事物,就要抽出对这些事物感兴趣的特征组成一个记录来描述。例如:
在学生档案中,如果人们最感兴趣的是学生的姓名、性别、年龄、出生年月、籍贯、所在系别、入学时间,
那么可以这样描述:
(李明,男,21,1972,江苏,计算机系,1990)
因此这里的学生记录就是数据。对于上面这条学生记录,了解其含义的人会得到如下信息:李明是
个大学生,1972年出生,男,江苏人,1990年考入计算机系;而不了解其语义的人则无法理解其含义。可
见,数据的形式还不能完全表达其内容,需要经过解释。所以数据和关于数据的解释是不可分的,数据
的解释是指对数据含义的说明,数据的含义称为数据的语义,数据与其语义是不可分的。
二、数据库(DataBase,简称DB)
数据库,顾名思义,是存放数据的仓库。只不过这个仓库是在计算机存储设备上,而且数据是按一
定的格式存放的。
人们收集并抽取出一个应用所需要的大量数据之后,应将其保存起来以供进一步加工处理,进一
步抽取有用信息。在科学技术飞速发展的今天,人们的视野越来越广,数据量急剧增加。过去人们把数
据存放在文件柜里,现在人们借助计算机和数据库技术科学地保存和管理大量的复杂的数据,以便能
方便而充分地利用这些宝贵的信息资源。
所谓数据库是长期储存在计算机内、有组织的、可共享的数据集合。数据库中的数据按一定的数据
模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
三、数据库管理系统(DataBase Management System,简称DBMS)
了解了数据和数据库的概念,下一个问题就是如何科学地组织和存储数据,如何高效地获取和维
护数据。完成这个任务的是一个系统软件——数据库管理系统。
数据库管理系统是位于用户与操作系统之间的一层数据管理软件。它的主要功能包括以下几个方
面:
1. 数据定义功能
DBMS提供数据定义语言(Data Definition Language,简称DDL),用户通过它可以方便地定义对数
据库中的数据对象进行定义。
2. 数据操纵功能
DBMS还提供数据操纵语言(Data Manipulation Language,简称DML),用户可以使用DML操纵
1数据实现对数据库的基本操作,如查询、插入、删除和修改等。
3. 数据库的运行管理
数据库在建立、运用和维护时由数据库管理系统统一管理、统一控制,以保证数据的安全性、完整
性、多用户对数据的并发使用及发生故障后的系统恢复。
4. 数据库的建立和维护功能
它包括数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能
监视、分析功能等。 这些功能通常是由一些实用程序完成的。
数据库管理系统是数据库系统的一个重要组成部分。
四、数据库系统(DataBase System,简称DBS)
数据库系统是指在计算机系统中引入数据库后的系统构成,一般由数据库、数据库管理系统(及其
开发工具)、应用系统、数据库管理员和用户构成。应当指出的是,数据库的建立、使用和维护等工作只
靠一个 DBMS 远远不够,还要有专门的人员来完成,这些人被称为数据库管理员(Data Base
Administrator,简称DBA)。
在一般不引起混淆的情况下常常把数据库系统简称为数据库。
1.1.2 数据管理技术的产生和发展
数据库技术是应数据管理任务的需要而产生的。
数据的处理是指对各种数据进行收集、存储、加工和传播的一系列活动的总和。数据管理则是指对
数据进行分类、组织、编码、存储、检索和维护,它是数据处理的中心问题。
人们借助计算机进行数据处理是近三十年的事。研制计算机的初衷是利用它进行复杂的科学计算。
随着计算机技术的发展,其应用远远地超出了这个范围。在应用需求的推动下,在计算机硬件、软件发
展的基础上,数据管理技术经历了人工管理、文件系统、数据库系统三个阶段。
1.1.3 数据库系统的特点
与人工管理和文件系统相比,数据库系统的特点主要有以下几个方面。
一、数据结构化
数据结构化是数据库与文件系统的根本区别。
在文件系统中,相互独立的文件的记录内部是有结构的。传统文件的最简单形式是等长同格式的
记录集合。
二、数据的共享性高,冗余度低,易扩充
数据库系统从整体角度看待和描述数据,数据不再面向某个应用而是面向整个系统,因此数据可
以被多个用户、多个应用共享使用。数据共享可以大大减少数据冗余,节约存储空间。数据共享还能够
避免数据之间的不相容性与不一致性。
所谓数据的不一致性是指同一数据不同拷贝的值不一样。采用人工管理或文件系统管理时,由于
数据被重复存储,当不同的应用使用和修改不同的拷贝时就很容易造成数据的不一致。在数据库中数
据共享,减少了由于数据冗余(同一数据存储在不同的数据文件中的现象)造成的不一致现象。
由于数据面向整个系统,是有结构的数据,不仅可以被多个应用共享使用,而且容易增加新的应用,
这就使得数据库系统弹性大,易于扩充,可以适应各种用户的要求。可以取整体数据的各种子集用于不
同的应用系统,当应用需求改变或增加时,只要重新选取不同的子集或加上一部分数据便可以满足新
的需求。
三、数据独立性高
数据独立性是数据库领域中一个常用术语,包括数据的物理独立性和数据的逻辑独立性。
物理独立性是指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。也就是说,数据
在磁盘上的数据库中怎样存储是由DBMS管理的,用户程序不需要了解,应用程序要处理的只是数据
的逻辑结构,这样当数据的物理存储改变了,应用程序不用改变。
逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,也就是说,数据的逻辑结构
改变了,用户程序也可以不变。
数据独立性是由DBMS的二级映象功能来保证的,将在下面讨论。
2数据与程序的独立,把数据的定义从程序中分离出去,加上数据的存取又由DBMS负责,从而简化
了应用程序的编制,大大减少了应用程序的维护和修改。
四、数据由DBMS统一管理和控制
数据库的共享是并发的(Concurrency)共享,即多个用户可以同时存取数据库中的数据甚至可以同
时存取数据库中同一个数据。
为此,DBMS还必须提供以下几方面的数据控制功能:
(1) 数据的安全性(Security)保护
数据的安全性是指保护数据以防止不合法的使用造成的数据的泄密和破坏。使每个用户只能按规
定,对某些数据以某些方式进行使用和处理。
(2) 数据的完整性(Integrity)检查
数据的完整性指数据的正确性、有效性和相容性。完整性检查将数据控制在有效的范围内,或保证
数据之间满足一定的关系。
(3) 并发(Concurrency)控制
当多个用户的并发进程同时存取、修改数据库时,可能会发生相互干扰而得到错误的结果或使得
数据库的完整性遭到破坏,因此必须对多用户的并发操作加以控制和协调。
(4) 数据库恢复(Recovery)
计算机系统的硬件故障、软件故障、操作员的失误以及故意的破坏也会影响数据库中数据的正确
性,甚至造成数据库部分或全部数据的丢失。DBMS必须具有将数据库从错误状态恢复到某一已知的
正确状态(亦称为完整状态或一致状态)的功能,这就是数据库的恢复功能。
综上所述,数据库是长期存储在计算机内有组织的大量的共享的数据集合。它可以供各种用户共
享,具有最小冗余度和较高的数据独立性。DBMS在数据库建立、运用和维护时对数据库进行统一控制,
以保证数据的完整性、安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对系统进行
恢复。
数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心的新阶段。
这样既便于数据的集中管理,又有利于应用程序的研制和维护,提高了数据的利用率和相容性,提高了
决策的可靠性。
目前,数据库已经成为现代信息系统的不可分离的重要组成部分。具有数百万甚至数十亿字节信
息的数据库已经普遍存在于科学技术、工业、农业、商业、服务业和政府部门的信息系统。20世纪80年
代后不仅在大型机上,在多数微机上也配置了DBMS,使数据库技术得到更加广泛的应用和普及。
数据库技术是计算机领域中发展最快的技术之一。数据库技术的发展是沿着数据模型的主线展开
的。下面讨论数据模型。
第二节 数据模型
模型,特别是具体模型,人们并不陌生。一张地图,一组建筑设计沙盘,一架精致的航模飞机都是具
体的模型。一眼望去,就会使人联想到真实生活中的事物。模型是现实世界特征的模拟和抽象。数据模
型(Data Model)也是一种模型,它是现实世界数据特征的抽象。
数据库是某个企业、组织或部门所涉及的数据的综合,它不仅要反映数据本身的内容,而且要反映
数据之间的联系。由于计算机不可能直接处理现实世界中的具体事物,所以人们必须事先把具体事物
转换成计算机能够处理的数据。在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数
据和信息。通俗地讲数据模型就是现实世界的模拟。
现有的数据库系统均是基于某种数据模型的。因此,了解数据模型的基本概念是学习数据库的基
础。
数据模型应满足三方面要求:一是能比较真实地模拟现实世界;二是容易为人所理解;三是便于在
计算机上实现。一种数据模型要很好地满足这三方面的要求在目前尚很困难。在数据库系统中针对不
3同的使用对象和应用目的,采用不同的数据模型。
不同的数据模型实际上是提供给我们模型化数据和信息的不同工具。根据模型应用的不同目的,
可以将这些模型划分为两类,它们分属于两个不同的层次。
第一类模型是概念模型,也称信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库
设计。另一类模型是数据模型,主要包括网状模型、层次模型、关系模型等,它是按计算机系统的观点对
数据建模,主要用于DBMS的实现。
数据模型是数据库系统的核心和基础。各种机器上实现的DBMS软件都是基于某种数据模型的。
为了把现实世界中的具体事物抽象、组织为某一DBMS支持的数据模型,人们常常首先将现实世
界抽象为信息世界,然后将信息世界转换为机器世界。也就是说,首先把现实世界中的客观对象抽象为
某一种信息结构,这种信息结构并不依赖于具体的计算机系统,不是某一个DBMS支持的数据模型,而
是概念级的模型;然后再把概念模型转换为计算机上某一DBMS支持的数据模型。
1.2.1 数据模型的组成要素
一般地讲,数据模型是严格定义的一组概念的集合。这些概念精确地描述了系统的静态特性、动态
特性和完整性约束条件。因此,数据模型通常由数据结构、数据操作和完整性约束三部分组成。
一、数据结构
数据结构是所研究的对象类型的集合。这些对象是数据库的组成成分,它们包括两类,一类是与数
据类型、内容、性质有关的对象,例如网状模型中的数据项、记录,关系模型中的域、属性、关系等;一类
是与数据之间联系有关的对象,例如网状模型中的系型(Set Type)。
数据结构是刻画一个数据模型性质最重要的方面。因此,在数据库系统中,人们通常按照其数据结
构的类型来命名数据模型。例如层次结构、网状结构和关系结构的数据模型分别命名为层次模型、网状
模型和关系模型。
数据结构是对系统静态特性的描述。
二、数据操作
数据操作是指对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操
作规则。数据库主要有检索和更新(包括插入、删除、修改)两大类操作。数据模型必须定义这些操作的
确切含义、操作符号、操作规则(如优先级)以及实现操作的语言。数据操作是对系统动态特性的描述。
三、数据的约束条件
数据的约束条件是一组完整性规则的集合。完整性规则是给定的数据模型中数据及其联系所具有
的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效、
相容。
数据模型应该反映和规定本数据模型必须遵守的基本的通用的完整性约束条件。例如,在关系模
型中,任何关系必须满足实体完整性和参照完整性两个条件。
此外,数据模型还应该提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守
的特定的语义约束条件。例如,在学校的数据库中规定大学生入学年龄不得超过30岁,硕士研究生入
学年龄不得超过38岁,学生累计成绩不得有三门以上不及格等。
1.2.2 概念模型
概念模型实际上是现实世界到机器世界的一个中间层次。
概念模型用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数
据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言,因此概念模型一方面应该具
有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识,另一方面它还应该简单、清晰、
易于用户理解。
一、信息世界中的基本概念
信息世界涉及的概念主要有:
(1)实体(Entity)
客观存在并可相互区别的事物称为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联
系,例如,一个职工、一个学生、一个部门、一门课、学生的一次选课、部门的一次订货、老师与系的工作
4关系(即某位老师在某系工作)等都是实体。
(2)属性(Attribute)
实体所具有的某一特性称为属性。一个实体可以由若干个属性来刻画。例如学生实体可以由学号、
姓名、性别、出生年份、系、入学时间等属性组成。(94002268,张山,男,1976,计算机系,1994)这些属性
组合起来表征了一个学生。
(3)码(Key)
唯一标识实体的属性集称为码。例如学号是学生实体的码。
(4)域(Domain)
属性的取值范围称为该属性的域。例如,学号的域为8位整数,姓名的域为字符串集合,年龄的域
为小于38的整数,性别的域为(男,女)。
(5)实体型(Entity Type)
具有相同属性的实体必然具有共同的特征和性质。用实体名及其属性名集合来抽象和刻画同类实
体,称为实体型。例如,学生(学号,姓名,性别,出生年份,系,入学时间)就是一个实体型。
(6)实体集(Entity Set)
同型实体的集合称为实体集。例如,全体学生就是一个实体集。
(7)联系(Relationship)
在现实世界中,事物内部以及事物之间是有联系的,这些联系在信息世界中反映为实体(型)内部
的联系和实体(型)之间的联系。实体内部的联系通常是指组成实体的各属性之间的联系。实体之间的
联系通常是指不同实体集之间的联系。
两个实体型之间的联系可以分为三类:
① 一对一联系(1 : 1)
如果对于实体集A中的每一个实体,实体集B中至多有一个(也可以没有)实体与之联系,反之亦
然,则称实体集A与实体集B具有一对一联系,记为1 : 1。
例如,学校里面,一个班级只有一个正班长,而一个班长只在一个班中任职,则班级与班长之间具
有一对一联系。
② 一对多联系(1 : n)
如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B
中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记
为1 : n。
例如,一个班级中有若干名学生,而每个学生只在一个班级中学习,则班级与学生之间具有一对多
联系。
③ 多对多联系(m : n)
如果对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B
中的每一个实体,实体集A中也有m个实体(m≥0)与之联系,则称实体集A与实体集B具有多对多联
系,记为m : n。
二、概念模型的表示方法
概念模型是对信息世界建模,所以概念模型应该能够方便、准确地表示出上述信息世界中的常用
概念。概念模型的表示方法很多,其中最为著名最为常用的是P.P.S.Chen于1976年提出的实体-联系方
法(Entity-Relationship Approach)。该方法用E-R图来描述现实世界的概念模型,E-R方法也称为E-R
模型。
这里介绍E-R图的要点。
E-R图提供了表示实体型、属性和联系的方法:
· 实体型:用矩形表示,矩形框内写明实体名。
· 属性:用椭圆形表示,并用无向边将其与相应的实体连接起来。
· 联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边
旁标上联系的类型(1:1,1:n或m:n)。
5需要注意的是,如果一个联系具有属性,则这些属性也要用无向边与该联系连接起来。
实体-联系方法是抽象和描述现实世界的有力工具。用E-R图表示的概念模型独立于具体的DBMS
所支持的数据模型,它是各种数据模型的共同基础,因而比数据模型更一般、更抽象、更接近现实世界。
1.2.3 最常用的数据模型
目前,数据库领域中最常用的数据模型有四种,它们是:
· 层次模型 (Hierarchical Model)
· 网状模型 (Network Model)
· 关系模型 (Relational Model)
· 面向对象模型 (Object Oriented Model)
其中层次模型和网状模型统称为非关系模型。
非关系模型的数据库系统在20世纪70年代至80年代初非常流行,在数据库系统产品中占据了主
导地位,现在已逐渐被关系模型的数据库系统取代,但在美国等一些国家里,由于早期开发的应用系统
都是基于层次数据库或网状数据库系统的,因此目前仍有不少层次数据库或网状数据库系统在继续使
用。
20世纪80年代以来,面向对象的方法和技术在计算机各个领域,包括程序设计语言、软件工程、信
息系统设计、计算机硬件设计等各方面都产生了深远的影响,也促进数据库中面向对象数据模型的研
究和发展。
本章简要介绍层次模型、网状模型和关系模型。
数据结构、数据操作和完整性约束条件这三个方面的内容完整地描述了一个数据模型,其中数据
结构是刻画模型性质的最基本的方面。为了使读者对数据模型有一个基本认识,下面着重介绍三种模
型的数据结构。
注意:这里讲的数据模型都是逻辑上的,也就是说是用户眼中看到的数据范围。同时它们又都是能
用某种语言描述,使计算机系统能够理解,被数据库管理系统支持的数据视图。这些数据模型将以一定
的方式存储于数据库系统中,这是DBMS的功能,是DBMS中的存储模型。
在非关系模型中,实体用记录表示,实体的属性对应记录的数据项(或字段)。实体之间的联系在非
关系模型中转换成记录之间的两两联系。
1.2.4 层次模型
层次模型是数据库系统中最早出现的数据模型,层次数据库系统采用层次模型作为数据的组织方
式。层次数据库系统的典型代表是IBM公司的IMS(Information Management System)数据库管理系统,
这是1968年IBM公司推出的第一个大型的商用数据库管理系统,曾经得到广泛的使用。
层次模型用树形结构来表示各类实体以及实体间的联系。现实世界中许多实体之间的联系本来就
呈现出一种很自然的层次关系,如行政机构、家族关系等。
一、层次数据模型的数据结构
在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型。
(1)有且只有一个结点没有双亲结点,这个结点称为根结点;
(2)根以外的其他结点有且只有一个双亲结点。
在层次模型中,每个结点表示一个记录类型,记录(类型)之间的联系用结点之间的连线(有向边)
表示,这种联系是父子之间的一对多的联系。这就使得层次数据库系统只能处理一对多的实体联系。
每个记录类型可包含若干个字段,这里,记录类型描述的是实体,字段描述实体的属性。各个记录
类型及其字段都必须命名。各个记录类型、同一记录类型中各个字段不能同名。每个记录类型可以定义
一个排序字段,也称为码字段,如果定义该排序字段的值是唯一的,则它能唯一地标识一个记录值。
一个层次模型在理论上可以包含任意有限个记录型和字段,但任何实际的系统都会因为存储容量
或实现复杂度而限制层次模型中包含的记录型个数和字段的个数。
在层次模型中,同一双亲的子女结点称为兄弟结点(Twin 或 Sibling),没有子女结点的结点称为
叶结点。
二、多对多联系在层次模型中的表示
6前面已经说过,层次数据模型只能直接表示一对多(包括一对一)的联系,那么另一种常见联系-多
对多联系能否在层次模型中表示呢?答案是肯定的,否则层次模型就无法真正反映现实世界了。但是
用层次模型表示多对多联系,必须首先将其分解成一对多联系。分解方法有两种:冗余结点法和虚拟结
点法。下面用一个例子来说明这两种分解方法。
二、层次模型的数据操纵与完整性约束
层次模型的数据操纵主要有查询、插入、删除和更新。进行插入、删除、更新操作时要满足层次模型
的完整性约束条件。
进行插入操作时,如果没有相应的双亲结点值就不能插入子女结点值。例如在图1.18的层次数据
库中,若新调入一名教师,但尚未分配到某个教研室,这时就不能将新教员插入到数据库中。
进行删除操作时,如果删除双亲结点值,则相应的子女结点值也被同时删除。例如在图1.18的层次
数据库中,若删除网络教研室,则该教研室所有老师的数据将全部丢失。
进行更新操作时,应更新所有相应记录,以保证数据的一致性。例如在图1.20(b)的层次模型中,如
果一个学生要改姓名,则两处学生记录值的姓名字段都需更新。
三、层次数据模型的存储结构
层次数据库中不仅要存储数据本身,还要存储数据之间的层次联系。层次模型数据的存储常常是
和数据之间联系的存储结合在一起的。
四、层次模型的优缺点
层次模型的优点主要有:
· 层次数据模型本身比较简单。
· 对于实体间联系是固定的,且预先定义好的应用系统,采用层次模型来实现,其性能优于关系模
型,不低于网状模型。
· 层次数据模型提供了良好的完整性支持。
层次模型的缺点主要有:
· 现实世界中很多联系是非层次性的,如多对多联系、一个结点具有多个双亲等,层次模型表示这
类联系的方法很笨拙,只能通过引入冗余数据(易产生不一致性)或创建非自然的数据组织(引入虚拟
结点)来解决。
· 对插入和删除操作的限制比较多。
· 查询子女结点必须通过双亲结点。
· 由于结构严密,层次命令趋于程序化。
可见用层次模型对具有一对多的层次关系的部门描述非常自然、直观,容易理解。这是层次数据库
的突出优点。
1.2.5 网状模型
在现实世界中事物之间的联系更多的是非层次关系的,用层次模型表示非树形结构是很不直接的,
网状模型则可以克服这一弊病。
网状数据库系统采用网状模型作为数据的组织方式。网状数据模型的典型代表是DBTG系统,亦
称 CODASYL 系统。这是 70 年代数据系统语言研究会 CODASYL(Conference On Data System
Language)下属的数据库任务组(Data Base Task Group,简称DBTG)提出的一个系统方案。DBTG系
统虽然不是实际的软件系统,但是它提出的基本概念、方法和技术具有普遍意义。它对于网状数据库系
统的研制和发展起了重大的影响。后来不少的系统都采用DBTG模型或者简化的DBTG模型。例如,
Cullinet Software公司的 IDMS、Univac公司的DMS1100、Honeywell公司的IDS/2、HP公司的IMAGE
等。
一、网状数据模型的数据结构
在数据库中,把满足以下两个条件的基本层次联系集合称为网状模型:
(1)允许一个以上的结点无双亲;
(2)一个结点可以有多于一个的双亲。
网状模型是一种比层次模型更具普遍性的结构,它去掉了层次模型的两个限制,允许多个结点没
7有双亲结点,允许结点有多个双亲结点,此外它还允许两个结点之间有多种联系(称之为复合联系)。因
此网状模型可以更直接地去描述现实世界。而层次模型实际上是网状模型的一个特例。
与层次模型一样,网状模型中每个结点表示一个记录类型(实体),每个记录类型可包含若干个字
段(实体的属性),结点间的连线表示记录类型(实体)之间一对多的父子联系。
二、网状数据模型的操纵与完整性约束
网状数据模型一般来说没有层次模型那样严格的完整性约束条件,但具体的网状数据库系统(如
DBTG)对数据操纵都加了一些限制,提供了一定的完整性约束。
DBTG在模式DDL中提供了定义DBTG数据库完整性的若干概念和语句,主要有:
(1)支持记录码的概念,码即唯一标识记录的数据项的集合。例如,学生记录(如图1.25)中学号是
码,因此数据库中不允许学生记录中学号出现重复值。
(2)保证一个联系中双亲记录和子女记录之间是一对多的联系。
(3)可以支持双亲记录和子女记录之间某些约束条件。例如,有些子女记录要求双亲记录存在才能
插入,双亲记录删除时也连同删除。例如图1.26中SC记录就应该满足这种约束条件,学生选课记录值
必须是数据库中存在的某一学生,某一门课的选修记录。DBTG提供了“属籍类别”的概念来描述这类
约束条件。
三、网状数据模型的存储结构
网状数据模型的存储结构中关键是如何实现记录之间的联系。常用的方法是链接法,包括单向链
接、双向链接、环状链接、向首链接等,此外还有其他实现方法,如指引元阵列法、二进制阵列法、索引法
等依具体系统不同而不同。
四、网状数据模型的优缺点
网状数据模型的优点主要有:
· 能够更为直接地描述现实世界,如一个结点可以有多个双亲。
· 具有良好的性能,存取效率较高。
网状数据模型的缺点主要有:
· 结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌
握。
· 其DDL,DML语言复杂,用户不容易使用。
由于记录之间联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径,因
此,用户必须了解系统结构的细节,加重了编写应用程序的负担。
1.2.6 关系模型
关系模型是目前最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式。
1970年美国IBM公司San Jose研究室的研究员E.F.Codd首次提出了数据库系统的关系模型,开
创了数据库关系方法和关系数据理论的研究,为数据库技术奠定了理论基础。由于E.F.Codd的杰出工
作,他于1981年获得ACM图灵奖。
20世纪80年代以来,计算机厂商新推出的数据库管理系统几乎都支持关系模型,非关系系统的产
品也大都加上了关系接口。数据库领域当前的研究工作也都是以关系方法为基础。因此本书的重点也
将放在关系数据库上,下面四章将详细讲解关系数据库。
一、关系数据模型的数据结构
关系模型与以往的模型不同,它是建立在严格的数学概念的基础上的。这里只简单勾画一下关系
模型。在用户观点下,关系模型中数据的逻辑结构是一张二维表,它由行和列组成。
· 关系(Relation):一个关系对应通常说的一张表,如图1.27中的这张学生登记表;
· 元组(Tuple):表中的一行即为一个元组;
· 属性(Attribute):表中的一列即为一个属性,给每一个属性起一个名称即属性名。如上表有六列,
对应六个属性(学号,姓名,年龄,性别,系和年级);
· 主码(Key):表中的某个属性组,它可以唯一确定一个元组,如图1.27中的学号,可以唯一确定
一个学生,也就成为本关系的主码;
8· 域(Domain):属性的取值范围,如人的年龄一般在1~150岁之间,大学生年龄属性的域是(14~
38),性别的域是(男,女),系别的域是一个学校所有系名的集合;
· 分量:元组中的一个属性值;
· 关系模式:对关系的描述,一般表示为:
关系名(属性1,属性2,…,属性n)
例如上面的关系可描述为:
学生(学号,姓名,年龄,性别,系和年级)
在关系模型中,实体以及实体间的联系都是用关系来表示。例如学生、课程、学生与课程之间的多
对多联系在关系模型中可以如下表示:
学生(学号,姓名,年龄,性别,系和年级)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)
关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件,这些规范条件中最基
本的一条就是,关系的每一个分量必须是一个不可分的数据项,也就是说,不允许表中还有表。
二、关系数据模型的操纵与完整性约束
关系数据模型的操作主要包括查询、插入、删除和更新数据。这些操作必须满足关系的完整性约束
条件。关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性。其具体含义
将在后面介绍。
关系模型中的数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合,而不像非
关系模型中那样是单记录的操作方式。另一方面,关系模型把存取路径向用户隐蔽起来,用户只要指出
“干什么”或“找什么”,不必详细说明“怎么干”或“怎么找”,从而大大地提高了数据的独立性,
提高了用户生产率。
三、关系数据模型的存储结构
在关系数据模型中,实体及实体间的联系都用表来表示。在数据库的物理组织中,表以文件形式存
储,有的系统一个表对应一个操作系统文件,有的系统自己设计文件结构。
四、关系数据模型的优缺点
关系数据模型具有下列优点:
· 关系模型与非关系模型不同,它是建立在严格的数学概念的基础上的。
· 关系模型的概念单一。无论实体还是实体之间的联系都用关系表示。对数据的检索结果也是关系
(即表)。所以其数据结构简单、清晰,用户易懂易用。
· 关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程
序员的工作和数据库开发建立的工作。
所以关系数据模型诞生以后发展迅速,深受用户的喜爱。
当然,关系数据模型也有缺点,其中最主要的缺点是,由于存取路径对用户透明,查询效率往往不
如非关系数据模型。因此为了提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统
的难度。
第三节 数据库系统结构
考察数据库系统的结构可以有多种不同的层次或不同的角度。
从数据库管理系统角度看,数据库系统通常采用三级模式结构;这是数据库管理系统内部的系统
结构。
从数据库最终用户角度看,数据库系统的结构分为单用户结构、主从式结构、分布式结构和客户/
服务器结构。这是数据库系统外部的体系结构。
本章介绍数据库系统的模式结构。
91.3.1 数据库系统模式的概念
在数据模型中有“型”(Type)和“值”(Value)的概念。型是指对某一类数据的结构和属性的说
明,值是型的一个具体赋值。例如:学生记录定义为(学号,姓名,性别,系别,年龄,籍贯)这样的记录型,
而(900201,李明,男,计算机,22,江苏)则是该记录型的一个记录值。
模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及到型的描述,不涉及到
具体的值。模式的一个具体值称为模式的一个实例(Instance)。同一个模式可以有很多实例。模式是相
对稳定的,而实例是相对变动的,因为数据库中的数据是在不断更新的。模式反映的是数据的结构及其
联系,而实例反映的是数据库某一时刻的状态。
虽然实际的数据库管理系统产品种类很多,它们支持不同的数据模型,使用不同的数据库语言,建
立在不同的操作系统之上,数据的存储结构也各不相同,但它们在体系结构上通常都具有相同的特征,
即采用三级模式结构(早期微机上的小型数据库系统除外)并提供两级映象功能。
1.3.2 数据库系统的三级模式结构
数据库系统的三级模式结构是指数据库系统是由外模式、模式和内模式三级构成。
一、模式(Schema)
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
它是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,也与具体的应用程序,
与所使用的应用开发工具及高级程序设计语言(如C,COBOL,FORTRAN)无关。
模式实际上是数据库数据在逻辑级上的视图。一个数据库只有一个模式。数据库模式以某一种数
据模型为基础,统一综合地考虑了所有用户的需求,并将这些需求有机地结合成一个逻辑整体。定义模
式时不仅要定义数据的逻辑结构,例如数据记录由哪些数据项构成,数据项的名字、类型、取值范围等,
而且要定义数据之间的联系,定义与数据有关的安全性、完整性要求。
DBSM提供模式描述语言(模式DDL)来严格地定义模式。
二、外模式(External Schema)
外模式也称子模式(Subschema)或用户模式,它是数据库用户(包括应用程序员和最终用户)能够
看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数
据的逻辑表示。
外模式通常是模式的子集。一个数据库可以有多个外模式。由于它是各个用户的数据视图,如果不
同的用户在应用需求、看待数据的方式、对数据保密的要求等方面存在差异,则其外模式描述就是不同
的。即使对模式中同一数据,在外模式中的结构、类型、长度、保密级别等都可以不同。另一方面,同一外
模式也可以为某一用户的多个应用系统所使用,但一个应用程序只能使用一个外模式。
外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,
数据库中的其余数据是不可见的。
DBSM提供子模式描述语言(子模式DDL)来严格地定义子模式。
三、内模式(Internal Schema)
内模式也称存储模式(Storage Schema),一个数据库只有一个内模式。它是数据物理结构和存储方
式的描述,是数据在数据库内部的表示方式。例如,记录的存储方式是顺序存储、按照B树结构存储还
是按hash方法存储;索引按照什么方式组织;数据是否压缩存储,是否加密;数据的存储记录结构有何
规定等。
DBSM提供内模式描述语言(内模式DDL,或者存储模式DDL)来严格地定义内模式。
1.3.3 数据库的二级映象功能与数据独立性
数据库系统的三级模式是对数据的三个抽象级别,它把数据的具体组织留给DBMS管理,使用户
能逻辑地抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式。为了能够在内部
实现这三个抽象层次的联系和转换,数据库管理系统在这三级模式之间提供了两层映象:
· 外模式/模式映象
· 模式/内模式映象
正是这两层映象保证了数据库系统中的数据能够具有较高的逻辑独立性和物理独立性。
10一、外模式/模式映象
模式描述的是数据的全局逻辑结构,外模式描述的是数据的局部逻辑结构。对应于同一个模式可
以有任意多个外模式。对于每一个外模式,数据库系统都有一个外模式/模式映象,它定义了该外模式
与模式之间的对应关系。这些映象定义通常包含在各自外模式的描述中。
当模式改变时(例如增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外
模式/模式的映象作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应
用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
二、模式/内模式映象
数据库中只有一个模式,也只有一个内模式,所以模式/内模式映象是唯一的,它定义了数据全局
逻辑结构与存储结构之间的对应关系。例如,说明逻辑记录和字段在内部是如何表示的。该映象定义通
常包含在模式描述中。当数据库的存储结构改变了(例如选用了另一种存储结构),由数据库管理员对
模式/内模式映象作相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的
物理独立性,简称数据的物理独立性。
在数据库的三级模式结构中,数据库模式即全局逻辑结构是数据库的中心与关键,它独立于数据
库的其他层次。因此设计数据库模式结构时应首先确定数据库的逻辑模式。
数据库的内模式依赖于它的全局逻辑结构,但独立于数据库的用户视图即外模式,也独立于具体
的存储设备。它是将全局逻辑结构中所定义的数据结构及其联系按照一定的物理存储策略进行组织,
以达到较好的时间与空间效率。
数据库的外模式面向具体的应用程序,它定义在逻辑模式之上,但独立于存储模式和存储设备。当
应用需求发生较大变化,相应外模式不能满足其视图要求时,该外模式就得做相应改动,所以设计外模
式时应充分考虑到应用的扩充性。
特定的应用程序是在外模式描述的数据结构上编制的,它依赖于特定的外模式,与数据库的模式
和存储结构独立。不同的应用程序有时可以共用同一个外模式。数据库的二级映象保证了数据库外模
式的稳定性,从而从底层保证了应用程序的稳定性,除非应用需求本身发生变化,否则应用程序一般不
需要修改。
数据与程序之间的独立性,使得数据的定义和描述可以从应用程序中分离出去。另外,由于数据的
存取由DBMS管理,用户不必考虑存取路径等细节,从而简化了应用程序的编制,大大减少了应用程序
的维护和修改。
第四节 数据库系统的组成
在本章一开始介绍了数据库系统一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据
库管理员和用户构成。下面分别介绍这几个部分的内容。
一、硬件平台及数据库
由于数据库系统数据量都很大,加之DBMS丰富的功能使得自身的规模也很大,因此整个数据库
系统对硬件资源提出了较高的要求,这些要求是:
(1)要有足够大的内存,存放操作系统、DBMS的核心模块、数据缓冲区和应用程序。
(2)有足够的大的磁盘等直接存取设备存放数据库,有足够的磁带(或微机软盘)作数据备份。
(3)要求系统有较高的通道能力,以提高数据传送率。
二、软件
数据库系统的软件主要包括:
(1)DBMS。DBMS是为数据库的建立、使用和维护配置的软件。
(2)支持DBMS运行的操作系统。
(3)具有与数据库接口的高级语言及其编译系统,便于开发应用程序。
(4) 以DBMS为核心的应用开发工具。
11应用开发工具是系统为应用开发人员和最终用户提供的高效率、多功能的应用生成器、第四代语
言等各种软件工具。它们为数据库系统的开发和应用提供了良好的环境。
(5) 为特定应用环境开发的数据库应用系统。
三、人员
开发、管理和使用数据库系统的人员主要是:数据库管理员、系统分析员和数据库设计人员、应用
程序员和最终用户。不同的人员涉及不同的数据抽象级别,具有不同的数据视图。
1. 数据库管理员(DataBase Administrator,简称DBA)
在数据库系统环境下,有两类共享资源。一类是数据库,另一类是数据库管理系统软件。因此需要
有专门的管理机构来监督和管理数据库系统。DBA则是这个机构的一个(组)人员,负责全面管理和控
制数据库系统。具体职责包括:
(1)决定数据库中的信息内容和结构
数据库中要存放哪些信息,DBA要参与决策。因此DBA必须参加数据库设计的全过程,并与用户、
应用程序员、系统分析员密切合作共同协商,搞好数据库设计。
(2)决定数据库的存储结构和存取策略
DBA要综合各用户的应用要求,和数据库设计人员共同决定数据的存储结构和存取策略以求获得
较高的存取效率和存储空间利用率。
(3)定义数据的安全性要求和完整性约束条件
DBA的重要职责是保证数据库的安全性和完整性。因此,DBA负责确定各个用户对数据库的存取
权限、数据的保密级别和完整性约束条件。
(4)监控数据库的使用和运行
DBA还有一个重要职责就是监视数据库系统的运行情况,及时处理运行过程中出现的问题。比如
系统发生各种故障时,数据库会因此遭到不同程度的破坏,DBA必须在最短时间内将数据库恢复到正
确状态,并尽可能不影响或少影响计算机系统其他部分的正常运行。为此,DBA要定义和实施适当的后
备和恢复策略。如周期性的转储数据、维护日志文件等等。有关这方面的内容将在下面做进一步讨论。
(5)数据库的改进和重组重构
DBA还负责在系统运行期间监视系统的空间利用率、处理效率等性能指标,对运行情况进行记录、
统计分析,依靠工作实践并根据实际应用环境,不断改进数据库设计。不少数据库产品都提供了对数据
库运行状况进行监视和分析的实用程序,DBA可以使用这些实用程序完成这项工作。
另外,在数据运行过程中,大量数据不断插入、删除、修改,时间一长,会影响系统的性能。因此,
DBA要定期对数据库进行重组织,以提高系统的性能。
当用户的需求增加和改变时,DBA还要对数据库进行较大的改造,包括修改部分设计,即数据库的
重构造。
2. 系统分析员和数据库设计人员
系统分析员负责应用系统的需求分析和规范说明,要和用户及DBA相结合,确定系统的硬件软件
配置,并参与数据库系统的概要设计。
数据库设计人员负责数据库中数据的确定、数据库各级模式的设计。数据库设计人员必须参加用
户需求调查和系统分析,然后进行数据库设计。在很多情况下,数据库设计人员就由数据库管理员担任。
3. 应用程序员
应用程序员负责设计和编写应用系统的程序模块,并进行调试和安装。
4. 用户
这里用户是指最终用户(End User)。最终用户通过应用系统的用户接口使用数据库。常用的接口
方式有浏览器、菜单驱动、表格操作、图形显示、报表书写等。 (唐山市警用地理信息系统数据库)
最终用户可以分为如下三类:
(1)偶然用户。这类用户不经常访问数据库,但每次访问数据库时往往需要不同的数据库信息,这
类用户一般是企业或组织机构的高中级管理人员。
(2)简单用户。数据库的多数最终用户都是简单用户。其主要工作是查询和更新数据库,一般都是
12通过应用程序员精心设计并具有友好界面的应用程序存取数据库。银行的职员、铁路售票、航空公司的
机票预定工作人员、旅馆总台服务员等都属于这类用户。
(3)复杂用户。复杂用户包括工程师、科学家、经济学家、科学技术工作者等具有较高科学技术背景
的人员。这类用户一般都比较熟悉数据库管理系统的各种功能,能够直接使用数据库语言访问数据库,
甚至能够基于数据库管理系统的API(Application Programming Interface,应用程序编程接口)编制自己的应用
程序。
第五节 数据库技术的研究领域
数据库学科的研究范围是十分广泛的,概括地讲可包括以下三个领域:
一、数据库管理系统软件的研制
DBMS是数据库系统的基础。DBMS的研制包括研制DBMS本身及以DBMS为核心的一组相互
联系的软件系统,包括工具软件和中间件。研制的目标是提高系统的可用性、可靠性、可伸缩性;提高性
能和提高用户的生产率。
DBMS核心技术的研究和实现是三十余年来数据库领域所取得的主要成就。DBMS是一个基础软
件系统,它提供了对数据库中的数据进行存储、检索和管理的功能。
二、数据库设计
数据库设计的主要任务是在DBMS的支持下,按照应用的要求,为某一部门或组织设计一个结构
合理、使用方便、效率较高的数据库及其应用系统。其中主要的研究方向是数据库设计方法学和设计工
具,包括数据库设计方法、设计工具和设计理论的研究,数据模型和数据建模的研究,计算机辅助数据
库设计方法及其软件系统的研究,数据库设计规范和标准的研究等。
三、数据库理论
数据库理论的研究主要集中于关系的规范化理论、关系数据理论等。近年来,随着人工智能与数据
库理论的结合、并行计算技术等的发展,数据库逻辑演绎和知识推理、数据库中的知识发现(Knowledge
Discovery from Database,简称KDD)、并行算法等成为新的理论研究方向。
计算机领域中其他新兴技术的发展对数据库技术产生了重大影响。数据库技术和其他计算机技术
的互相结合、互相渗透,使数据库中新的技术内容层出不穷。数据库的许多概念、技术内容、应用领域,
甚至某些原理都有了重大的发展和变化。建立和实现了一系列新型数据库系统,如分布式数据库系统、
并行数据库系统、知识库系统、多媒体数据库系统等。它们共同构成了数据库系统大家族,使数据库技
术不断地涌现新的研究方向。
本书介绍数据库系统的基本概念、基本技术和基本知识方面是进一步进行上述三个领域研究和开
发的基础。
第六节 小结
本章概述了数据库的基本概念,并通过对数据管理进展情况的介绍,阐述了数据库技术产生和发
展的背景,也说明了数据库系统的优点。
数据模型是数据库系统的核心和基础。本章介绍了组成数据模型的三个要素、概念模型和三种主
要的数据库模型。
概念模型也称信息模型,用于信息世界的建模,E-R模型是这类模型的典型代表,E-R方法简单、清
晰,应用十分广泛。
数据模型的发展经历了格式化数据模型(包括层次模型和网状模型)、关系模型,正在走向面向对
象等非传统数据模型。由于层次数据库和网状数据库已逐渐被关系数据库代替,本书不再用单独的章
节讲解,因此,本章较为详细地讲解了层次模型和网状模型,而关系模型只是简单介绍,后面会详细讲
解。
13数据库系统三级模式和两层映象的系统结构保证了数据库系统中能够具有较高的逻辑独立性和物
理独立性。
最后介绍了数据库系统的组成,使学生了解数据库系统不仅是一个计算机系统,而是一个人-机系
统,人的作用特别是DBA的作用尤为重要。
学习这一章应把注意力放在掌握基本概念和基本知识方面,为进一步学习下面章节打好基础。本
章新概念较多,如果是刚开始学习数据库,可在学习后面章节后再回来理解和掌握这些概念。
第2章 关系数据库
第一节 关系模型概述
关系数据库系统是支持关系模型的数据库系统。
关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。
一、单一的数据结构——关系
关系模型的数据结构非常单一。在关系模型中,现实世界的实体以及实体间的各种联系均用关系
来表示。在用户看来,关系模型中数据的逻辑结构是一张二维表。
二、关系操作
关系模型给出了关系操作的能力,但不对RDBMS语言给出具体的语法要求。
关系模型中常用的关系操作包括:选择(Select)、投影(Project)、连接(Join)、除(Divide)、并
(Union)、交(Intersection)、差(Difference)等查询(Query)操作和增加(Insert)、删除(Delete)、修改
(Update)操作两大部分。查询的表达能力是其中最主要的部分。
关系操作的特点是集合操作方式,即操作的对象和结果都是集合。这种操作方式也称为一次一集
合(set-at-a-time)的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的
方式。
早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数和关系演算。关系代
数是用对关系的运算来表达查询要求的方式。关系演算是用谓词来表达查询要求的方式。关系演算又
可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。关系代数、元组关
系演算和域关系演算三种语言在表达能力上是完全等价的。
关系代数、元组关系演算和域关系演算均是抽象的查询语言,这些抽象的语言与具体的DBMS中
实现的实际语言并不完全一样。但它们能用作评估实际系统中查询语言能力的标准或基础。实际的查
询语言除了提供关系代数或关系演算的功能外,还提供了许多附加功能,例如集函数、关系赋值、算术
运算等。
关系语言是一种高度非过程化的语言,用户不必请求DBA为其建立特殊的存取路径,存取路径的
选择由DBMS的优化机制来完成,此外,用户不必求助于循环结构就可以完成数据操作。
另外还有一种介于关系代数和关系演算之间的语言SQL(Standard Query Language)。SQL不仅具
有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、DDL、DML和DCL于一体的关系
数据语言。它充分体现了关系数据语言的特点和优点,是关系数据库的标准语言。
因此,关系数据语言可以分为三类:
关系代数语言,例如ISBL
关系演算语言,(元组关系演算语言 ,例如APLHA,QUEL 和 域关系演算语言,例如QBE)
具有关系代数和关系演算双重特点的语言 例如SQL
这些关系数据语言的共同特点是,语言具有完备的表达能力,是非过程化的集合操作语言,功能强,
能够嵌入高级语言中使用。
三、关系的三类完整性约束
14关系模型允许定义三类完整性约束:实体完整性、参照完整性和用户定义的完整性。其中实体完整
性和参照完整性是关系模型必须满足的完整性约束条件,应该由关系系统自动支持。用户定义的完整
性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
下面将分别介绍关系模型的三个方面。其中2.2节介绍关系数据结构,包括关系的形式化定义及有
关概念;2.3节介绍关系的三类完整性;2.4节介绍关系代数;2.5节介绍关系演算;第三章将专门介绍
SQL语言。
第二节 关系数据结构及形式化定义
在关系模型中,无论是实体还是实体之间的联系均由单一的结构类型即关系(表)来表示。前面已
经非形式化地介绍了关系模型及有关的基本概念。关系模型是建立在集合代数的基础上的,这里从集
合论角度给出关系数据结构的形式化定义。
2.2.1 关系
1. 域(Domain)
定义2.1 域是一组具有相同数据类型的值的集合。
例如,自然数、整数、实数、长度小于25字节的字符串集合、{0,1}、大于等于0且小于等于100的
正整数等,都可以是域。
2. 笛卡尔积(Cartesian Product)
定义2.2 给定一组域D1,D2,…,Dn,这些域中可以有相同的。D1,D2,…,Dn的笛卡尔积为:
D1×D2×…×Dn={(d1,d2,…,dn)|di?Di,i=1,2,…,n}
其中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组(Tuple)。
元素中的每一个值di叫作一个分量(Component)。
笛卡尔积可表示为一个二维表。表中的每行对应一个元组,表中的每列对应一个域。例如给出三个
域:
D1=导师集合SUPERVISOR=张清玫,刘逸
D2=专业集合SPECIALITY=计算机专业,信息专业
D3=研究生集合POSTGRADUATE=李勇,刘晨,王敏
则D1,D2,D3的笛卡尔积为:
D1×D2×D3 ={(张清玫,计算机专业,李勇),(张清玫,计算机专业,刘晨),
(张清玫,计算机专业,王敏),(张清玫,信息专业,李勇),
(张清玫,信息专业,刘晨),(张清玫,信息专业,王敏),
(刘逸,计算机专业,李勇),(刘逸,计算机专业,刘晨),
(刘逸,计算机专业,王敏),(刘逸,信息专业,李勇),
(刘逸,信息专业,刘晨),(刘逸,信息专业,王敏) }
其中(张清玫,计算机专业,李勇)、(张清玫,计算机专业,刘晨)等都是元组。张清玫、计算机专业、李
勇、刘晨等都是分量。
该笛卡尔积的基数为2×2×3=12,也就是说,D1×D2×D3一共有2×2×3=12个元组。这12个元组可
列成一张二维表(如表2.1)。
3. 关系(Relation)
定义2.3 D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的关系,表示为
R(D1,D2,…,Dn)
这里R表示关系的名字,n是关系的目或度(Degree)。
关系中的每个元素是关系中的元组,通常用t表示。
当n=1时,称该关系为单元关系(Unary relation)。
当n=2时,称该关系为二元关系(Binary relation)。
关系是笛卡尔积的有限子集,所以关系也是一个二维表,表的每行对应一个元组,表的每列对应一
15个域。由于域可以相同,为了加以区分,必须对每列起一个名字,称为属性(Attribute)。n目关系必有n
个属性。
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码(Candidate key)。
若一个关系有多个候选码,则选定其中一个为主码(Primary key)。主码的诸属性称为主属性
(Prime attribute)。不包含在任何侯选码中的属性称为非码属性(Non-key attribute)。 在最简单的情况
下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称
为全码(All-key)。
关系可以有三种类型:基本关系(通常又称为基本表或基表)、查询表和视图表。基本表是实际存在
的表,它是实际存储数据的逻辑表示。查询表是查询结果对应的表。视图表是由基本表或其他视图表导
出的表,是虚表,不对应实际存储的数据。
按照定义2.2,关系可以是一个无限集合。由于笛卡尔积不满足交换律,所以按照数学定义,(d1,
d2,…,dn )≠(d2,d1,…,dn )。当关系作为关系数据模型的数据结构时,需要给予如下的限定和扩充:
(1)无限关系在数据库系统中是无意义的。因此,限定关系数据模型中的关系必须是有限集合。
(2)通过为关系的每个列附加一个属性名的方法取消关系元组的有序性,即(d1,d2 ,…,di ,
dj ,…,dn)=(d1,d2 ,…,di,dj ,…,dn) (i,j = 1,2,…,n)。
因此,基本关系具有以下六条性质:
① 列是同质的(Homogeneous),即每一列中的分量是同一类型的数据,来自同一个域。
② 不同的列可出自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名。
例如在上面的例子中,也可以只给出两个域:
人(PERSON)=张清玫,刘逸,李勇,刘晨,王敏
专业(SPECIALITY)=计算机专业,信息专业
SAP关系的导师属性和研究生属性都从PERSON域中取值。为了避免混淆,必须给这两个属性取
不同的属性名,而不能直接使用域名。例如定义导师属性名为 SUPERVISOR-PERSON(或
SUPERVISOR),研究生属性名为POSTGRADUATE-PERSON(或POSTGRADUATE)。
③ 列的顺序无所谓,即列的次序可以任意交换。
由于列顺序是无关紧要的,因此在许多实际关系数据库产品中(例如Oracle),增加新属性时,永远
是插至最后一列。
④ 任意两个元组不能完全相同。
⑤ 行的顺序无所谓,即行的次序可以任意交换。
⑥ 分量必须取原子值,即每一个分量都必须是不可分的数据项。
注意:在许多实际关系数据库产品中,基本表并不完全具有这六条性质,例如,有的数据库产品(如
FoxPro)仍然区分了属性顺序和元组的顺序;许多关系数据库产品中,例如Oracle,FoxPro等,它们都允
许关系表中存在两个完全相同的元组,除非用户特别定义了相应的约束条件。
关系模型要求关系必须是规范化的,即要求关系模式必须满足一定的规范条件。这些规范条件中
最基本的一条就是,关系的每一个分量必须是一个不可分的数据项。规范化的关系简称为范式(Normal
Form)。
2.2.2 关系模式
在数据库中要区分型和值。关系数据库中,关系模式是型,关系是值。关系模式是对关系的描述,那
么一个关系需要描述哪些方面呢?
首先,应该知道,关系实质上是一张二维表,表的每一行为一个元组,每一列为一个属性。一个元组
就是该关系所涉及的属性集的笛卡尔积的一个元素。关系是元组的集合,因此关系模式必须指出这个
元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映象关系。
其次,一个关系通常是由赋予它的元组语义来确定的。元组语义实质上是一个n目谓词(n是属性
集中属性的个数)。凡使该n目谓词为真的笛卡尔积中的元素(或者说凡符合元组语义的那部分元素)
的全体就构成了该关系模式的关系。
现实世界随着时间在不断地变化,因而在不同的时刻,关系模式的关系也会有所变化。但是,现实
16世界的许多已有事实限定了关系模式所有可能的关系必须满足一定的完整性约束条件。这些约束或者
通过对属性取值范围的限定,例如职工年龄小于65岁(65岁以后必须退休),或者通过属性值间的相互
关连(主要体现于值的相等与否)反映出来。关系模式应当刻划出这些完整性约束条件。
因此一个关系模式应当是一个5元组。
定义2.4 关系的描述称为关系模式(Relation Schema)。它可以形式化地表示为:
R(U,D,dom,F)
其中R为关系名,U为组成该关系的属性名集合,D为属性组U中属性所来自的域,dom为属性向
域的映象集合,F为属性间数据的依赖关系集合。
属性间的数据依赖将在第五章讨论,本章中关系模式仅涉及关系名、各属性名、域名、属性向域的
映像四部分。
例如,在上面例子中,由于导师和研究生出自同一个域——人,所以要取不同的属性名,并在模式
中定义属性向域的映象,即说明它们分别出自哪个域,如:
dom(SUPERVISOR-PERSON)= dom(POSTGRADUATE-PERSON)=PERSON
关系模式通常可以简记为
R (U)
或 R (A1,A2,…,An)
其中R为关系名,A1,A2,…,An为属性名。而域名及属性向域的映象常常直接说明为属性的类型、
长度。
关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间
不断变化的,因为关系操作在不断地更新着数据库中的数据。但在实际当中,人们常常把关系模式和关
系都称为关系,这不难从上下文中加以区别。
2.2.3 关系数据库
在关系模型中,实体以及实体间的联系都是用关系来表示的。例如导师实体、研究生实体、导师与
研究生之间的一对多联系都可以分别用一个关系来表示。在一个给定的应用领域中,所有实体及实体
之间联系的关系的集合构成一个关系数据库。
关系数据库也有型和值之分。关系数据库的型也称为关系数据库模式,是对关系数据库的描述,它
包括若干域的定义以及在这些域上定义的若干关系模式。关系数据库的值是这些关系模式在某一时刻
对应的关系的集合,通常就称为关系数据库。
第三节 关系的完整性
关系模型的完整性规则是对关系的某种约束条件。关系模型中可以有三类完整性约束:实体完整
性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约
束条件,被称作是关系的两个不变性,应该由关系系统自动支持。
一、实体完整性(Entity Integrity)
规则2.1 实体完整性规则 若属性A是基本关系R的主属性,则属性A不能取空值。
例如在关系“SAP(SUPERVISOR,SPECIALITY,POSTGRADUATE)”中,“研究生姓名
POSTGRADUATE”属性为主码(假设研究生不会重名),则“研究生姓名”不能取空值。
实体完整性规则规定基本关系的所有主属性都不能取空值,而不仅是主码整体不能取空值。例如
学生选课关系“选修(学号,课程号,成绩)”中,“学号、课程号”为主码,则“学号”和“课程号”两
个属性都不能取空值。
对于实体完整性规则说明如下:
(1)实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。例如学
生关系对应于学生的集合。
(2)现实世界中的实体是可区分的,即它们具有某种唯一性标识。
17(3)相应地,关系模型中以主码作为唯一性标识。
(4)主码中的属性即主属性不能取空值。所谓空值就是“不知道”或“无意义”的值。如果主属性
取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则
称为实体完整性。
二、参照完整性(Referential Integrity)
现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述
的。这样就自然存在着关系与关系间的引用。
参照完整性规则就是定义外码与主码之间的引用规则。
规则2.2 参照完整性规则 若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks
相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
· 或者取空值(F的每个属性值均为空值);
· 或者等于S中某个元组的主码值。
例如,对于[例1],学生关系中每个元组的“专业号”属性只能取下面两类值:
(1)空值,表示尚未给该学生分配专业;
(2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个
不存在的专业中。即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”
中的外码值。
对于[例2],按照参照完整性规则,“学号”和“课程号”属性也可以取两类值:空值或目标关系
中已经存在的值。但由于“学号”和“课程号”是选修关系中的主属性,按照实体完整性规则,它们均
不能取空值。所以选修关系中的“学号”和“课程号”属性实际上只能取相应被参照关系中已经存在
的主码值。
参照完整性规则中,R与S可以是同一个关系。例如对于[例3],按照参照完整性规则,“班长”属
性值可以取两类值:
(1)空值,表示该学生所在班级尚未选出班长;
(2)非空值,这时该值必须是本关系中某个元组的学号值。
三、用户定义的完整性(User-defined Integrity)
任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的关系数据库系统根
据其应用环境的不同,往往还需要一些特殊的约束条件,用户定义的完整性就是针对某一具体关系数
据库的约束条件。它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一
值、某个非主属性也不能取空值、某个属性的取值范围在0~100之间等。关系模型应提供定义和检验
这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能。
第四节 关系代数
关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它是用对关系的运
算来表达查询的。
任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对
象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括四类:集合运算符、
专门的关系运算符、算术比较符和逻辑运算符。
关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。
其中传统的集合运算将关系看成元组的集合,其运算是从关系的“水平”方向即行的角度来进行。
而专门的关系运算不仅涉及行而且涉及列。比较运算符和逻辑运算符是用来辅助专门的关系运算符进
行操作的。
2.4.1 传统的集合运算
传统的集合运算是二目运算,包括并、差、交、广义笛卡尔积四种运算。
182.4.2 专门的关系运算
专门的关系运算包括选择、投影、连接、除等。为了叙述上的方便,先引入几个记号。
下面给出这些关系运算的定义:
1. 选择(Selection)
选择又称为限制(Restriction)。它是在关系R中选择满足给定条件的诸元组。
2. 投影(Projection)
关系R上的投影是从R中选择出若干属性列组成新的关系。
3. 连接(Join)
连接也称为θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
4. 除(Division)
给定关系R (X,Y) 和S (Y,Z),其中X,Y,Z为属性组。R中的Y与S中的Y可以有不同的属性
名,但必须出自相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在
X属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合。
本节介绍了8种关系代数运算,其中并、差、笛卡尔积、投影和选择5种运算为基本的运算。其他3
种运算,即交、连接和除,均可以用这5种基本运算来表达。引进它们并不增加语言的能力,但可以简化
表达。
关系代数中,这些运算经有限次复合后形成的式子称为关系代数表达式。
关系代数语言中比较典型的例子是查询语言ISBL(Information System Base Language)。ISBL语
言由IBM United Kingdom研究中心研制,用于PRTV(Peterlee Relational Test Vehicle)实验系统。
第五节 关系演算
关系演算是以数理逻辑中的谓词演算为基础的。按谓词变元的不同,关系演算可分为元组关系演
算和域关系演算。本节先介绍元组关系演算,然后介绍域关系演算。在讲解时都是先介绍一种具体的语
言,再讲解抽象的语言。
2.5.1 元组关系演算语言ALPHA
元组关系演算以元组变量作为谓词变元的基本对象。一种典型的元组关系演算语言是E.F.Codd提
出的ALPHA语言。这一语言虽然没有实际实现,但关系数据库管理系统INGRES所用的QUEL语言是
参照ALPHA语言研制的,与ALPHA十分类似。
ALPHA语言主要有GET,PUT,HOLD,UPDATE,DELETE,DROP 6条语句,语句的基本格式是:
操作语句 工作空间名(表达式):操作条件
其中表达式用于指定语句的操作对象,它可以是关系名或(和)属性名,一条语句可以同时操作多
个关系或多个属性。操作条件是一个逻辑表达式,用于将操作结果限定在满足条件的元组中,操作条件
可以为空。除此之外,还可以在基本格式的基础上加上排序要求,定额要求等。
一、检索操作
检索操作用GET语句实现。
二、更新操作
(1)修改操作
修改操作用UPDATE语句实现。其步骤是:
① 首先用HOLD语句将要修改的元组从数据库中读到工作空间中;
② 然后用宿主语言修改工作空间中元组的属性;
③ 最后用UPDATE语句将修改后的元组送回数据库中。
需要注意的是,单纯检索数据使用GET语句即可,但为修改数据而读元组时必须使用HOLD语句,
HOLD语句是带上并发控制的GET语句。有关并发控制的概念将在第八章中详细介绍。
(2)插入操作
19插入操作用PUT语句实现。其步骤是:
① 首先用宿主语言在工作空间中建立新元组;
② 然后用PUT语句把该元组存入指定的关系中。
(3)删除
删除操作用DELETE语句实现。其步骤为:
① 用HOLD语句把要删除的元组从数据库中读到工作空间中;
② 用DELETE语句删除该元组。
2.5.2 元组关系演算
上一节讲解了一种具体的元组关系演算语言,这一节讲解抽象的元组关系演算。
为了讨论方便,先允许关系(的基数)是无限的。然后再对这种情况下定义的演算作适当的修改,保
证关系演算中的每一个公式表示的是有限关系。
2.5.3 域关系演算语言QBE
关系演算的另一种形式是域关系演算。域关系演算以元组变量的分量即域变量作为谓词变元的基
本对象。1975年由M.M.Zloof提出的QBE就是一个很有特色的域关系演算语言,该语言于1978年在
IBM370上得以实现。QBE也指此关系数据库管理系统。
QBE是Query By Example(即通过例子进行查询)的简称,其最突出的特点是它的操作方式。它是
一种高度非过程化的基于屏幕表格的查询语言,用户通过终端屏幕编辑程序以填写表格的方式构造查
询要求,而查询结果也是以表格形式显示,因此非常直观,易学易用。
2.5.4 域关系演算
上一节讲解了一种实际的域关系演算语言,这一节讲解抽象的域关系演算。
域关系演算的谓词变元是域变量。
域演算表达式的定义类似于元组演算表达式的定义,所不同的是公式中的元组变量由域变量替代。
域变量是表示域的变量。关系的属性名可以视为域变量。
第六节 小结
关系数据库系统是本书的重点。这是因为关系数据库系统是目前使用最广泛的数据库系统。20世
纪70年代以后开发的数据库管理系统产品几乎都是基于关系的。更进一步,数据库领域近30年来的研
究工作也主要是关系的。在数据库发展的历史上,最重要的成就是关系模型。
关系数据库系统与非关系数据库系统的区别是,关系系统只有“表”这一种数据结构;而非关系
数据库系统还有其他数据结构,对这些数据结构有其他的操作。
关系理论的确立标志着关系数据库系统的基础研究已经接近顶峰。关系数据库系统已经占据了数
据库系统的市场。
本章系统讲解了关系数据库的重要概念,包括关系模型的数据结构、关系的完整性以及关系操作。
介绍了用代数方式或逻辑方式来表达的关系语言即关系代数、元组关系演算和域关系演算。在这一章
从具体到抽象,先讲解了实际的语言ALPHA(元组关系演算语言)和QBE(域关系演算语言),然后讲
解了抽象的元组关系演算和域关系演算。
第3章 关系数据库标准语言SQL 语言
第一节 SQL概述
SQL是一种介于关系代数与关系演算之间的结构化查询语言,其功能并不仅仅是查询。SQL是一个
20通用的、功能极强的关系数据库语言。
3.1.1 SQL的特点
SQL语言之所以能够为用户和业界所接受,并成为国际标准,是因为它是一个综合的、功能极强同
时又简捷易学的语言。SQL语言集数据查询(Data Query)、数据操纵(Data Manipulation)、数据定义
(Data Definition)和数据控制(Data Control)功能于一体,主要特点包括:
一、综合统一
数据库系统的主要功能是通过数据库支持的数据语言来实现的。
非关系模型(层次模型、网状模型)的数据语言一般都分为模式数据定义语言(Schema Data
Definition Language,简称模式DDL)、外模式数据定义语言(Subschema Data Definition Language,简
称外模式DDL或子模式DDL)、与数据存储有关的描述语言(Data Storage Description Language,简称
DSDL)及数据操纵语言(Data Manipulation Language,简称DML),分别用于定义模式、外模式、内模
式和进行数据的存取与处置。当用户数据库投入运行后,如果需要修改模式,必须停止现有数据库的运
行,转储数据,修改模式并编译后再重装数据库,十分麻烦。
SQL语言则集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风
格统一,可以独立完成数据库生命周期中的全部活动,包括定义关系模式、插入数据建立数据库、查询、
更新、维护、数据库重构、数据库安全性控制等一系列操作要求,这就为数据库应用系统的开发提供了
良好的环境。用户在数据库系统投入运行后,还可根据需要随时地逐步地修改模式,且并不影响数据库
的运行,从而使系统具有良好的可扩展性。
另外,在关系模型中实体和实体间的联系均用关系表示,这种数据结构的单一性带来了数据操作
符的统一,查找、插入、删除、更新等操作都只需一种操作符,从而克服了非关系系统由于信息表示方式
的多样性带来的操作复杂性。例如,在DBTG中,需要两种插入操作符:STORE用来把记录存入数据库,
CONNECT用来把记录插入系值以建立数据之间的联系。
二、高度非过程化
非关系数据模型的数据操纵语言是面向过程的语言,用其完成某项请求,必须指定存取路径。而用
SQL语言进行数据操作,只要提出“做什么”,而无须指明“怎么做”,因此无需了解存取路径,存取
路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高
数据独立性。
三、面向集合的操作方式
非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。例如查询所有平均成绩在
80分以上的学生姓名,用户必须一条一条地把满足条件的学生记录找出来(通常要说明具体处理过程,
即按照哪条路径,如何循环等)。而SQL语言采用集合操作方式,不仅操作对象、查找结果可以是元组
的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
四、以同一种语法结构提供两种使用方式
SQL语言既是自含式语言,又是嵌入式语言。作为自含式语言,它能够独立地用于联机交互的使用
方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够
嵌入到高级语言(例如C,COBOL,FORTRAN,PL/1)程序中,供程序员设计程序时使用。而在两种不同
的使用方式下,SQL语言的语法结构基本上是一致的。这种以统一的语法结构提供两种不同的使用方
式的做法,提供了极大的灵活性与方便性。
五、语言简捷,易学易用
SQL语言功能极强,但由于设计巧妙,语言十分简捷,完成核心功能只用了9个动词。SQL语言接
近英语口语,因此容易学习,容易使用。
3.1.2 SQL语言的基本概念
SQL语言支持关系数据库三级模式结构,其中外模式对应于视图(View)和部分基本表(Base
Table),模式对应于基本表,内模式对应于存储文件。
用户可以用SQL语言对基本表和视图进行查询或其他操作,基本表和视图一样,都是关系。
基本表是本身独立存在的表,在SQL中一个关系就对应一个表。一个(或多个)基本表对应一个存
21储文件,一个表可以带若干索引,索引也存放在存储文件中。
存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构是任意的,对用户是透明
的。
视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的
定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在
概念上与基本表等同,用户可以在视图上再定义视图。
第二节 数据定义
关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引。因
此SQL的数据定义功能包括定义表、定义视图和定义索引。
视图是基于基本表的虚表,索引是依附于基本表的,因此SQL通常不提供修改视图定义和修改索
引定义的操作。用户如果想修改视图定义或索引定义,只能先将它们删除掉,然后再重建。不过有些关
系数据库产品如Oracle允许直接修改视图定义。
3.2.1 定义、删除与修改基本表
一、定义基本表
建立数据库最重要的一步就是定义一些基本表。SQL语言使用CREATE TABLE语句定义基本表。
建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字
典中,当用户操作表中数据时由DBMS自动检查该操作是否违背这些完整性约束条件。如果完整性约
束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
二、修改基本表
随着应用环境和应用需求的变化,有时需要修改已建立好的基本表,SQL语言用ALTER TABLE
语句修改基本表。
SQL没有提供删除属性列的语句,用户只能间接实现这一功能,即先把表中要保留的列及其内容
复制到一个新表中,然后删除原表,再将新表重命名为原表名。
三、删除基本表
当某个基本表不再需要时,可以使用DROP TABLE语句删除它。
基本表定义一旦删除,表中的数据、此表上建立的索引和视图都将自动被删除掉。因此执行删除基
本表的操作一定要格外小心。
注意:有的系统,如Oracle,删除基本表后建立在此表上的视图定义仍然保留在数据字典中。但是,
当用户引用时就报错。
3.2.2 建立与删除索引
建立索引是加快查询速度的有效手段。用户可以根据应用环境的需要,在基本表上建立一个或多
个索引,以提供多种存取路径,加快查找速度。一般说来,建立与删除索引由数据库管理员DBA或表的
属主(即建立表的人)负责完成。系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也
不能选择索引。
一、建立索引
在SQL语言中,建立索引使用CREATE INDEX语句。索引可以建立在该表的一列或多列上,各列
名之间用逗号分隔。每个列名后面还可以用次序指定索引值的排列次序,可选ASC(升序)或DESC(降
序),缺省值为ASC。
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺
序一致的索引组织。将会在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记
录将按照Sno值的升序存放。
用户可以在最常查询的列上建立聚簇索引以提高查询效率。显然在一个基本表上最多只能建立一
个聚簇索引。建立聚簇索引后,更新索引列数据时,往往导致表中记录的物理顺序的变更,代价较大,因
22此对于经常更新的列不宜建立聚簇索引。
二、删除索引
索引一经建立,就由系统使用和维护它,不需用户干预。建立索引是为了减少查询操作的时间,但
如果数据增加删改频繁,系统会花费许多时间来维护索引。这时,可以删除一些不必要的索引。
在SQL语言中,删除索引使用DROP INDEX语句。
删除索引时,系统会同时从数据字典中删去有关该索引的描述。
第三节 查询
数据库查询是数据库的核心操作。SQL语言提供了SELECT语句进行数据库的查询,该语句具有
灵活的使用方式和丰富的功能。
3.3.1 单表查询
单表查询是指仅涉及一个表的查询。
一、选择表中的若干列
选择表中的全部列或部分列,这就是投影运算。
二、选择表中的若干元组
1. 消除取值重复的行
两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了。
三、对查询结果排序
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排
列,缺省值为升序。
四、使用集函数
为了进一步方便用户,增强检索功能,SQL提供了许多集函数,主要有:
COUNT 统计元组个数
COUNT 统计一列中值的个数
SUM 计算一列值的总和(此列必须是数值型)
AVG 计算一列值的平均值(此列必须是数值型)
MAX 求一列值中的最大值
MIN 求一列值中的最小值
如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语
或指定ALL短语(ALL为缺省值),则表示不取消重复值。
五、对查询结果分组
GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。
3.3.2 连接查询
前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询。连接
查询是关系数据库中最主要的查询,包括等值连接、自然连接、非等值连接查询、自身连接查询、外连接
查询和复合条件连接查询。
一、等值与非等值连接查询
连接查询中用来连接两个表的条件称为连接条件或连接谓词。
二、自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。
三、外连接
在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。
四、复合条件连接
上面各个连接查询中,WHERE子句中只有一个条件,即连接谓词。WHERE子句中可以有多个连
接条件,称为复合条件连接。
233.3.3 嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个
查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
一、带有IN谓词的子查询
在嵌套查询中,子查询的结果往往是一个集合,所以谓词IN是嵌套查询中最经常使用的谓词。
二、带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。
三、带有ANY或ALL谓词的子查询
子查询返回单值时可以用比较运算符 ,而使用ANY或ALL谓词时则必须同时使用比较运算符。
四、带有EXISTS谓词的子查询
EXISTS代表存在量词 $。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或
逻辑假值“false”。
3.3.4 集合查询
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操
作主要包括并操作UNION、交操作INTERSECT和差操作MINUS。
第四节 数据更新
SQL中数据更新包括插入数据、修改数据和删除数据三条语句。
3.4.1 插入数据
SQL的数据插入语句INSERT通常有两种形式。一种是插入一个元组,另一种是插入子查询结果。
后者可以一次插入多个元组。
3.4.2 修改数据
修改操作又称为更新操作。
一、修改某一个元组的值
二、修改多个元组的值
三、带子查询的修改语句
3.4.3 删除数据
一、删除某一个元组的值
二、删除多个元组的值
三、带子查询的删除语句
四、更新操作与数据库的一致性
第五节 视图
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。
视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。数据库中只存放视
图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变
化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数
据库中自己感兴趣的数据及其变化。
视图一经定义,就可以和基本表一样被查询、被删除,我们也可以在一个视图之上再定义新的视图,
但对视图的更新(增、删、改)操作则有一定的限制。
本节专门讨论视图的定义、操作及优点。
3.5.1 定义视图
一、建立视图
24二、删除视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而且对于
非行列子集视图进行查询或更新时还有可能出现问题。既然如此,为什么还要定义视图呢? 这是因为
合理使用视图能够带来许多好处。
1. 视图能够简化用户的操作
视图机制使用户可以将注意力集中在所关心的数据上。如果这些数据不是直接来自基本表,则可
以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。例如,那些定义
了若干张表连接的视图,就将表与表之间的连接操作对用户隐蔽起来了。换句话说,用户所做的只是对
一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。
2. 视图使用户能以多种角度看待同一数据
视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库
时,这种灵活性是非常重要的。
3. 视图对重构数据库提供了一定程度的逻辑独立性
第一章中已经介绍过数据的物理独立性与逻辑独立性的概念。数据的物理独立性是指用户和用户
程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原
有关系增加新的字段等,用户和用户程序不会受影响。层次数据库和网状数据库一般能较好地支持数
据的物理独立性,而对于逻辑独立性则不能完全地支持。
4. 视图能够对机密数据提供安全保护
有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出
现在不应看到这些数据的用户视图上,这样视图机制就自动提供了对机密数据的安全保护功能。例如
Student表涉及三个系的学生数据,可以在其上定义三个视图,每个视图只包含一个系的学生数据,并只
允许每个系的系主任查询自己系的学生视图。
第六节 数据控制
由DBMS提供统一的数据控制功能是数据库系统的特点之一。SQL中数据控制功能包括事务管理
功能和数据保护功能,即数据库的恢复、并发控制;数据库的安全性和完整性控制。这些概念和技术将
在后面章节详细讨论。
SQL语言定义完整性约束条件的功能主要体现在CREATE TABLE语句中,可以在该语句中定义
码、取值唯一的列、不允许空值的列、外码(参照完整性)及其他一些约束条件。
SQL语言也提供了并发控制及恢复的功能,支持事务、提交、回滚等概念,SQL语言在这方面的能
力将在后面章节做进一步介绍。
这里主要讨论SQL语言的安全性控制功能。
某个用户对某类数据具有何种操作权力是个政策问题而不是技术问题。数据库管理系统的功能是
保证这些决定的执行。为此DBMS必须具有以下功能:
(1)把授权的决定告知系统,这是由SQL的GRANT和REVOKE语句来完成的。
(2)把授权的结果存入数据字典。
(3)当用户提出操作请求时,根据授权情况进行检查,以决定是否执行操作请求。
3.6.1 授权
3.6.2 收回权限
25第七节 嵌入式SQL
以上介绍的SQL语言是作为独立语言在终端交互方式下使用的。这是面向集合的描述性语言,是
非过程性的。即大多数语句都是独立执行,与上下文无关的。而许多事务处理应用都是过程性的,需要
根据不同的条件来执行不同的任务,因此单纯用SQL语言是很难实现这类应用的。
为了解决这一问题,SQL语言提供了另一种使用方式,即将SQL语言嵌入到某种高级语言中使用,
利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足。这种方式下使用的SQL语言
称为嵌入式SQL(Embedded SQL),而嵌入SQL的高级语言称为主语言或宿主语言。
前面已经讲到,SQL的特点之一是,在两种不同的使用方式下,SQL语言的语法结构基本上是一致
的。当然细节上会有许多差别,在程序设计的环境下,SQL语句要做某些必要的扩充。
3.7.1 嵌入式SQL的一般形式
对宿主型数据库语言SQL,DBMS可采用两种方法处理,一种是预编译,另一种是修改和扩充主
语言使之能处理SQL语句。目前采用较多的是预编译的方法。即由DBMS的预处理程序对源程序进行
扫描,识别出SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它,最后由主语言
的编译程序将整个源程序编译成目标码。
在嵌入式SQL中,为了能够区分SQL语句与主语言语句,所有SQL语句都必须加前缀EXEC
SQL。SQL语句的结束标志则随主语言的不同而不同。
3.7.2 嵌入式SQL语句与主语言之间的通信
将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制程序
流程。这时程序中会含有两种不同计算模型的语句,一种是描述性的面向集合的SQL语句,一种是过程
性的高级语言语句,它们之间应该如何通信呢?
数据库工作单元与源程序工作单元之间的通信主要包括:
(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此信息控制程序流程,主要用SQL
通信区(SQL Communication Area,简称SQLCA)实现;
(2)主语言向SQL语句提供参数,主要用主变量(Host Variable)实现;
(3)将SQL语句查询数据库的结果交主语言进一步处理,主要用主变量和游标(Cursor)实现。
一、SQL通信区
SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境
的各种数据。这些信息将送到SQL通信区SQLCA中。应用程序从SQLCA中取出这些状态信息,据此
决定接下来执行的语句。
SQLCA是一个数据结构,在应用程序中用EXEC SQL INCLUDE SQLCA加以定义。SQLCA中
有一个存放每次执行SQL语句后返回代码的变量SQLCODE。应用程序每执行完一条SQL 语句之后
都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理。如果SQLCODE等于预
定义的常量SUCCESS,则表示SQL语句成功,否则在SQLCODE存放错误代码。
例如,在执行删除语句DELETE后,不同的执行情况SQLCA中有下列不同的信息:
· 成功删除,并有删除的行数(SQLCODE=SUCCESS)
· 无条件删除警告信息
· 违反数据保护规则,拒绝操作
· 没有满足条件的行,一行也没有删除
· 由于各种原因,执行出错
二、主变量
嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据。我们把 SQL语句中使用的主
语言程序变量简称为主变量。
主变量根据其作用的不同,分为输入主变量和输出主变量。输入主变量由应用程序对其赋值,SQL
语句引用;输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序。一个主变量有可能既是
输入主变量又是输出主变量。利用输入主变量,可以指定向数据库中插入的数据,可以将数据库中的数
据修改为指定值,可以指定执行的操作,可以指定WHERE子句或HAVING子句中的条件。利用输出主
26变量,可以得到SQL语句的结果数据和状态。
一个主变量可以附带一个任选的指示变量(Indicator Variable)。指示变量是一个整型变量,用来
“指示”所指主变量的值或条件。指示变量可以指示输入主变量是否为空值,可以检测输出主变量是
否空值,值是否被截断。
所有主变量和指示变量必须在 SQL 语句 BEGIN DECLARE SECTION 与 END DECLARE
SECTION之间进行说明。说明之后,主变量可以在SQL语句中任何一个能够使用表达式的地方出现,
为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志。同
样,SQL语句中的指示变量前也必须加冒号,并且要紧跟在所指主变量之后。而在SQL语句之外,主变
量和指示变量均可以直接引用,不必加冒号。
三、游标
SQL语言与主语言具有不同的数据处理方式。SQL语言是面向集合的,一条SQL语句原则上可以
产生或处理多条记录。而主语言是面向记录的,一组主变量一次只能存放一条记录。所以仅使用主变量
并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标的概念,用游标来
协调这两种不同的处理方式。游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果 ,
每个游标区都有一个名字。用户可以通过游标逐一获取记录,并赋给主变量,交由主语言进一步处理。
四、程序实例
可以看到,在嵌入式SQL中,SQL语句与主语言语句分工非常明确。SQL语句用来直接与数据库
打交道,主语言语句用来控制程序流程以及对SQL语句的执行结果做进一步加工处理。SQL语句用主
变量从主语言中接收执行参数,操纵数据库;SQL语句的执行状态由DBMS送至SQLCA中;主语言程
序从SQLCA中取出状态信息,据此决定下一步操作;如果SQL语句从数据库中成功地检索出数据,则
通过主变量传给主语言做进一步处理。SQL语言和主语言的不同数据处理方式通过游标来协调。这实
际上反映了嵌入式SQL的工作原理。
3.7.3 不用游标的SQL语句
不用游标的SQL语句有:
· 说明性语句
· 数据定义语句
· 数据控制语句
· 查询结果为单记录的SELECT语句
· 非CURRENT形式的UPDATE语句
· 非CURRENT形式的DELETE语句
· INSERT语句
所有的说明性语句及数据定义与控制语句都不需要使用游标。它们是嵌入式SQL中最简单的一类
语句,不需要返回结果数据,也不需要使用主变量。在主语言中嵌入说明性语句及数据定义与控制语句,
只要给语句加上前缀EXEC SQL和语句结束符即可。
INSERT语句也不需要使用游标,但通常需要使用主变量。
SELECT语句、UPDATE语句、DELETE语句则要复杂些。
一、说明性语句
二、数据定义语句
三、数据控制语句
四、查询结果为单记录的SELECT语句
五、非CURRENT形式的UPDATE语句
六、非CURRENT形式的DELETE语句
七、INSERT语句
3.7.4 使用游标的SQL语句
必须使用游标的SQL语句有:
· 查询结果为多条记录的SELECT语句
27· CURRENT形式的UPDATE语句
· CURRENT形式的DELETE语句
一、查询结果为多条记录的SELECT语句
二、CURRENT形式的UPDATE语句和DELETE语句
3.7.5 动态SQL简介
在3.7.3节和3.7.4节中介绍的嵌入式SQL语句为编程提供了一定的灵活性,使用户可以在程序运
行过程中根据实际需要输入WHERE子句或HAVING子句中某些变量的值。这些SQL语句的共同特点
是,语句中主变量的个数与数据类型在预编译时都是确定的,只有主变量的值是程序运行过程中动态
输入的,称这类嵌入式SQL语句为静态SQL语句。
静态SQL语句提供的编程灵活性在许多情况下仍显得不足,有时候需要编写更为通用的程序。例
如,对SC表,任课教师想查询选修了他所授课程的学生学号及其成绩;班主任想查询某个学生选修的
课程号及相应成绩;学生想查询自己某门课程的成绩。也就是说查询条件、要查询的属性列是不确定的,
这时就无法用一条静态SQL语句实现了。
如果在预编译时下列信息不能确定,就必须使用动态SQL技术 ,如:
(1)SQL语句正文
(2)主变量个数
(3)主变量的数据类型
(4)SQL语句中引用的数据库对象(例如列、索引、基本表、视图等)
动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式:
1. 语句可变
允许用户在程序运行时临时输入完整的SQL语句。
2. 条件可变
对于非查询语句,条件子句有一定的可变性。例如删除学生选课记录,既可以是因某门课临时取消,
需要删除有关该课程的所有选课记录,也可以是因为某个学生退学,需要删除该学生的所有选课记录。
对于查询语句,SELECT子句是确定的,即语句的输出是确定的,其他子句(如WHERE子句、
HAVING短语)有一定的可变性。例如查询学生人数,可以是查询某个系的学生总数,查询某个性别的
学生人数,查询某个年龄段的学生人数,查询某个系某个年龄段的学生人数等,这时SELECT子句的目
标列表达式是确定的(COUNT(*)),但WHERE子句的条件是不确定的。
3. 数据库对象、查询条件均可变
对于查询语句,SELECT子句中的列名、FROM子句中的表名或视图名、WHERE子句和HAVING
短语中的条件等均可由用户临时构造,即语句的输入和输出可能都是不确定的。例如前面查询学生选
课关系SC的例子。对于非查询语句,涉及的数据库对象及条件也是可变的。
这几种动态形式几乎可覆盖所有的可变要求。为了实现上述三种可变形式,SQL提供了相应的语
句,例如EXECUTE IMMEDIATE,PREPARE,EXECUTE,DESCRIBE等。使用动态SQL技术更多的是
涉及程序设计方面的知识,而不是SQL语言本身,所以这里就不详细介绍了,有兴趣的读者可以参阅有
关书籍。
第八节 小结
本章系统而详尽地讲解了SQL语言。SQL是关系数据库语言的工业标准。各个数据库厂商支持的
SQL语言在遵循标准的基础上常常作不同的扩充或修改。本章介绍的是标准SQL,因此,本章的绝大部
分例子应能在不同的系统如Oracle,Sybase,DB2, Informix,SQL Server和Easybase,Openbase,DM2,
Cobase等众多系统上运行,也许有的例子在某些系统上需要稍作修改后才能运行。
在讲解了SQL语言的同时进一步讲解了关系数据库系统的基本概念,使这些概念更加具体、更加
丰富。
SQL语言可以分为数据定义、数据查询、数据更新、数据控制四大部分,有时人们把数据更新称为
28数据操纵,或把数据查询与数据更新合称为数据操纵。本章用很大的篇幅介绍了四部分的内容。
视图是关系数据库系统中的重要概念,这是因为合理使用视图具有许多优点。
SQL语言的数据查询功能是最丰富,也是最复杂的,读者应加强练习。
第4章 SQL Server 2000 语法基础
本章简单介绍了关系数据库管理系统SQL Server的数据类型,主要介绍了T-SQL语言的语法基础,
包括标识符、语法规则、运算符、变量、函数、流程控制语句等,让读者对关系数据库管理系统SQL
Server 2000的查询语言——T-SQL语言有一个基本的了解,从而进一步利用数据库进行开发打好基础。
第一节 SQL Server简介
SQL Server是使用客户机/服务器(C/S)体系结构的关系型数据库管理系统(RDBMS)。1988年推出
了第一个OS/2版本,1992年,SQL Server移植到NT上后,Microsoft成了这个项目的主导者, 1994年
以后,Microsoft专注于开发、推广SQL Server的Windows NT版本 1996年,Microsoft公司推出了SQL
Server 6.5版本 ,1998年,推出了SQL Server 7.0版本,2000年推出了SQL Server 2000。
SQL Server 2000常见的版本有:企业版(Enterprise Edition)、标准版(Standard Edition)、个人版
(Personal Edition)和开发人员版(Developer Edition)。
第二节 SQL Server的数据类型
1.二进制数据类型
二进制数据包括Binary、Varbinary和Image。
Binary数据类型既可以是固定长度,也可以是变长度的,Binary[(n)] 是 n 位固定的二进制数据。其
中,n 的取值范围是从1到8000。其存储容量的大小是 n + 4 个字节。
Varbinary[(n)]是n位变长度的二进制数据。其中,n的取值范围是从1到8000。其存储容量的大小是n
+ 4个字节。
Image数据类型是以位字符串存储的,不是由SQL Server解释的,必须由应用程序来解释。例如,应
用程序可以使用BMP、TIEF、GIF和JPEG格式把数据存储在Image数据类型中。
2.字符数据类型
字符数据是由任何字母、符号和数字任意组合而成的数据,字符数据的类型包括Char、Varchar和
Text。Varchar是变长字符数据,其长度不超过8KB。Char是定长字符数据,其长度最多为8KB。超过
8KB的ASCII数据可以使用Text数据类型存储。
3.Unicode 数据类型
Unicode数据类型包括Nchar,Nvarchar和Ntext。使用Unicode数据类型,所占用的空间是使用非
Unicode数据类型所占用的空间大小的两倍。
当列的长度变化时,应该使用Nvarchar字符类型,最多存储4000个字符;当列的长度固定不变时,
应该使用Nchar字符类型,最多可以存储4000个字符;当使用Ntext数据类型时,该列可以存储多于
4000个字符。
4.日期和时间数据类型
设置日期格式命令:Set DateFormat {format | @format _var }
其中,format | @format_var是日期的顺序。有效的参数包括 MDY(默认)、DMY、YMD、YDM、
MYD 和 DYM。
5.数字数据类型
29数字数据只包含数字。数字数据类型包括正数和负数、小数和整数。在 SQL Server 中,整数存储的
数据类型是Int,Smallint和Tinyint。
精确小数的数据在SQL Server中的数据类型是Decimal和 Numeric这种数据所占的存储空间根
据该数据的位数后的位数来确定。
在SQL Server中,近似小数数据的数据类型是Float和Real。例如,三分之一这个分数记作
0.3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据
不完全一样。
6.货币数据表示正的或者负的货币数量
在SQL Server中,货币数据的数据类型是Money和Smallmoney,Money数据类型要求8个存储字
节,Smallmoney 数据类型要求4个存储字节。
7.特殊数据类型
特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有 3种,即Timestamp、Bit 和
Uniqueidentifier。
第三节 T-SQL语言
在SQL Server中,使用的是T-SQL语言,T-SQL是ANSL SQL的加强版语言,它提供了标准的
SQL命令。另外,还对ANSL SQL命令做了许多扩充,提供类似Basic、Pascal和C等第三代语言的基本
功能,如变量说明、程序流程控制、语言功能函数等。但因为SQL Server与其他编程工具的定位点不同,
所以这些命令的功能侧重于处理SQL Server中的数据,其他功能仍需要前端设计工具(如 FoxPro、
Delphi、Power Builder和Visual Basic等)来处理。本节只介绍T-SQL语言的基本语法知识。
4.3.1标识符
数据库常规标识符遵守以下的命名规则:
(1)标识符长度可以从1~128个字符,局部临时标识符的长度不超过116个字符。
(2)标识符的首字符必须为字母、“-”、@、#符号。当标识符为@开头时,它表示局部变量或参数,以两
个@为开始符时,它表示一个全局变量。当标识符以#开始时,它表示一个临时数据库对象。
(3)标识符第一个字符后面的字符可以为Unicode Standard所定义的字符、数字、#或@符号。
(4)标识符内不能嵌入空格和特殊符号。
(5)标识符不能与关键字同名,无论是大写还是小写版本。
4.3.2语法规则、运算符、变量
1.注释
(1)单行注释:使用两个连在一起的减号“- -”作为注释符;
(2)多行注释:使用¡°/* */¡±作为注释符。
2.运算符
(1)算术运算符:算术运算符包括加、减、乘、除和取余(%)。
(2)赋值运算符:T-SQL中只有一个赋值运算符,即等号。
(3)位运算符:包括按位与(&)、按位或(|)、按位异或(^)和求反(~)。
(4)比较运算符:包括等于(=)、大于(>)、大于或等于(>=)、小于(<)、小于或等于(<=)、不等于(<>或!
=)、不小于(!<)、不大于(!>)。
(5)逻辑运算符:包括与(AND)、或(OR)和非(NOT)等运算符。逻辑运算返回布尔值,值为TRUE或
FALSE。
(6)字符串连接运算符(+)
连接运算符¡°+¡±用于连接两个或两个以上的字符或二进制串、列名或者串和列的混合体,将一个
串加入到另一个串的末尾。其语法如下: +
(7)运算符的优先级
30括号:();
乘、除、取余运算符:*,/,%;
加减运算符:+,-;
比较运算符:=,>,<,>=,<=,<>,!=,!>,!<;
位运算符:^,&,|;
逻辑运算符:NOT;
逻辑运算符:AND;
逻辑运算符:OR。
(1)全局变量
①全局变量不是由用户的程序定义的,它们是在服务器级定应义的。
②用户只能使用预先定义的全局变量。
③引用全局变量时,必须以标记符¡°@@¡±开头。
④全局变量对用户来说是只读的。
⑤局部变量的名称不能与全局变量的名称相同。
(2)局部变量
局部变量是用户可自定义的变量,它的作用范围仅在程序内部。在程序中通常用来储存从表中查
询到的数据,或当作程序执行过程中暂存变量使用。局部变量必须以¡°@¡±开头,而且必须先用
DECLARE命令说明后才可使用。
其说明形式如下:
DECLARE @变量名 变量类型 [,@变量名 变量类型…]
其中,变量类型可以是SQL Server支持的所有数据类型,也可以是用户自定义的数据类型。在
Transact-SQL中不能使用¡°变量=变量值¡±给变量赋值,必须使用SELECT或SET命令来设定变量的值,
其语法如下:
SELECT @局部变量=变量值
SET @局部变量=变量值
【例】声明一个长度为10 个字符的变量¡°id¡±并赋值
declare @id char(10)
select @id=‘10010001’
【注】可在Select命令查询数据时,在Select命令中直接将列值赋给变量。
【例】查询工号为¡°01119¡±的教师和成绩,将其分别赋予变量name和cj。
use teacherdb
declare @name char(30) , @cj char(10)
select @name=Sname, @cj=chengji
from student
where Sno='01119'
select @name as '姓名',@cj as '成绩'
4.3.3 函数
1.系统函数
系统函数用于获取有关计算机系统、用户、数据库和数据库对象的信息。系统函数可以让用户在得
到信息后,使用条件语句,根据返回的信息进行不同的操作。与其它函数一样,可以在SELECT 语句的
SELECT 和WHERE 子句以及表达式中使用系统函数。
2.字符串函数
字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于CHAR、VARCHAR、
BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。可以在
SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。常用的字符串函数有:
(1)字符转换函数
31有以下几种字符转换函数:
ASCII()
ASCII() 函数返回字符表达式最左端字符的ASCII 码值。 ASCII() 函数语法如下:
ASCII()
【例】
select ascii(123) as '123', ascii('123') as '123', ascii('abc') as 'abc'
运行结果如下:
123 “123” “abc”
---------------------------------
49 49 97
【注】在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起
来使用,否则出错。
CHAR()
CHAR()函数用于将ASCII 码转换为字符。其语法如下:
CHAR()
如果没有输入0 ~ 255之间的ASCII 码值,CHAR() 函数会返回一个NULL 值。
LOWER()
LOWER()函数把字符串全部转换为小写,其语法如下:
LOWER()
【例】
select lower('Abc'), lower('ABC')
运行结果为:
abc abc
UPPER()
UPPER()函数把字符串全部转换为大写,其语法如下:
UPPER(character_expression)
【例】 select upper('Abc'), lower('abc')
运行结果为:
ABC abc
STR()
STR() 函数把数值型数据转换为字符型数据,其语法如下:
STR ([,length[, ]])
变量length 和decimal 必须是非负值,length 指定返回的字符串的长度,decimal 指定返回的小
数位数。缺省的length 值为10,decimal 缺省值为0。
小数位数大于decimal 值时,STR()函数将其下一位四舍五入。指定长度应大于或等于数字的符号
位数+小数点前的位数+小数点位数+小数点后的位数。如果 小数点前的位数超过
了指定的长度,则返回指定长度的“*”。
【例】
select str(123), str(123456,5), str(-123.456,8,3), str(123.456,5), str(123.456,8,2)
运行结果如下:
----------------------------------
RTRIM()
RTRIM() 函数把字符串尾部的空格去掉,其语法如下:
RTRIM ()
【例】
32Select rtrim('123 ')
运行结果如下:
-------------------
123
注:在许多情况下,往往需要得到头部和尾部都没有空格字符的字符串,这时可将上两个函数嵌套
使用。
【例】
select rtrim (ltrim(' abcd '))
运行结果如下:
-------------------
abcd
(3)取子串函数
取子串函数如下所示:
LEFT()
LEFT() 函数返回部分字符串,其语法如下:
LEFT (, )
LEFT() 函数返回的子串是从字符串最左边起到第 integer_expression 个字符的部分。若
integer_expression 为负值,则返回NULL 值。
【例】
select left('SQL server 2000',10)
运行结果如下:
-------------------
SQL server
RIGHT()
RIGHT() 函数返回部分字符串,其语法如下:
RIGHT (, )
RIGHT() 函数返回的子串是从字符串右边第integer_expression 个字符起到最后一个字符的部分。
若integer_expression 为负值,则返回NULL 值。
【例】
select right(‘SQL server 2000’,4)
运行结果如下:
-------------------
2000
SUBSTRING()
SUBSTRING() 函数返回部分字符串,其语法如下:
SUBSTRING (, , length)
SUBSTRING()函数返回的子串是从字符串左边第 starting_ position 个字符起length个字符的部分。
其中表达式可以是字符串或二进制串或含字段名的表达式。SUBSTRING()函数不能用于TEXT 和
IMAGE 数据类型。
【例】
select substring('SQL server 2000',5,6)
运行结果如下:
-------------------
33server
(4)字符串比较函数
字符串比较函数如下所示:
CHARINDEX()
CHARINDEX()函数返回字符串中某个指定的子串出现的开始位置,其语法如下:
CHARINDEX (<’substring_expression’>, )
其中substring _expression 是所要查找的字符表达式。如果没有发现子串,则返回0
值。此函数不能用于TEXT 和IMAGE 数据类型。
【例】
select charindex ('def','abcdefgh')
运行结果如下:
-------------------
4
PATINDEX()
PATINDEX()函数返回字符串中某个指定的子串出现的开始位置,其语法如下:
PATINDEX (<’%substring _expression%’>, )
其中子串表达式前后必须有百分号“%”,否则返回值为0。
【例】
select patindex('%def%','abcdefgh'), patindex('def','abcdefgh')
运行结果如下:
-------------------
4 0
与CHARINDEX() 函数不同的是,PATINDEX() 函数的子串中可以使用通配符,且此函数
可用于CHAR、 VARCHAR 和TEXT 数据类型。
(5)字符串操作函数
字符串操作函数如下所示:
QUOTENAME()
QUOTENAME() 函数返回被特定字符括起来的字符串,语法:
QUOTENAME(<’character_expression’>[, quote_ character])
其中,quote_ character 标明括字符串所用的字符,如“‘”、“(”、“[” 等,缺省值为“[]”。
例: select quotename(‘123’,‘{’), quotename('123')
运行结果如下:
-------------------
{123} [123]
REPLICATE()
REPLICATE()函数返回一个重复character_expression指定次数的字符串,其语法如下:
REPLICATE(character_expression,integer_expression)
如果integer_expression值为负值,则返回NULL值。
【例】
select replicate('123',3), replicate('123',-3)
运行结果如下:
-------------------
123123123 NULL
34REVERSE()
REVERSE()函数将指定的字符串的字符排列顺序颠倒,其语法如下:
REVERSE ()
其中,character_expression 可以是字符串、常数或一个列的值。
【例】
select reverse(456), reverse('abc')
运行结果如下:
-------------------
654 cba
REPLACE()
REPLACE()函数返回被替换了指定子串的字符串,其语法如下:
REPLACE (, , )
函数用string_expression3 替换在string_expression1 中的子串string_expression2。
【例】
select replace('abcdefg', 'def', '123')
运行结果如下:
-------------------
abc123g
SPACE()
SPACE()函数返回一个有指定长度的空白字符串,其语法如下:
SPACE ()
如果integer_expression 值为负值,则返回NULL 。
【例】
select space(6), space(-3)
运行结果如下:
-------------------
NULL
STUFF()
STUFF()函数用另一子串替换字符串指定位置、长度的子串,其语法如下:
STUFF(, , ,)
如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL
值。
如果length 长度大于character_expression1 的长度,则character_expression1 只保留首字符。
【例】:
select stuff('abc123gh',3,3,'def'), stuff('123',6,2,'d'), stuff('123',1,3,'abc')
运行结果如下:
-------------------
abcdefgh NULL abc
3.日期和时间函数
(1)日期函数
日期函数用来操作DATETIME 和SMALLDATETIME 类型的数据,执行算术运算。其使用方法如
35下:
日期函数参数,其中参数个数应不同的函数而不同。
DAY()
语法如下:
DAY ()
函数返回date_expression 中的日期值。
【例】
select day(1), day(34), day('5/7/2005')
运行结果如下:
-------------------
2 4 7
MONTH()
函数语法如下:
MONTH ()
函数返回date_expression 中的月份值。
【例】
select month('5/7/2005'), month(8)
运行结果如下:
-------------------
5 1
注:与DAY()函数不同的是,MONTH()函数的参数为整数时,一律返回整数值1,即SQL Server
认为其是1900年1月。
·YEAR()
语法如下: YEAR ()
函数返回date_expression 中的年份值。
【例】 select year(1), year(2), year('5/7/2005')
运行结果如下:
-------------------
1900 1900 2005
【注】 在使用日期函数时,其日期值应在1753年到9999年之间,这是SQL Server系统所能识别的日期
范围,否则会出现错误。
【例】
select year('1/1/1400')
运行结果如下:
-------------------
服务器: 消息 242,级别 16,状态 3,行 1
4.数学函数
(1)三角函数
SIN(float_expression) 返回以弧度表示的角的正弦
COS(float_expression) 返回以弧度表示的角的余弦
TAN(float_expression) 返回以弧度表示的角的正切
COT(float_expression) 返回以弧度表示的角的余切
(2)反三角函数
ASIN(float_expression) 返回正弦是FLOAT 值的以弧度表示的角
36ACOS(float_expression) 返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) 返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2) 返回正切是 float_expression1 /float_expres-sion2的以弧
度表示的角。
(3)角度转换弧度函数
DEGREES(numeric_expression) 把弧度转换为角度返回与表达式相同的数据类型可为
INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) 把角度转换为弧度返回与表达式相同的数据类型可为 --
INTEGER/MONEY/REAL/FLOAT 类型
(4)幂函数
EXP(float_expression) 返回表达式的指数值
LOG(float_expression) 返回表达式的自然对数值
LOG10(float_expression) 返回表达式的以10 为底的对数值
SQRT(float_expression) 返回表达式的平方根
(5)取近似值函数
CEILING(numeric_expression) 返回>=表达式的最小整数返回的数据类型与表达式相同可为
NTEGER/MONEY/REAL/FLOAT类型。
FLOOR(numeric_expression) 返回<=表达式的最小整数返回的数据类型与表达式相同可为 --
INTEGER/MONEY/REAL/FLOAT类型。
ROUND(numeric_expression) 返回以integer_expression为精度的四舍五入值返回的数据。
(6)符号函数
ABS(numeric_expression) 返回表达式的绝对值。返回的数据类型与表达式相同可
为--INTEGER/MONEY/REAL/FLOAT类型。SIGN(numeric_expression) --测试参数的正负号返回0零值,
1正数或-1负数,返回的数据类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型。
(7)其它函数
PI() 返回值为π 即3.1415926535897931
RAND([integer_expression])用任选的[integer_expression]做种子值得出0-1间的随机浮点数。
4.3.4 流程控制语句
1. IF…ELSE
语法如下:
IF <条件表达式>
<命令行或程序块>
[ELSE [条件表达式]
<命令行或程序块>]
其中<条件表达式>可以是各种表达式的组合,但值必须是逻辑型“真”或“假”。
【例】
declare @a int, @b int, @c int
select @a=5, @b=6, @c=4
if @a>@b
print 'a>b' --打印字符串'a>b'
else if @b>@c
print 'b>c'
else print 'c>b'
运行结果如下
b>c
【注】 在Transact-SQL中最多可嵌套32级
372.BEGIN…END
其语法如下:
BEGIN
<命令行或程序块>
END
BEGIN…END用来设定一个程序块,将在BEGIN…END内的所有程序视为一个单元执行;
BEGIN…END经常在条件语句,如IF…ELSE中使用;
在BEGIN…END中可嵌套另外的BEGIN…END来定义另一程序块。
3.CASE
CASE命令有两种语句格式:
CASE <运算式>
WHEN <运算式>THEN<运算式>
…
WHEN<运算式>THEN<运算式>
[ELSE<运算式>]
END
或
CASE
WHEN <条件表达式> THEN <运算式>
WHEN <条件表达式> THEN <运算式>
[ ELSE <运算式>]
END
CASE命令可以嵌套到SQL命令中。
【例】在一个名为gzgl的数据库中,调整教职工的工资,职称为¡°教授1¡±的上调10%,职称为¡°副教授
¡±的上调8%,职称为¡°讲师¡±的上调6%,其它上调4%。
use gzgl
update zcgzb
set gz =
case
when zhicheng = ’ 教授’ then gz*1.1
when zhicheng = ’ 副教授’ then gz*1.08
when zhicheng = ’ 讲师’ then gz *1.06
else gz *1.04
end
【注意】 执行CASE子句时,只运行第一个匹配的子句。
4.WHILE…CONTINUE…BREAK
其语法如下:
WHILE <条件表达式>
BEGIN
<命令行或程序块>
[BREAK]
[CONTINUE]
[命令行或程序块]
END
WHILE 命令在设定的条件成立时会重复执行命令行。
CONTINUE命令可以让程序跳过CONTINUE 命令之后的语句,回到WHILE 循环的第一行命令。
38BREAK 命令则让程序完全跳出循环,结束WHILE 命令的执行。WHILE 语句也可以嵌套。
【例】利用WHILE…CONTINUE…BREAK语句对1到100进行求和。
declare @Count int, @Sum int
select @Sum = 0, @Count=1
while @Count <=100
begin
select @Sum=@Sum+@Count
select @Count=@Count+1
end
print @Sum
go
运行结果:
5050
5. WAITFOR
其语法如下:
WAITFOR {DELAY <‘时间’> | TIME <‘时间’>
| ERROREXIT | PROCESSEXIT | MIRROREXIT}
WAITFOR 命令用来暂时停止程序执行,直到所设定的等待时间已过或所设定的时间已到才继续往
下执行。其中‘时间’必须为DATETIME 类型的数据,如:’11:15:27’,但不包括日期。各关键字含义
如下:
· DELAY用来设定等待的时间最多可达24小时;
· TIME用来设定等待结束的时间点;
· ERROREXIT直到处理非正常中断;
· PROCESSEXIT直到处理正常或非正常中断;
· MIRROREXIT直到镜像设备失败。
【例】 等待2小时3分零5秒后才执行SELECT 语句
waitfor delay ’02:03:05’
select * from BookRecord
【例】 等到下午5点55分才执行SELECT 语句
waitfor time ’17:55:00’
select * from BookRecord
6. GOTO
语法如下:
GOTO 标识符
GOTO 命令用来改变程序执行的流程,使程序跳到标有标识符的程序行执行。作为跳转目标的标识
符可为数字与字符的组合,但必须以“:”结尾,如‘12:’或‘a_1:’。在GOTO 命令行,标识符后不必
跟“:”。
【例】 利GOTEO语句实现分行打印字符’1’、’2’、’3’、’4’
declare @i int
select @i = 1
bh_1:
print @i
select @i = @i + 1
while @i <= 4 goto bh_1
运行结果如下:
391
2
3
4
7. RETURN
语法如下:
RETURN [整数值]
RETURN命令用于结束当前程序的执行,返回到上一个调用它的程序或其它程序。在括号内可指定
一个返回值。
【例】
declare @i int, @j int
select @i = 5, @j= 4
if i>j
return 1
else
return -1
如果没有指定返回值,SQL Server 系统会根据程序执行的结果返回一个内定值。
如果运行过程产生了多个错误,SQL Server系统将返回绝对值最大的数值;如果此时用户此时定义
了返回值,则以返回用户定义的值。RETURN语句不能返回NULL值。
第5章 数据库设计
第一节 数据库设计概述
人们在总结信息资源开发、管理和服务的各种手段时,认为最有效的是数据库技术。数据库的应用
已越来越广泛。从小型的单项事务处理系统到大型复杂的信息系统大都用先进的数据库技术来保持系
统数据的整体性、完整性和共享性。目前,一个国家的数据库建设规模(指数据库的个数、种类)、数据库
信息量的大小和使用频度已成为衡量这个国家信息化程度的重要标志之一。
数据库设计是建立数据库及其应用系统的技术,是信息系统开发和建设中的核心技术,具体说,数
据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够
有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。这个问题是数据库在应用领域的
主要研究课题。
在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。
6.1.1 数据库和信息系统
从使用者角度看,信息系统是提供信息、辅助人们对环境进行控制和进行决策的系统。数据库是信
息系统的核心和基础。它把信息系统中大量的数据按一定的模型组织起来,提供存储、维护、检索数据
的功能,使信息系统可以方便、及时、准确地从数据库中获得所需的信息。一个信息系统的各个部分能
否紧密地结合在一起以及如何结合,关键在数据库。因此只有对数据库进行合理的逻辑设计和有效的
物理设计才能开发出完善而高效的信息系统。数据库设计是信息系统开发和建设的重要组成部分。
大型数据库的设计和开发是一项庞大的工程,是涉及多学科的综合性技术。其开发周期长、耗资多、
失败的风险也大。必须把软件工程的原理和方法应用到数据库建设中来。对于从事数据库设计的专业
人员来讲,应该具备多方面的技术和知识。主要有:
40· 数据库的基本知识和数据库设计技术;
· 计算机科学的基础知识和程序设计的方法和技巧;
· 软件工程的原理和方法;
· 应用领域的知识。
其中应用领域的知识随着应用系统所属的领域不同而不同。数据库设计人员必须深入实际与用户
密切结合,对应用环境、专业业务有具体深入的了解才能设计出符合具体领域要求的数据库应用系统。
6.1.2 数据库设计的特点
数据库设计既是一项涉及多学科的综合性技术又是一项庞大的工程项目。有人讲“三分技术,七
分管理,十二分基础数据”是数据库建设的基本规律,这是有一定道理的。技术与管理的界面(称之为
“干件”)十分重要。数据库建设是硬件、软件和干件的结合。这是数据库设计的特点之一。这里着重讨
论软件设计的技术。
数据库设计应该和应用系统设计相结合,也就是说,整个设计过程中要把结构(数据)设计和行为
(处理)设计密切结合起来。这是数据库设计的特点之二。
传统的软件工程忽视对应用中数据语义的分析和抽象。例如结构化设计(Structure Design,简称
SD方法)和逐步求精的方法着重于处理过程的特性,只要有可能就尽量推迟数据结构设计的决策。这
种方法显然对于数据库应用系统是不妥的。数据库模式是各应用程序共享的结构,是稳定的,永久的,
不像以文件系统为基础的应用系统,文件是某一应用程序私用的。数据库设计质量的好坏直接影响系
统中各个处理过程的性能和质量。
早期的数据库设计致力于数据模型和建模方法研究,着重结构特性的设计而忽视了对行为的设计。
也就是说比较重视在给定的应用环境下,采用什么原则、方法来建造数据库的结构,而没有考虑应用环
境要求与数据库结构的关系,因此结构设计与行为设计是分离的。
在数据库设计中如何把结构特性和行为特性相结合,许多学者和专家进行了探讨和实践(见本章
参考文献[9],[23])。
6.1.3 数据库设计方法简述
由于信息结构复杂,应用环境多样,在相当长的一段时期内数据库设计主要采用手工试凑法。使用
这种方法与设计人员的经验和水平有直接关系,数据库设计成为一种技艺而不是工程技术,缺乏科学
理论和工程方法的支持,工程的质量难以保证,常常是数据库运行一段时间后又不同程度地发现各种
问题,增加了系统维护的代价。十余年来,人们努力探索,提出了各种数据库设计方法,这些方法运用软
件工程的思想和方法,提出了各种设计准则和规程,都属于规范设计法。
规范设计法中比较著名的有新奥尔良(New Orleans)方法。它将数据库设计分为四个阶段:需求分
析(分析用户要求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)
其后,S.B.Yao等又将数据库设计分为五个步骤。又有I.R.Palmer等主张把数据库设计当成一步接一步
的过程,并采用一些辅助手段实现每一过程。
基于E-R模型的数据库设计方法,基于3NF(第三范式)的设计方法,基于抽象语法规范的设计方
法等,是在数据库设计的不同阶段上支持实现的具体技术和方法。
规范设计法从本质上看仍然是手工设计方法,其基本思想是过程迭代和逐步求精。
数据库工作者和数据库厂商一直在研究和开发数据库设计工具。经过十多年的努力,数据库设计
工具已经实用化和产品化。例如Design 2000 和PowerDesigner 分别是ORACLE公司和SYBASE公
司推出的数据库设计工具软件。这些工具软件可以自动地或辅助设计人员完成数据库设计过程中的很
多任务。人们已经越来越认识到自动数据库设计工具的重要性。特别是大型数据库的设计需要自动设
计工具的支持。人们也日益认识到数据库设计和应用设计应该同时进行,目前许多计算机辅助软件工
程(Computer Aided Sofeware Engineering,简称CASE)工具已经开始强调这两个方面。
6.1.4 数据库设计的基本步骤
按照规范设计的方法,考虑数据库及其应用系统开发全过程,将数据库设计分为以下六个阶段(如
图6.2所示):
· 需求分析;
41· 概念结构设计;
· 逻辑结构设计;
· 物理结构设计;
· 数据库实施;
· 数据库运行和维护。
数据库设计开始之前,首先必须选定参加设计的人员,包括系统分析人员、数据库设计人员和程序
员、用户和数据库管理员。系统分析和数据库设计人员是数据库设计的核心人员,他们将自始至终参与
数据库设计,他们的水平决定了数据库系统的质量。用户和数据库管理员在数据库设计中也是举足轻
重的,他们主要参加需求分析和数据库的运行维护,他们的积极参与不但能加速数据库设计,而且也是
决定数据库设计的质量的重要因素。程序员则在系统实施阶段参与进来,分别负责编制程序和准备软
硬件环境。
如果所设计的数据库应用系统比较复杂,还应该考虑是否需要使用数据库设计工具和 CASE工具
以提高数据库设计质量并减少设计工作量,以及选用何种工具。
1. 需求分析阶段
进行数据库设计首先必须准确了解与分析用户需求(包括数据与处理)。需求分析是整个设计过程
的基础,是最困难、最耗费时间的一步。作为地基的需求分析是否做得充分与准确,决定了在其上构建
数据库大厦的速度与质量。需求分析做得不好,甚至会导致整个数据库设计返工重做。
2. 概念结构设计阶段
概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立
于具体DBMS的概念模型。
3. 逻辑结构设计阶段
逻辑结构设计是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化。
4. 数据库物理设计阶段
数据库物理设计是为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方
法)。
5. 数据库实施阶段
在数据库实施阶段,设计人员运用DBMS提供的数据语言及其宿主语言,根据逻辑设计和物理设
计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
6. 数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行
评价、调整与修改。
设计一个完善的数据库应用系统是不可能一蹴而就的,它往往是上述六个阶段的不断反复。
需要指出的是,这个设计步骤既是数据库设计的过程,也包括了数据库应用系统的设计过程。在设
计过程中把数据库的设计和对数据库中数据处理的设计紧密结合起来,将这两个方面的需求分析、抽
象、设计、实现在各个阶段同时进行,相互参照,相互补充,以完善两方面的设计。事实上,如果不了解应
用环境对数据的处理要求,或没有考虑如何去实现这些处理要求,是不可能设计一个良好的数据库结
构的。
第二节 需求分析
需求分析简单地说就是分析用户的要求。需求分析是设计数据库的起点,需求分析的结果是否准
确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和实用。
6.2.1 需求分析的任务
需求分析的任务是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统
(手工系统或计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。新系统
必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计数据库。
42调查的重点是“数据”和“处理”,通过调查、收集与分析,获得用户对数据库如下要求:
(1)信息要求。指用户需要从数据库中获得信息的内容与性质。由信息要求可以导出数据要求,即
在数据库中需要存储哪些数据。
(2)处理要求。指用户要完成什么处理功能,对处理的响应时间有什么要求,处理方式是批处理还
是联机处理。
(3)安全性与完整性要求。
确定用户的最终需求是一件很困难的事,这是因为一方面用户缺少计算机知识,开始时无法确定
计算机究竟能为自己做什么,不能做什么,因此往往不能准确地表达自己的需求,所提出的需求往往不
断地变化。另一方面,设计人员缺少用户的专业知识,不易理解用户的真正需求,甚至误解用户的需求。
因此设计人员必须不断深入地与用户交流,才能逐步确定用户的实际需求。
6.2.2 需求分析的方法
进行需求分析首先是调查清楚用户的实际要求,与用户达成共识,然后分析与表达这些需求。
调查用户需求的具体步骤是:
(1)调查组织机构情况。包括了解该组织的部门组成情况、各部门的职责等,为分析信息流程做准
备。
(2)调查各部门的业务活动情况。包括了解各个部门输入和使用什么数据,如何加工处理这些数据,
输出什么信息,输出到什么部门,输出结果的格式是什么,这是调查的重点。
(3)在熟悉了业务活动的基础上,协助用户明确对新系统的各种要求,包括信息要求、处理要求、完
全性与完整性要求,这是调查的又一个重点。
(4)确定新系统的边界。对前面调查的结果进行初步分析,确定哪些功能由计算机完成或将来准备
让计算机完成,哪些活动由人工完成。由计算机完成的功能就是新系统应该实现的功能。
在调查过程中,可以根据不同的问题和条件,使用不同的调查方法。常用的调查方法有:
(1)跟班作业。通过亲身参加业务工作来了解业务活动的情况。这种方法可以比较准确地理解用户
的需求,但比较耗费时间。
(2)开调查会。通过与用户座谈来了解业务活动情况及用户需求。座谈时,参加者之间可以相互启
发。
(3)请专人介绍。
(4)询问。对某些调查中的问题,可以找专人询问。
(5)设计调查表请用户填写。如果调查表设计得合理,这种方法是很有效,也易于为用户接受。
(6)查阅记录。查阅与原系统有关的数据记录。
做需求调查时,往往需要同时采用上述多种方法。但无论使用何种调查方法,都必须有用户的积极
参与和配合。
在调查了解了用户需求以后,还需要进一步分析和表达用户的需求。在众多的分析方法中结构化
分析方法(Structured Analysis,简称SA方法)是一种简单实用的方法。SA方法从最上层的系统组织机
构入手,采用自顶向下、逐层分解的方式分析系统。
6.2.3 数据字典
数据流图表达了数据和处理的关系,数据字典则是系统中各类数据描述的集合,是进行详细的数
据收集和数据分析所获得的主要成果。数据字典在数据库设计中占有很重要的地位。
数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分。其中数据项是数据
的最小组成单位,若干个数据项可以组成一个数据结构,数据字典通过对数据项和数据结构的定义来
描述数据流、数据存储的逻辑内容。
1. 数据项
数据项是不可再分的数据单位。对数据项的描述通常包括以下内容:
数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,取值范围,
取值含义,与其他数据项的逻辑关系,数据项之间的联系}
其中“取值范围”、“与其他数据项的逻辑关系”(例如该数据项等于另几个数据项的和,该数据
43项值等于另一数据项的值等)定义了数据的完整性约束条件,是设计数据检验功能的依据。
可以用关系规范化理论为指导,用数据依赖的概念分析和表示数据项之间的联系。即按实际语义,
写出每个数据项之间的数据依赖,它们是数据库逻辑设计阶段数据模型优化的依据。
2. 数据结构
数据结构反映了数据之间的组合关系。一个数据结构可以由若干个数据项组成,也可以由若干个
数据结构组成,或由若干个数据项和数据结构混合组成。对数据结构的描述通常包括以下内容:
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
3. 数据流
数据流是数据结构在系统内传输的路径。对数据流的描述通常包括以下内容:
数据流描述={数据流名,说明,数据流来源,数据流去向,
组成:{数据结构},平均流量,高峰期流量}
其中“数据流来源”是说明该数据流来自哪个过程。“数据流去向”是说明该数据流将到哪个过
程去。“平均流量”是指在单位时间(每天、每周、每月等)里的传输次数。“高峰期流量”则是指在高
峰时期的数据流量。
4. 数据存储
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。它可以是手工文档或手
工凭单,也可以是计算机文档。对数据存储的描述通常包括以下内容:
数据存储描述={数据存储名,说明,编号,输入的数据流,输出的数据流,
组成:{数据结构},数据量,存取频度,存取方式}
其中“存取频度”指每小时或每天或每周存取几次、每次存取多少数据等信息。“存取方式”包
括是批处理还是联机处理;是检索还是更新;是顺序检索还是随机检索等。另外,“输入的数据流”要
指出其来源,“输出的数据流”要指出其去向。
5. 处理过程
处理过程的具体处理逻辑一般用判定表或判定树来描述。数据字典中只需要描述处理过程的说明
性信息,通常包括以下内容:
处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},
处理:{简要说明}}
其中“简要说明”中主要说明该处理过程的功能及处理要求。功能是指该处理过程用来做什么
(而不是怎么做),处理要求包括处理频度要求,如单位时间里处理多少事务、多少数据量、响应时间要
求等。这些处理要求是后面物理设计的输入及性能评价的标准。
可见,数据字典是关于数据库中数据的描述,即元数据,而不是数据本身。
数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实、完善的。
明确地把需求收集和分析作为数据库设计的第一阶段是十分重要的。这一阶段收集到的基础数据
(用数据字典来表达)和一组数据流程图(Data Flow Diagram,简称DFD)是下一步进行概念设计的基
础。
最后,要强调两点:
(1)需求分析阶段的一个重要而困难的任务是收集将来应用所涉及的数据,设计人员应充分考虑
到可能的扩充和改变,使设计易于更改,系统易于扩充,这是第一点。
(2)必须强调用户的参与,这是数据库应用系统设计的特点。数据库应用系统和广泛的用户有密
切的联系,许多人要使用数据库。数据库的设计和建立又可能对更多人的工作环境产生重要影响。因此
用户的参与是数据库设计不可分割的一部分。在数据分析阶段,任何调查研究没有用户的积极参加是
寸步难行的。设计人员应该和用户取得共同的语言,帮助不熟悉计算机的用户建立数据库环境下的共
同概念,并对设计工作的最后结果承担共同的责任。
44第三节 概念结构设计
将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计。它是整个数据
库设计的关键。
6.3.1 概念结构
在需求分析阶段所得到的应用需求应该首先抽象为信息世界的结构,才能更好地、更准确地用某
一DBMS实现这些需求。
概念结构的主要特点是:
(1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求。是
对现实世界的一个真实模型。
(2)易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库的设计成
功的关键。
(3)易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。
(4)易于向关系、网状、层次等各种数据模型转换。
概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定。
描述概念模型的有力工具是E-R模型。有关E-R模型的基本概念已在第一章介绍。下面将用E-R
模型来描述概念结构。
6.3.2 概念结构设计的方法与步骤
设计概念结构通常有四类方法:
· 自顶向下。即首先定义全局概念结构的框架,然后逐步细化。
· 自底向上。即首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构。
· 逐步扩张。首先定义最重要的核心概念结构,然后向外扩充,以滚雪球的方式逐步生成其他概念
结构,直至总体概念结构。
· 混合策略。即将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,以
它为骨架集成由自底向上策略中设计的各局部概念结构。
其中最经常采用的策略是自底向上方法。即自顶向下地进行需求分析,然后再自底向上地设计概
念结构。
这里只介绍自底向上设计概念结构的方法。它通常分为两步:第1步是抽象数据并设计局部视图,
第2步是集成局部视图,得到全局的概念结构。
6.3.3 数据抽象与局部视图设计
概念结构是对现实世界的一种抽象。所谓抽象是对实际的人、物、事和概念进行人为处理,抽取所
关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确地加以描述,这些概念组成了某种
模型。
6.3.4 视图的集成
各子系统的分E-R图设计好以后,下一步就是要将所有的分E-R图综合成一个系统的总E-R图。
一、合并分E-R图,生成初步E-R图
二、消除不必要的冗余,设计基本E-R图
第四节 逻辑结构设计
概念结构是独立于任何一种数据模型的信息结构。逻辑结构设计的任务就是把概念结构设计阶段
设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。
从理论上讲,设计逻辑结构应该选择最适于相应概念结构的数据模型,然后对支持这种数据模型
的各种DBMS进行比较,从中选出最合适的DBMS。但实际情况往往是已给定了某种DBMS,设计人员
没有选择的余地。目前DBMS产品一般支持关系、网状、层次三种模型中的某一种,对某一种数据模型,
各个机器系统又有许多不同的限制,提供不同的环境与工具。所以设计逻辑结构时一般要分三步进行:
45(1)将概念结构转换为一般的关系、网状、层次模型;
(2)将转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换;
(3)对数据模型进行优化。
6.4.1 E-R图向关系模型的转换
E-R图向关系模型的转换要解决的问题是如何将实体和实体间的联系转换为关系模式,如何确定
这些关系模式的属性和码。
关系模型的逻辑结构是一组关系模式的集合。E-R图则是由实体、实体的属性和实体之间的联系三
个要素组成的。所以将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转
换为关系模式,这种转换一般遵循如下原则:
一个实体型转换为一个关系模式。实体的属性就是关系的属性,实体的码就是关系的码。
对于实体间的联系则有以下不同的情况:
(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果
转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,
每个实体的码均是该关系的候选码。如果与某一端实体对应的关系模式合并,则需要在该关系模式的
属性中加入另一个关系模式的码和联系本身的属性。
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换
为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而
关系的码为n端实体的码。
(3)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换
为关系的属性,而关系的码为各实体码的组合。
(4)三个或三个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系相连的各实
体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合。
(6)具有相同码的关系模式可合并。
形成了一般的数据模型后,下一步就是向特定的RDBMS的模型转换。设计人员必须熟悉所用
RDBMS的功能与限制。这一步是依赖于机器的,不能给出一个普遍的规则,但对于关系模型来说,这种
转换通常都比较简单,不会有太多的困难。
6.4.2 数据模型的优化
数据库逻辑设计的结果不是唯一的。为了进一步提高数据库应用系统的性能,还应该根据应用需
要适当地修改、调整数据模型的结构,这就是数据模型的优化。关系数据模型的优化通常以规范化理论
为指导,方法为:
1. 确定数据依赖。在6.2.3“数据字典”一节中已讲到用数据依赖分析和表示数据项之间的联系,
写出每个数据项之间的数据依赖。如果需求分析阶段没有来得及做,可以现在补做,即按需求分析阶段
所得到的语义,分别写出每个关系模式内部各属性之间的数据依赖以及不同关系模式属性之间的数据
依赖。
2. 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系,具体方法已在6.3.4中讲
解。
3. 按照数据依赖的理论对关系模式逐一进行分析,考察是否存在部分函数依赖、传递函数依赖、多
值依赖等,确定各关系模式分别属于第几范式。
4. 按照需求分析阶段得到的处理要求,分析对于这样的应用环境这些模式是否合适,确定是否要
对某些模式进行合并或分解。
必须注意的是,并不是规范化程度越高的关系就越优。例如,当查询经常涉及到两个或多个关系模
式的属性时,系统经常进行连接运算。连接运算的代价是相当高的,可以说关系模型低效的主要原因就
是连接运算引起的。这时可以考虑将这几个关系合并为一个关系。因此在这种情况下,第二范式甚至第
一范式也许是合适的。
又如,非BCNF的关系模式虽然从理论上分析会存在不同程度的更新异常或冗余,但如果在实际
应用中对此关系模式只是查询,并不执行更新操作,则就不会产生实际影响。所以对于一个具体应用来
46说,到底规范化到什么程度,需要权衡响应时间和潜在问题两者的利弊决定。
5. 对关系模式进行必要的分解, 提高数据操作的效率和存储空间的利用率。常用的两种分解方法
是水平分解和垂直分解。
水平分解是把(基本)关系的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效
率。 根据“80/20原则”,一个大关系中,经常被使用的数据只是关系的一部分,约20%,可以把经常使
用的数据分解出来,形成一个子关系。 如果关系R上具有n个事务,而且多数事务存取的数据不相交,
则R可分解为少于或等于n个子关系,使每个事务存取的数据对应一个关系。
垂直分解是把关系模式R的属性分解为若干子集合,形成若干子关系模式。垂直分解的原则是,经
常在一起使用的属性从R中分解出来形成一个子关系模式。垂直分解可以提高某些事务的效率,但也
可能使另一些事务不得不执行连接操作,从而降低了效率。因此是否进行垂直分解取决于分解后R上
的所有事务的总效率是否得到了提高。垂直分解需要确保无损连接性和保持函数依赖,即保证分解后
的关系具有无损连接性和保持函数依赖性。这可以用第五章中的模式分解算法对需要分解的关系模式
进行分解和检查。
规范化理论为数据库设计人员判断关系模式优劣提供了理论标准,可用来预测模式可能出现的问
题,使数据库设计工作有了严格的理论基础。
6.4.3 设计用户子模式
将概念模型转换为全局逻辑模型后,还应该根据局部应用需求,结合具体DBMS的特点,设计用户
的外模式。
目前关系数据库管理系统一般都提供了视图(View)概念,可以利用这一功能设计更符合局部用户
需要的用户外模式。
定义数据库全局模式主要是从系统的时间效率、空间效率、易维护等角度出发。由于用户外模式与
模式是相对独立的,因此在定义用户外模式时可以注重考虑用户的习惯与方便。包括:
(1)使用更符合用户习惯的别名
在合并各分E-R图时,曾做了消除命名冲突的工作,以使数据库系统中同一关系和属性具有唯一
的名字。这在设计数据库整体结构时是非常必要的。用View机制可以在设计用户View时重新定义某
些属性名,使其与用户习惯一致,以方便使用。
(2)可以对不同级别的用户定义不同的View,以保证系统的安全性。
假设有关系模式产品(产品号,产品名,规格,单价,生产车间,生产负责人,产品成本,产品合格率,
质量等级),可以在产品关系上建立两个视图:
为一般顾客建立视图:
产品1(产品号,产品名,规格,单价)
为产品销售部门建立图:
产品2(产品号,产品名,规格,单价,车间,生产负责人)
顾客视图中只包含允许顾客查询的属性;销售部门视图中只包含允许销售部门查询的属性。生产
领导部门则可以查询全部产品数据。这样就可以防止用户非法访问本来不允许他们查询的数据,保证
了系统的安全性。
(3)简化用户对系统的使用
如果某些局部应用中经常要使用某些很复杂的查询,为了方便用户,可以将这些复杂查询定义为
视图,用户每次只对定义好的视图进行查询,大大简化了用户的使用。
第五节 数据库的物理设计
数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于给定的计算机系统。
为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程,就是数据库的物理设计。
数据库的物理设计通常分为两步:
47(1)确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构;
(2)对物理结构进行评价,评价的重点是时间和空间效率。
如果评价结果满足原设计要求,则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,
有时甚至要返回逻辑设计阶段修改数据模型。
6.5.1 数据库的物理设计的内容和方法
不同的数据库产品所提供的物理环境、存取方法和存储结构有很大差别,能供设计人员使用的设
计变量、参数范围也很不相同,因此没有通用的物理设计方法可遵循,只能给出一般的设计内容和原则。
希望设计优化的物理数据库结构,使得在数据库上运行的各种事务响应时间小、存储空间利用率高、事
务吞吐率大。为此首先对要运行的事务进行详细分析,获得选择物理数据库设计所需要的参数。其次,
要充分了解所用RDBMS的内部特征,特别是系统提供的存取方法和存储结构。
对于数据库查询事务,需要得到如下信息:
· 查询的关系;
· 查询条件所涉及的属性;
· 连接条件所涉及的属性;
· 查询的投影属性。
对于数据更新事务,需要得到如下信息:
· 被更新的关系;
· 每个关系上的更新操作条件所涉及的属性;
· 修改操作要改变的属性值。
除此之外,还需要知道每个事务在各关系上运行的频率和性能要求。例如,事务T必须在10秒钟
内结束,这对于存取方法的选择具有重大影响。
上述这些信息是确定关系的存取方法的依据。
应注意的是,数据库上运行的事务会不断变化、增加或减少,以后需要根据上述设计信息的变化调
整数据库的物理结构。
通常对于关系数据库物理设计的内容主要包括 :
· 为关系模式选择存取方法;
· 设计关系、索引等数据库文件的物理存储结构。
下面就介绍这些设计内容和方法。
6.5.2 关系模式存取方法选择
数据库系统是多用户共享的系统,对同一个关系要建立多条存取路径才能满足多用户的多种应用
要求。物理设计的任务之一就是要确定选择哪些存取方法,即建立哪些存取路径。
存取方法是快速存取数据库中数据的技术。数据库管理系统一般都提供多种存取方法。常用的存
取方法有三类。第一类是索引方法,目前主要是B+树索引方法;第二类是聚簇(Cluster)方法;第三类是
HASH方法。
B+树索引方法是数据库中经典的存取方法,使用最普遍。
一、索引存取方法的选择
所谓选择索引存取方法实际上就是根据应用要求确定对关系的哪些属性列建立索引、哪些属性列
建立组合索引、哪些索引要设计为唯一索引等。一般来说:
1. 如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性上建立索引(或组合
索引);
2. 如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引;
3. 如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立
索引;
关系上定义的索引数并不是越多越好,系统为维护索引要付出代价,查找索引也要付出代价。例如,
若一个关系的更新频率很高,这个关系上定义的索引数不能太多。因为更新一个关系时,必须对这个关
系上有关的索引做相应的修改。
48二、聚簇存取方法的选择
为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组
集中存放在连续的物理块称为聚簇。
聚簇功能可以大大提高按聚簇码进行查询的效率。例如要查询信息系的所有学生名单,设信息系
有500名学生,在极端情况下,这500名学生所对应的数据元组分布在500个不同的物理块上。尽管对
学生关系已按所在系建有索引,由索引很快找到了信息系学生的元组标识,避免了全表扫描,然而再由
元组标识去访问数据块时就要存取500个物理块,执行500次I/O操作。如果将同一系的学生元组集中
存放,则每读一个物理块可得到多个满足查询条件的元组,从而显著地减少了访问磁盘的次数。
聚簇功能不但适用于单个关系,也适用于经常进行连接操作的多个关系。即把多个连接关系的元
组按连接属性值聚集存放,聚簇中的连接属性称为聚簇码。这就相当于把多个关系按“预连接”的形
式存放,从而大大提高连接操作的效率。
一个数据库可以建立多个聚簇,一个关系只能加入一个聚簇。
选择聚簇存取方法,即确定需要建立多少个聚簇,每个聚簇中包括哪些关系。
下面先设计候选聚簇,一般来说:
(1)对经常在一起进行连接操作的关系可以建立聚簇;
(2)如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚簇;
(3)如果一个关系的一个(或一组)属性上的值重复率很高,则此单个关系可建立聚簇。即对应每个
聚簇码值的平均元组数不太少。太少了,聚簇的效果不明显。
然后检查候选聚簇中的关系,取消其中不必要的关系。
(1)从聚簇中删除经常进行全表扫描的关系;
(2)从聚簇中删除更新操作远多于连接操作的关系;
(3)不同的聚簇中可能包含相同的关系,一个关系可以在某一个聚簇中,但不能同时加入多个聚簇。
要从这多个聚簇方案(包括不建立聚簇)中选择一个较优的,即在这个聚簇上运行各种事务的总代价最
小。
必须强调的是,聚簇只能提高某些应用的性能,而且建立与维护聚簇的开销是相当大的。对已有关
系建立聚簇,将导致关系中元组移动其物理存储位置,并使此关系上原有的索引无效,必须重建。当一
个元组的聚簇码值改变时,该元组的存储位置也要做相应移动,聚簇码值要相对稳定,以减少修改聚簇
码值所引起的维护开销。
因此,当通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是
次要的,这时可以使用聚簇。尤其当SQL语句中包含有与聚簇码有关的ORDER BY,GROUP BY,
UNION,DISTINCT等子句或短语时,使用聚簇特别有利,可以省去对结果集的排序操作;否则很可能
会适得其反。
三、HASH存取方法的选择
有些数据库管理系统提供了HASH存取方法。选择HASH存取方法的规则如下:
如果一个关系的属性主要出现在等连接条件中或主要出现在相等比较选择条件中,而且满足下列
两个条件之一,则此关系可以选择HASH存取方法:
(1)如果一个关系的大小可预知,而且不变;
(2)如果关系的大小动态改变,而且数据库管理系统提供了动态HASH存取方法。
6.5.3 确定数据库的存储结构
确定数据库物理结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、聚簇、日志、备
份等的存储安排和存储结构;确定系统配置等。
确定数据的存放位置和存储结构要综合考虑存取时间、存储空间利用率和维护代价三方面的因素。
这三个方面常常是相互矛盾的,因此需要进行权衡,选择一个折中方案。
1. 确定数据的存放位置
为了提高系统性能,应该根据应用情况将数据的易变部分与稳定部分、经常存取部分和存取频率
较低部分分开存放。
49例如,目前许多计算机都有多个磁盘,因此可以将表和索引放在不同的磁盘上,在查询时,由于两
个磁盘驱动器并行工作,可以提高物理I/O读写的效率;也可以将比较大的表分放在两个磁盘上,以加
快存取速度,这在多用户环境下特别有效;还可以将日志文件与数据库对象(表、索引等)放在不同的磁
盘上以改进系统的性能。此外,数据库的数据备份和日志文件备份等只在故障恢复时才使用,而且数据
量很大,可以存放在磁带上。
由于各个系统所能提供的对数据进行物理安排的手段、方法差异很大,因此设计人员应仔细了解
给定的RDBMS提供的方法和参数,针对应用环境的要求,对数据进行适当的物理安排。
2. 确定系统配置
DBMS产品一般都提供了一些系统配置变量、存储分配参数,供设计人员和DBA对数据库进行物
理优化。初始情况下,系统都为这些变量赋予了合理的缺省值。但是这些值不一定适合每一种应用环境,
在进行物理设计时,需要重新对这些变量赋值,以改善系统的性能。
系统配置变量很多,例如:同时使用数据库的用户数,同时打开的数据库对象数,内存分配参数,缓
冲区分配参数(使用的缓冲区长度、个数),存储分配参数,物理块的大小,物理块装填因子,时间片大小,
数据库的大小,锁的数目,等等。这些参数值影响存取时间和存储空间的分配,在物理设计时就要根据
应用环境确定这些参数值,以使系统性能最佳。
在物理设计时对系统配置变量的调整只是初步的,在系统运行时还要根据系统实际运行情况做进
一步的调整,以期切实改进系统性能。
6.5.4 评价物理结构
数据库物理设计过程中需要对时间效率、空间效率、维护代价和各种用户要求进行权衡,其结果可
以产生多种方案,数据库设计人员必须对这些方案进行细致的评价,从中选择一个较优的方案作为数
据库的物理结构。
评价物理数据库的方法完全依赖于所选用的DBMS,主要是从定量估算各种方案的存储空间、存
取时间和维护代价入手,对估算结果进行权衡、比较,选择出一个较优的合理的物理结构。如果该结构
不符合用户需求,则需要修改设计。
第六节 数据库的实施和维护
完成数据库的物理设计之后,设计人员就要用RDBMS提供的数据定义语言和其他实用程序将数
据库逻辑设计和物理设计结果严格描述出来,成为DBMS可以接受的源代码,再经过调试产生目标模
式。然后就可以组织数据入库了,这就是数据库实施阶段。
6.6.1 数据的载入和应用程序的调试
数据库实施阶段包括两项重要的工作,一项是数据的载入,另一项是应用程序的编码和调试。
一般数据库系统中,数据量都很大,而且数据来源于部门中的各个不同的单位,数据的组织方式、
结构和格式都与新设计的数据库系统有相当的差距,组织数据录入就要将各类源数据从各个局部应用
中抽取出来,输入计算机,再分类转换,最后综合成符合新设计的数据库结构的形式,输入数据库。因此
这样的数据转换、组织入库的工作是相当费力费时的工作。
特别是原系统是手工数据处理系统时,各类数据分散在各种不同的原始表格、凭证、单据之中。在
向新的数据库系统中输入数据时,还要处理大量的纸质文件,工作量就更大。
由于各个不同的应用环境差异很大,不可能有通用的转换器,DBMS产品也不提供通用的转换工
具。为提高数据输入工作的效率和质量,应该针对具体的应用环境设计一个数据录入子系统,由计算机
来完成数据入库的任务。
由于要入库的数据在原来的系统中的格式结构与新系统中不完全一样,有的差别可能还比较大,
不仅向计算机内输入数据时发生错误,转换过程中也有可能出错。因此在源数据入库之前要采用多种
方法对它们进行检验,以防止不正确的数据入库,这部分的工作在整个数据输入子系统中是非常重要
的。
50在设计数据输入子系统时还要注意原有系统的特点,例如对原有系统是人工数据处理系统的情况,
尽管新系统的数据结构可能与原系统有很大差别,在设计数据输入子系统时,尽量让输入格式与原系
统结构相近,这不仅使处理手工文件比较方便,更重要的是减少用户出错的可能性,保证数据输入的质
量。现有的DBMS一般都提供不同DBMS之间数据转换的工具,若原来是数据库系统,就可以利用新
系统的数据转换工具,先将原系统中的表转换成新系统中相同结构的临时表,再将这些表中的数据分
类、转换、综合成符合新系统的数据模式,插入相应的表中。
数据库应用程序的设计应该与数据库设计同时进行,因此在组织数据入库的同时还要调试应用程
序。应用程序的设计、编码和调试的方法、步骤在软件工程等课程中有详细讲解,这里就不赘述了。
6.6.2 数据库的试运行
在原有系统的数据有一小部分已输入数据库后,就可以开始对数据库系统进行联合调试,这又称
为数据库的试运行。
这一阶段要实际运行数据库应用程序,执行对数据库的各种操作,测试应用程序的功能是否满足
设计要求。如果不满足,对应用程序部分则要修改、调整,直到达到设计要求为止。
在数据库试运行时,还要测试系统的性能指标,分析其是否达到设计目标。在对数据库进行物理设
计时已初步确定了系统的物理参数值,但一般的情况下,设计时的考虑在许多方面只是近似的估计,和
实际系统运行总有一定的差距,因此必须在试运行阶段实际测量和评价系统性能指标。事实上,有些参
数的最佳值往往是经过运行调试后找到的。如果测试的结果与设计目标不符,则要返回物理设计阶段,
重新调整物理结构,修改系统参数,某些情况下甚至要返回逻辑设计阶段,修改逻辑结构。
这里特别要强调两点,第一,上面已经讲到组织数据入库是十分费时费力的事,如果试运行后还要
修改数据库的设计,还要重新组织数据入库。因此应分期分批地组织数据入库,先输入小批量数据做调
试用,待试运行基本合格后,再大批量输入数据,逐步增加数据量,逐步完成运行评价。
第二,在数据库试运行阶段,由于系统还不稳定,硬、软件故障随时都可能发生。而系统的操作人员
对新系统还不熟悉,误操作也不可避免,因此应首先调试运行DBMS的恢复功能,做好数据库的转储和
恢复工作。一旦故障发生,能使数据库尽快恢复,尽量减少对数据库的破坏。
6.6.3 数据库的运行和维护
数据库试运行合格后,数据库开发工作就基本完成,即可投入正式运行了。但是,由于应用环境在
不断变化,数据库运行过程中物理存储也会不断变化,对数据库设计进行评价、调整、修改等维护工作
是一个长期的任务,也是设计工作的继续和提高。
在数据库运行阶段,对数据库经常性的维护工作主要是由DBA完成的,它包括:
1. 数据库的转储和恢复
数据库的转储和恢复是系统正式运行后最重要的维护工作之一。DBA要针对不同的应用要求制定
不同的转储计划,以保证一旦发生故障能尽快将数据库恢复到某种一致的状态,并尽可能减少对数据
库的破坏。
2. 数据库的安全性、完整性控制
在数据库运行过程中,由于应用环境的变化,对安全性的要求也会发生变化,比如有的数据原来是
机密的,现在是可以公开查询的了,而新加入的数据又可能是机密的了。系统中用户的密级也会改变。
这些都需要DBA根据实际情况修改原有的安全性控制。同样,数据库的完整性约束条件也会变化,也
需要DBA不断修正,以满足用户要求。
3. 数据库性能的监督、分析和改造
在数据库运行过程中,监督系统运行,对监测数据进行分析,找出改进系统性能的方法是DBA的
又一重要任务。目前有些DBMS产品提供了监测系统性能参数的工具,DBA可以利用这些工具方便地
得到系统运行过程中一系列性能参数的值。DBA应仔细分析这些数据,判断当前系统运行状况是否是
最佳,应当做哪些改进。例如调整系统物理参数,或对数据库进行重组织或重构造等。
4. 数据库的重组织与重构造
数据库运行一段时间后,由于记录不断增、删、改,会使数据库的物理存储情况变坏,降低了数据的
存取效率,数据库性能下降,这时DBA就要对数据库进行重组织,或部分重组织(只对频繁增、删的表
51进行重组织)。DBMS一般都提供数据重组织用的实用程序。在重组织的过程中,按原设计要求重新安
排存储位置、回收垃圾、减少指针链等,提高系统性能。
数据库的重组织,并不修改原设计的逻辑和物理结构,而数据库的重构造则不同,它是指部分修改
数据库的模式和内模式。
由于数据库应用环境发生变化,增加了新的应用或新的实体,取消了某些应用,有的实体与实体间
的联系也发生了变化等,使原有的数据库设计不能满足新的需求,需要调整数据库的模式和内模式。例
如,在表中增加或删除某些数据项,改变数据项的类型,增加或删除某个表,改变数据库的容量,增加或
删除某些索引等。当然数据库的重构也是有限的,只能做部分修改。如果应用变化太大,重构也无济于
事,说明此数据库应用系统的生命周期已经结束,应该设计新的数据库应用系统了。
第七节 小结
数据库设计这一章主要讨论数据库设计的方法和步骤,列举了较多的实例,详细介绍了数据库设
计各个阶段的目标、方法、应注意的事项。其中的重点是概念结构的设计和逻辑结构的设计,这也是数
据库设计过程中最重要的两个环节。学习这一章,要努力掌握书中讨论的基本方法,还要能在实际工作
中运用这些思想,设计符合应用需求的数据库应用系统。
52