Presentation is loading. Please wait.

Presentation is loading. Please wait.

数据库原理与设计方法 东南大学自动控制系 邵家玉

Similar presentations


Presentation on theme: "数据库原理与设计方法 东南大学自动控制系 邵家玉"— Presentation transcript:

1 数据库原理与设计方法 东南大学自动控制系 邵家玉 EMAIL:qj@seu.edu.cn sjy@njmai.com 邵家玉@中国
课件下载:

2 参考书: 1.王能斌。数据库系统。电子工业出版社。1995年。 2.王能斌编。数据库系统原理。电子工业出版社。2000年。 3.王珊 陈红。数据库系统原理教程。 4.[美]J·D·厄尔曼。数据库系统原理。

3 第一章       Introduction 1.1    Concepts 1.1.1   Data、DataBase、DataBase System、DataBase Management System 1.       Data (李明,男,1972,江苏,计算机系,1990) 数据、信息、知识三者之间的关系: 数据的语义即为信息,信息在计算机中的存储(表示形式)即为数据。从信息中提升、推理、推导出的新的信息即为知识。 例如:40(数据)—40℃(信息)—发烧(知识)

4 2.       Database——DB 3.       Database Management System——DBMS 4.       database system——DBS 数据库管理员(database administrator,简称DBA)。

5

6 5.       Data Model 数据模型是用来描述数据的一组概念和定义。一般来说,数据的描述包括两个方面: (1)数据的静态特性 它包括数据的基本结构、数据间的联系和数据中的约束。 (2)数据的动态特性 它指定义在数据上的操作。 如文件系统。 数据模型要面向现实世界,面向用户。

7 数据模型要面向实现,面向计算机。 1)      conceptual data model 如ER模型、面向对象数据模型等。 2)      logical data model 如关系数据模型、层次模型、网状模型等。 3)      physical data model 概念数据模型只用于数据库的设计,逻辑数据模型和物理数据模型用于DBMS的实现。

8 6.       Data Schema type: 型是该数据所属数据类型的说明。 value: 值是型的一个实例(instance或occurrence)。 对某一类数据的结构、联系和约束的描述是型的描述,型的描述称为数据模式(Data Schema)。在同一数据模式下,可以有很多的值,即实例。 例如,学生记录可以定义为图1-3(a)的形式,这是数据模式。而图1-3(b)是其一个实例。

9

10 数据模型是描述数据的手段.而数据模式是用给定数据模型对具体数据的描述。
美国国家标准协会(ANSI)的ANSI/X3/SPARC报告把数据模式分为三级(见图1-4)。

11 1)      conceptual schema/logical schema
2)      external schema 3)      internal schema 7.       Database Instance 数据模式是相对稳定的,而实例是相对变动的。数据模式反映一个单位的各种事物的结构、属性、联系和约束,实质上是用数据模型对一个单位的模拟。而实例反映数据库的某一时刻的状态,也就是这一单位在此时的状态。

12 1.1.2   数据库技术的产生与发展 1.       人工管理阶段 人工管理数据具有如下特点: 1)      数据不保存。 2)      数据需要由应用程序自己管理,没有相应的软件系统负责数据的管理工作。 3)      数据不共享。 4)      数据不具有独立性。 人工管理阶段应用程序与数据之间的对应关系可用图l-3表示。

13 2.       文件系统阶段 用文件系统管理数据具有如下特点: 1)      数据可以长期保存。 2)      由专门的软件即文件系统进行数据管理。 3)      数据共享性差。 4)     数据独立性低。

14 文件系统阶段应用程序与数据之间的关系如图1-4所示。
3.       数据库系统阶段 用数据库系统来管理数据具有如下特点:

15 1)      数据结构化 学生人事记录 学号 姓名 性别 系别 年龄 政治面貌 家庭出身 籍贯 家庭成员 奖惩情况 图1-5

16

17

18 2)      数据的共享性好,冗余度低 3)      数据独立性高 4)      数据由DBMS统一管理和控制 l       数据的安全性(security) l       数据的完整性(integrity) l    并发(concurrency)控制 l       数据库恢复(recovery)

19 量大 持久 共享

20 1.1.3   数据库技术的研究领域 1.       数据库管理系统软件的研制 2.       数据库设计 3.       数据库理论 1.2    数据库工程与应用 1.2.1   数据库设计的目标与特点

21 图 1-10

22 1.2.2   数据库设计方法 新奥尔良方法:需求分析(分析用户要求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)。 S.B.Yao:需求分析、模式构成、模式汇总、模式重构、模式分析和物理数据库设计。 I.R.Palmer则主张把数据库设计当成一步接一步的过程,并采用一些辅助手段实现每一过程。 此外,基于E—R模型的数据库设计方法,基于3NF(第三范式)的设计方法,基于抽象语法规范的设计方法等。

23 规范设计法在具体使用中又可以分为两类:手工设计和计算机辅助数据库设计。
ORACLE Designer 2000 1.2.3   数据库设计步骤 图1-11 1.       需求分析 2.       概念结构设计 3.       逻辑结构设计 4.       数据库物理设计 5.       数据库实施 6.       数据库运行和维护

24 在数据库设计过程中必须注意以下问题。 1.       数据库设计过程中要注意充分调动用户的积极性。 2.       应用环境的改变、新技术的出现等都会导致应用需求的变化,因此设计人员在设计数据库时必须充分考虑到系统的可扩充性,使设计易于变动。 3.       系统的可扩充性最终都是有一定限度的。 1.2.4  Database Application

25 各种用户的数据视图

26 DBA主要职责包括: 1.       设计与定义数据库系统 2.       帮助最终用户使用数据库系统 3.       监督与控制数据库系统的使用和运行 4.      改进和重组数据库系统,调优数据库系统的性能 5.       转储与恢复数据库 6.       重构数据库

27 第二章       Data Model 数据模型应满足三方面要求:一是能比较真实地模拟现实世界;二是容易为人所理解;三是便于在计算机上实现。 两类:概念模型也称信息模型,数据模型包括网状模型、层次模型、关系模型。 2.1    数据模型的要素 2.1.1   数据结构 2.1.2   数据操作 2.1.3   数据的约束条件

28 2.2    概念模型——E-R Data Model

29 2.2.1   Concepts E-R数据模型(Entity-Relationship Data Model) EER数据模型(Extended Entity-Relationship Data Model) 1.实体(entity)、实体集(entity set) entity set与entity是型(type)与值(value)的关系(类似于前述data schema与database instance) 2.属性(attribute) 值集(value set) 实体键(entity key)实体主键(entity primary key)

30 3.  联系(relationship) 基数比约束(cardinality ratio constraint) 参与约束(participation constraint):部分参与、全参与 结构约束(structural constraint) 两个实体之间的联系可以分为三类: l       一对一联系(1:1) l       一对多联系(1:m) l       多对多联系(m:n) 所有(ownership)关系——弱实体(weak entity)

31 2.2.2   E-R diagram 用E-R数据模型对某一单位进行模拟,可以得到ER数据模式,ER数据模式可以ER图来直观地表示。 entity:  weak entity: relationship: attribute: 示例:

32 教职工 研究生 班级 职工编号 姓名 出生年月 职称 是否博导 是否硕导 学号 学位类型 是否在职 课程 课程号 名称 开课学期 学时 上课地点 学分 班级号 信箱

33 教职工 班级 研究生 课程 班主任 C_G 导师 任课 可担任 选课 M N 1 时间 类型 性质 成绩 专业 方向 说明:

34 1.学位类型:硕士/博士 2.导师类型:主要指导老师、协助指导 3.研究生可能换导师,换专业、方向 4.选课性质:学位课/非学位课 5.任课类型:主讲/辅讲 6.可担任描述有哪些老师可以上哪些课 7.任课是指目前该课程的任课老师 8.开课学期:春/秋季 9.上课地点:目前该课程的上课教室

35 问题: 1.课性质属性为什么不属于课程实体,而属于选课联系? 2.专业、方向可不可以属于研究生? 2.2.3   EER data model 1.特殊化(specialization)和普遍化(generalization) 全特殊化(total specialization)/部分特殊化(partial specialization) 不相交特殊化(disjoint specialization)/重叠特殊化(overlapping specialization)

36 2. 聚集(aggregation) 3. 范畴(category)

37 2.3    Hierarchy Data Model 2.3.1   层次数据模型的数据结构 1.层次模型的基本结构 图 TS数据模式

38 图 TS数据模式的一个值

39 2.多对多联系在层次模型中的表示 2.3.2   层次数据模型的操纵与完整性约束 2.3.3   层次数据模型的存储结构 2.3.4   层次数据模型的优缺点 层次数据模型的优点主要有: l 层次数据模型本身比较简单,只需很少几条命令就能操纵数据库,比较容易使用。 l 对于实体间联系是固定的,且预先定义好的应用系统,采用层次模型来实现,其性能优于关系模型,不次于网状模型。 l 层次数据模型提供了良好的完整性支持。

40 层次数据模型的缺点主要有: l 现实世界中很多联系是非层次性的,如多对多联系、一个结点具有多个双亲等,层次模型表示这类联系的方法很笨拙,只能通过引入冗余数据(易产生不一致性)或创建非自然的数据组织(引入虚拟结点)来解决。 l  对插入和删除操作的限制比较多。 l  查询子女结点必须通过双亲结点。 l  由于结构严密,层次命令趋于程序化。 2.4    网状数据模型 2.4.1   网状数据模型的数据结构

41 2.4.2   网状数据模型的操纵与完整性约束 2.4.3   网状数据模型的存储结构 2.4.4   网状数据模型的优缺点

42 网状数据模型的优点主要有: l 能够更为直接地描述现实世界,如一个结点可以有多个双亲、允许结点之间为多对多的联系等。 l  具有良好的性能,存取效率较高。 网状数据模型的缺点主要有: l  其DDL语言极其复杂。 l 数据独立性较差。由于实体问的联系本质上是通过存取路径指示的,因此应用程序在访问数据时要指定存取路径。

43 2.5    Relation Data Model 2.5.1   Concepts 1. Attribute and Domain Domain: 第一范式1NF(first nomal form) atomic data 非第一范式(Non-First Nomal Form)NF2 空值:NULL 2.       relation and tuple 设有一命名为R的关系,它有属性A1、A2、…、An,其对应的城分别为Dl、D2、…、Dn则关系R可表示为:

44 R=(D1/Al,D2/A2,…,Dn/An)
或 R=(A1,A2,…,An) 或 R=(A1A2…An) R.A1表示关系R的属性A1。 degree(arity):n R的值:r r(R) r={t1,t2,…,tm} t=<v1,v2,…,vn>, vi∈Di,1≤i≤n 笛卡尔乘积×

45 A B A×B D E F G 1 2 5 6 3 4 7 8 × 9 =

46 SUDENT(姓名,学号,性别,出生年份.籍贯,系别,入学年份)
关系模式: SUDENT(姓名,学号,性别,出生年份.籍贯,系别,入学年份) <李彤, ,女,1975,江苏,计算机系,1993> 投影:R[X] t[X] STUDENT[姓名,性别] 3.       key 定义:如果关系的某一属性或属性组的值唯一地决定其他所有属性的值,也就是唯一地决定一个元组,而其任何真子集无此性质,则这个属性或属性组称为该关系的候选键(candidate key),或简称为键。 superkey primary key alternate key all key (SUPPLY(供应商,零件名,工程名))

47 prime attribute non-prime attribute
foreign key COURSE(课程名,课程号,学分,开课时间,先修课程号) GRADE(学号,课程号,成绩) 2.5.2   Constraint R=(D1/Al,D2/A2,…,Dn/An) 1.       Domain integrity constraint 2.       Entity integrity constraint 3.       Referential integrity constraint 4.       General integrity constraint

48 2.5.3   Operation relational algebra operations 1.       Select operation σ<选择条件>(<关系名>)

49 Π<属性表>(<关系名>) Π性别,籍贯、出生年份(STUDENT)
2.       Project operation Π<属性表>(<关系名>) Π性别,籍贯、出生年份(STUDENT) 若<属性表2>包含<属性表1>则: Π<属性表1>(Π<属性表2>(R))=Π<属性表1>(R)

50 R <连接条件>S=σ<连接条件>(R×S)
Π姓名(σ性别=‘女’(STUDENT)) 3.       Set operation A∩B≡A-(A-B) union compatibility Π课程号(COURSE)-Π先修课程号(COURSE) σ系别=‘计算机系’(STUDENT)∪σ系别=‘电子系’(STUDENT) R×S={<t,g>|t∈R AND g∈S} 4       Join operation R <连接条件>S=σ<连接条件>(R×S) 连接条件:<条件1>AND<条件2>AND……AND <条件k> θ连接:AiθBj

51 GRADE GRADE.课程号=COURSE.课程号(Π课程名,课程号,学分(COURSE))
等连接(equijoin) 自然连接(natural join) 例: GRADE GRADE.课程号=COURSE.课程号(Π课程名,课程号,学分(COURSE)) 关系代数操作集{σ,Π,∪,-,×}是完备的操作集。 {σ,Π,∪,-, } relationally complete 5.       Outer join operation 6.       Outer union operation

52 2.5.4   Relational Calculus 1.       Tuple Relational Calculus 2.       Domain Relational Calculus

53 第三章   Database Language SQL
结构化查询语言(structured query language,简称SQL) 3.1  Introduction SQL语言是1974年由Boyce和Chamberlin提出的。 1975年至1979年IBM System R实现了这种语言。 1986年10月 美国国家标准局(简称ANSI) SQL-86 1987年国际标准化组织(简称ISO)也通过了这一标准。 ANSI 1989年第二次公布SQL标准(SQL-89) 1992年 SQL-92标准

54 目前ANSI正在酝酿新的SQL标准:SQL3。
现在SQL已被重新解释成为:Standard Query Language SQL按其功能可分为四大部分: 1. 数据定义语言(Data Definition Language,简称DDL) 2.  查询语言(Query Language,简称QL) 3.  数据操纵语言(Data Manipulation Language,简称DML) 4. 数据控制语言(Data Control Language,简称DCL)

55 3.1.1  SQL的特点 1.  综合统一 2.  高度非过程化 3.  面向集合的操作方式 4.  以同一种语法结构提供两种使用方式 5.  语言简洁,易学易用 表3-1 SQL语言的动词

56 3.1.2    SQL语言的基本概念

57 3.2  数据定义 表3-2 SQL的数据定义语句 3.2.1   定义、删除与修改基表 1.  定义基表

58 CREATE TABLE <表名> (<列名><数据类型>[列级完整件约束条件][,<列名><数据类型>[列级完整性约束条件]……]
[<表级完整性约束条件>]); 列级完整性约束条件格式: [NOT NULL [UNIQUE]] [DEFAULT 字值|USER|NULL] 表级完整性约束条件有三个任选项。用于定义主键的PRIMARY KEY子句,用于定义外键的FOREIGN KEY子句和用于定义列值限制条件的CHECK子句。格式:

59 [,PRIMARY KEY (<列名>…)]
[,FOREIGN KEY [外键名] (<列名>…)REFERENCES <表名>[ON DELETE RESTRICT |CASCADE|SET NULL]] [,CHECK (条件)……] IBM DB2 SQL主要支持以下数据类型: SMALLINT 半字长二进制整数。 INTEGER或INT 全字长二进制整数。 DECIMAL(p[,q])或DEC(p[,q]) 压缩十进制数,共p位,其中小数点后有q位。0≤q≤p≤15,q=0时可以省略。 FLOAT 双字长浮点数。 CHARTER(n)或CHAR(n) 长度为n的定长字符串。 VARCHAR(n) 最大长度为n的变长字符串。

60 GRAPHIC(n) 长度为n的定长图形字符串。
VARGRAPHIC(n) 最大长度为n的变长图形字符串。 DATE 日期型,格式为YYYY—MM—DD。 TIME 时间型,格式为HH.MM.SS。 TIMESTAMP 日期加时间。 例1 建立Student(学生)、Course(课程)、SC(选课)表。 1.“学生”表student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄〔Sage〕、所在系(Sdept)5个属性组成,可记为 Student(Sno,Sname,Ssex,Sage,Sdept) 其中sno为主键。

61 2. “课程”表course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)4个属性组成,可记为:
3.“学生选课”表SC由学号(Sno)、课程号(Cno)、成绩(Grade)3个属性组成,其中(Sno,Cno)为主键。 CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname VARCHAR(20) NOT NULL, Ssex CHAR(1), Sage INT, Sdept CHAR(15), PRIMARY KEY(Sno));

62 CREATE TABLE Course (Cno CHAR(1) NOT NULL, Cname VARCHAR(20), Cpno CHAR(1) Ccredit DEC(2,1), PRIMARY KEY(Cno), FOREIGN KEY (Cpno) REFERENCES Course ON DELETE RESTRICT);

63 CREATE TABLE SC (Sno CHAR(5) NOT NULL, Cno CHAR(1) NOT NULL, Grade DEC(4,1) DEFAULT NULL, PRIMARY KEY(Sno,Cno), FOREIGN KEY (Sno) REFERENCES Student ON DELETE CASCADE, FOREIGN KEY (Cno) REFERENCES Course ON DELETE RESTRICT);

64 2.   修改基表 ALTER TABLE<表名> [ADD<新列名><数据类型>[完整性约束]] [DROP<完整性约束名>] [MODIFY<列名><数据类型>]; 例2 向student表增加“入学时间”列,其数据类型为日期型。 ALTER TABLE Student ADD Scome DATE; 例3 将年龄的数据类型改为半字长整数。 ALTER TABLE Student MODIFY Sage SMALLINT; 例4 删除(撤消)Student表主键定义。 ALTER TABLE Student DROP PRIMARY KEY;

65 3.   删除基表 DROP TABLE <表名>; 例5删除Student表。 DROP TABLE Student; 3.2.2   建立与删除索引 1.  建立索引 CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名> [次序] [,<列名> [次序]]…); 排列次序,包括ASC(升序)和DESC(降序)两种,缺省值为ASC。 CREATE CLUSTER INDEX Stusname ON Student(Sname);

66 例6 为学生—课程数据库中的Student,Course,SC 3个表建立索引。其中Student表按学号升序建立唯一索引,course表按课程号升序建立唯一索引,SC表按学号升序和课程号降序建唯一索引。 CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); 2.    删除索引 DROP INDEX<索引名>; 例7 删除Student表的Stusname索引。 DROP INDEX Stusname;

67 3.3  查询 SELECT [ALL| DISTINCT] <目标列表达式>[,<目标列表达式>]… FROM <表名或视图名>[,<表名或视图名>]… [WHERE<条件表达式>] [GROUP BY<列名1>[HAVING<条件表达式>]] [ORDER BY<列名2>[ASC | DESC]];

68 3.3.1   单表查询 1.    选择表中的若干列 1)     查询指定列 例1 查询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student; 例2 查询全体学生的姓名、学号、所在系。 SELECT Sname,Sno,Sdept FROM Student; 2)     查询全部列 例3 查询全体学生的详细记录 SELECT *

69 3)     查询经过计算的值 例4 查询全体学生的姓名及其出生年份。 SELECT Sname,2004-Sage FROM Student; 例5 查询全体学生的姓名、出生年份和所在系,要求用小写字母表示所在系名 SELECT Sname,‘Year of Birth:’,2004-Sage,ISLOWER(Sdept) FROM Student; SELECT Sname NAME,‘Year of Birth:’ BIRTH,2004-Sagc BIRTHDAY, ISLOWER(Sdept) DEPARTMENT

70 结果为: NAME BIRTH BIRTHDAY DEPARTMENT 李勇 Year of Birth: cs 刘晨 Year of Birth: if 王名 Year of Birth: ma 张立 Year of Birth: if 2.  选择表中的若干元组 1)  消除取值重复的行 例6 查询所有选修过课的学生的学号。 SELECT Sno FROM SC;

71 假设SC表中有下列数据: Sno Cno Grade 执行上面的SELECT语句后,结果为: Sno 95001 95002

72 SELECT DISTINCT Sno FROM SC; 执行结果为: Sno 95001 95002 SELECT Sno SELECT ALL Sno 完全等价。

73 2)   查询满足条件的元组 表3-5 常用的查询条件 ①比较大小 = 等于 > 大于 < 小于

74 >= 大于等于 <= 小于等于 !=或<> 不等于 有些产品中还包括: !> 不大于 !< 不小于 逻辑运算符NOT可与比较运算符同用,对条件求非。 例7 查计算机系全体学生的名单。 SELECT Sname FROM Student WHERE Sdept=‘CS’;

75 例8 查所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage FROM student WHERE Sage<20; WHERE NOT Sage>=20; 例9 查考试成绩有不及格的学生的学号。 SELECT DISTINCT Sno FROM SC WHERE Grade<60;

76 ②确定范围 谓词BETWEEN...AND...和NOT BETWEEN...AND...可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。 例10 查询年龄在20至23岁之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 与BETWEEN...AND...相对的谓词是NOT BETWEEN...AND...。

77 例11 查询年龄不在20至23岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23; ③确定集合 谓词IN可以用来查找属性值属于指定集合的元组。 例12 查信息系(IS)、数学系(MA)和计算机科学系(CS)的学生的姓名和性别。 SELECT Sname.Ssex WHERE Sdept IN(‘IS’,‘MA’,‘CS’); 与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。

78 例13 查既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname.Ssex FROM Student WHERE Sdept NOT IN(‘IS’,‘MA’,‘CS’); ④字符匹配 谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下: [NOT] LIKE ‘<匹配串>’ 其含义是查找指定的属性列值与<匹配串>相匹配的元组,<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。其中: %(百分号) 代表任意长度(长度可以为0)的字符串。

79 例如a%b表示以a开头,以b结尾的任意长度的字符串,acb,adefb,ab等都满足该匹配串。
_(下划线) 代表任意单个宁符。例如a_b表示以a开头,以b结尾,长度为3的字符串,acb,adb等都满足该匹配串。 例14 查询学号为95001的学生的详细情况 SELECT * FROM Student WHERE Sno LIKE ‘9500l’; 该语句实际上与下面的语句完全等价: WHERE Sno=‘9500l’;

80 例15 查所有姓刘的学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE ‘刘%’; 例16 查姓“欧阳”且全名为3个汉字的学生的姓名。 SELECT Sname WHERE Sname LIKE ‘欧阳__’; 例17 查名字中第二字为“阳”字的学生的姓名和学号。 SELECT Sname,Sno WHERE Sname LIKE ’__阳%’;

81 例18查所有不姓刘的学生姓名。 SELECT Snamc,Sno,Ssex FROM Student WHERE Sname NOT LIKE ‘刘%’; ⑤涉及空值的查询 谓词IS NULL和IS NOT NULL可用来查询空值和非空值。 例19 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,下面来查一下缺少成绩的学生的学号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;

82 例20 查所有有成绩的记录的学生学号和课程号。
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL; ⑥多重条件查询 例21 查CS系年龄在20岁以下的学生姓名 SELECT Sname FROM Student WHERE Sdept=‘CS’AND Sage<20; 例12中的IN谓词实际上是多个OR运算符的缩写,因此,例l2中的查询也可以用OR运算符写成如下等价形式:

83 SELECT Sname.Ssex FROM Student WHERE Sdept=‘IS’OR Sdept=‘MA’OR Sdept=‘CS’; 3.  对查询结果排序 例22 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。 SELECT Sno,Grade FROM SC WHERE Cno=‘3’ ORDER BY Grade DESC; 例23 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。

84 SELECT * FROM Student ORDER BY Sdept, Sage DESC; 4. 使用集函数 COUNT([DISTINCT | ALL ] *) 统计元组个数 COUNT([DISTINCT | ALL]<列名>) 统计一列中值的个数 SUM([DISTINCT | ALL] <列名>) 计算一列值的总和(此列必须是数值型) AVG([DISTINCT | ALL] <列名>) 计算一列值的平均值(此列必须是数值型) MAX([DISTINCT | ALL] <列名>) 求一列值中的最大值 MIN([DISTINCT | ALL] <列名>) 求一列值中的最小值

85 例24 查询学生总人数。 SELECT COUNT(*) FROM Student; 例25 查询选修了课程的学生人数。 SELECT COUNT(DISTINCT Sno) FROM SC; 例26 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno=‘l’; 例27 查询学习l号课程的学生最高分数。 SELECT MAX(Grade) WHERE Cno=‘1’;

86 5.  对查询结果分组 例28 查询各个课程号与相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 例29 查询信息系选修了3门以上课程的学生的学号,为简单起见,假设SC表中有一列Dept,它记录了学生所在系。 SELECT Sno WHERE Dept=‘IS’ GROUP BY Sno HAVING COUNT(*)>3;

87 3.3.2   连接查询 1.  等值与非等值连接查询 [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2> 其中比较运算符主要有:=、>、<、>=、<=、!=。 此外,连接谓词还可以使用下面形式: [<表名1>.]<列名1>BETWEEN[<表名2.]<列名2>AND[<表名2>.]<列名3> 当连接运算符为=时,称为等值连接。使用其它运算符称为非等值连接。

88 例30 查询每个学生及其选修课程的情况。 SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno; 例31 Student表和SC表的笛卡尔积。 例32 自然连接Student表和SC表。 SELECT Student.Sno,Sname, Ssex, Sage, Sdept, Cno, Grade

89 SELECT Student.*,Cno, Grade FROM Student,SC WHERE Student.Sno=SC.Sno; 2.   自身连接 例33 查询每一门课的间接先修课(即先修课的先修课)。

90 SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND WHERE FIRST.Cpno=SECOND.Cno;  Cno Cpno 3.   外连接 例34 SELECT Student.Sno,Sname, Ssex, Sage, Sdept, Cno, Grade FROM Student,SC WHERE Student.Sno=SC.Sno(*);

91 Student.Sno,Sname, Ssex, Sage, Sdept, Cno, Grade
9500l 李勇 男 CS 9500l 李勇 男 CS 9500l 李勇 男 CS 刘晨 女 IS 刘晨 女 IS 王名 女 MA 张立 男 IS 4.   复合条件连接 例35 查询选修2号课程且成绩在90分以上的所有学生。 SELECT Student.Sno,Sname FROM Student, SC WHERE Student .Sno=SC.Sno AND SC.Cno=’2’AND SC.Grade>90;

92 结果表为; Student.Sno Sname 刘晨 例36 查询每个学生选修的课程名及其成绩。 SELECT Student.Sno,Sname,Cname, Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno and SC.Cno=COURSE.Cno;

93 3.3.3   嵌套查询 SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno=‘2’); 1.  带有IN谓词的子查询 例37 查询与“刘晨”在同一个系学习的学生。 查询与“刘晨”在同一个系学习的学生,可以首先确定“刘晨”所在系名,然后再查找所有在该系学习的学生。所以可以分步来完成此查询:

94 ①确定“刘晨”所在系名 SELECT Sdept FROM Student WHERE Sname=‘刘晨’; 结果为:IS ②查找所有在IS系学习的学生。 SELECT Sno,Sname,Sdept WHERE Sdept=‘IS’; 分步写查询毕竟比较麻烦,上述查询实际上可以用子查询来实现,即将第一步查询嵌入到第二步查询中,用以构造第二步查询的条件。SQL语句如下:

95 SELECT Sno,Sname,Sdept
FROM Student WHERE Sdept IN (SELECT Sdept WHERE Sname=‘刘晨’); 本例中的查询也可以用前面学过的表的自身连接查询来完成: SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=‘刘晨’;

96 本例中父查询和子查询均引用了Student表.也可以像表的自身连接查询那样用别名将父查询中的Student表与子查询中的Student表区分开:
SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1 WHERE S1.Sdept IN (SELECT S2.Sdept FROM Student S2 WHERE S2.Sname=’刘晨’); 例38 查询选修了课程名为信息系统的学生学号和姓名。 完成此查询的基本思路是:

97 ①首先在Course关系中找出‘信息系统’课程的课程号Cno。
②然后在SC关系中找出Cno等于第一步给出的Cno集合中某个元素的Sno。 ③最后在Student关系中选出Sno等于第二步中求出Sno集合中某个元素的元组。取出Sno和Sname送入结果表列。 将上述想法写成SQL语句就是: SELECT Sno,Sname FROM Student WHERE Sno IN

98 (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cname=’信息系统’)); DBMS按照由内向外的原则求解此SQL语句,首先处理最内层查询块,即课程名‘信息系统’的课程号: SELECT Cno WHERE Cname=‘信息系统’ 查询结果为3。从而可以把上面的SQL语句简化为:

99 SELECT Sno,Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (‘3’)); 对此SQL语句再处理内层查询, SELECT Sno WHERE Cno IN (‘3’) 结果为95001和95002。从而可以把上面的SQL语句进一步简化为: WHERE Sno IN(‘95001’,‘95002’);

100 这样就可以求得最终结果。 本查询同样可以用连接查询实现: SELECT Student.Sno,Sname FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname=’信息系统’; 2.   带有比较运算符的子查询 带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单值时,可以用>、<、=、>=、<=、!=或<>等比较运算符。

101 例如,在例37中,由于一个学生只可能在一个系学习,也就是说内查询刘晨所在系的结果是一个唯一值,因此该查询也可以用比较运算符来实现,其SQL语句如下;
SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1 WHERE S1.Sdept = (SELECT S2.Sdept FROM Student S2 WHERE S2.Sname=’刘晨’); 需要注意的是,子查询一定要跟在比较符之后。下列写法是错误的:

102 SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1 WHERE (SELECT S2.Sdept FROM Student S2 WHERE S2.Sname=’刘晨’)=S1.Sdept; 例38中信息系统的课程号是唯一的,但选修该课程的学生并不止一个,所以例38也可以用=运算符和IN谓词共同完成:

103 SELECT Sno,Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno= (SELECT Cno FROM Course WHERE Cname=’信息系统’));

104 3.  带有ANY或ALL谓词的子查询 >ANY 大于子查询结果中的某个值 <ANY 小于子查询结果中的某个值 >=ANY 大于等于子查询结果中的某个值 <=ANY 小于等于子查询结果中的某个值 =ANY 等于子查询结果中的某个值 !=ANY或<>ANY 不等于子查询结果中的某个值 >ALL 大于子查询结果中的所有值 <ALL 小于子查询结果中的所有值 >=ALL 大于等于子查询结果中的所有值 <=ALL 小于等于子查询结果中的所有值

105 =ALL 等于子查询结果中的所有值(通常没有实际意义)
!=ALL或<>ALL 不等于子查询结果中的任何一个值 例39 查询其他系中比IS系某一学生年龄小的学生名单。 SELECT S1.Sname,S1.Sage FROM Student S1 WHERE S1.Sage<ANY (SELECT S2.Sage FROM Student S2 WHERE S2.Sdept=’IS’) AND S1.Sdept<>’IS‘ ORDER BY S1.Sage DESC;

106 注意,S1.Sdept<>‘IS’条件是父查询块中的条件,不是子查询块中的条件。
用集函数实现: SELECT S1.Sname,S1.Sage FROM Student S1 WHERE S1.Sage< (SELECT MAX(S2.Sage) FROM Student WHERE S2.Sdept=’IS’) AND S1.Sdept<>‘IS’ ORDER BY Sage DESC; 例40 查询其他系中比IS系所有学生年龄都小的学生名单。

107 SELECT S1.Sname,S1.Sage FROM Student S1 WHERE S1.Sage<ALL (SELECT S2.Sage FROM Student S2 WHERE S2.Sdept=’IS’) AND S1.Sdept<>’IS“ ORDER BY S1.Sage DESC; 本查询同样也可以用集函数实现。即首先用子查询找出‘IS’系的最小年龄(18),然后在父查询中查所有非‘IS’系且年龄小于18岁的学生姓名及其年龄。SQL语句如下:

108 SELECT S1.Sname,S1.Sage FROM Student S1 WHERE S1.Sage< (SELECT MIN(S2.Sage) FROM Student S2 WHERE S2.Sdept=’IS’) AND S1.Sdept<>’IS’ ORDER BY S1.Sage DESC; 事实上,用集函数实现子查询通常比直接用ANY或ALL查询效率要高。 4.   带有EXISTS谓词的子查询 EXISTS代表存在量词。带有EXISTS谓词的子查询不退回任何实际数据,它只产生逻辑真值“TRUE”或逻辑假值“FALSE”。

109 例41 查询所有选修了1号课程的学生姓名。 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE SC.Sno=Student. Sno AND Cno=‘1’); 例41 查询所有未修1号课程的学生姓名。 WHERE NOT EXISTS

110 带有IN谓词的例37可以用如下带EXISTS谓词的子查询替换:
查询与“刘晨”在同一个系学习的学生。 SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1 WHERE EXISTS (SELECT * FROM Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=’刘晨’); 例42 查询选修了全部课程的学生姓名。

111 SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course FROM SC WHERE SC.Sno=Student.Sno AND SC.Cno=Course.Cno)); 例43 查询至少选修了学生95002选修的全部课程的学生号码。

112 本题的查询要求可以做如下解释,查询这样的学生,凡是95002选修的课,他都选修了。换句话说,若有一个学号为x的学生,对所有的课程y,只要学号为95002的学生选修了课程y,则x也选修了y;那么就将他的学号选出来。 即不存在这样的课程y,学生95002选修了y,而学生x没有选。用SQL语言可表示如下:

113 SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY.Sno=’95002’ AND NOT EXISTS FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));

114 3.3.4   集合查询 集合操作主要包括并操作UNION、交操作INTERSECT和差操作MINUS。 例44 查询计算机科学系的学生及年龄不大于19岁的学生。 SELECT * FROM Student WHERE Sdept=’CS’ UNION WHERE Sage<=19; 本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。

115 例45 查询选修了课程1或者选修了课程2的学生。 本例实际上是查选修课程1的学生集合与选修课程2的学生集合的并集。 SELECT Sno FROM SC WHERE Cno=’1’ UNION WHERE Cno=’2’; 注:标准SQL只有并,没有交和差,但实际上,交或差都可以用其它方法实现,具体实现根据不同的查询而不同(用语义替换)。

116 例46 查询计算机科学系的学生与年龄不大于19岁的学生的交集。
本查询换种说法就是,查询计算机科学系中年龄不大于19岁的学生。 例47 查询选修课程l的学生集合与选修课程2的学生集合的交集 本例实际上是查询既选修了课程1又选修了课程2的学生。 例48 查询计算机科学系的学生与年龄不大于19岁的学生的差集。 本查询换种说法就是,查询计算机科学系中年龄大于19岁的学生。

117 例49 查询选修课程1的学生集合与选修课程2的学生集合的差集
本例实际上是查询选修了课程1但没有选修课程2的学生。 3.3.5   小结 问题:有关系模式part(Item_no,Name,P_no)表示一个产品零部件情况及产品的组成(P_no表示上一级的零件),如何用SQL实现查询:查询某个产品(给定Item_no)的所有零部件?。 3.4  数据更新 3.4.1   插入数据

118 1.   插入单个元组 INSERT INTO <表名>[(<属性列1>[,<属性列2>…)] VALUES (<常量1>[,<常量2>…]) 例1 将一个新学生记录(学号:95020;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入Student表中。 INSERT INTO Student VALUES(’95020’,‘陈冬’,‘男’,‘IS’,18); 例2 插入一条选课记录(’95020’,’1’) INSERT INTO SC(Sno,Cno) VALUES(“95020’,’1’);

119 2.   插入子查询结果 INSERT INTO<表名>[(<属性列1>[,<属性列2>…]] 子查询; 例3 对每一个系,求学生的平均年龄,并把结果存入数据库。 对于这道题,首先要在数据库中建立一个有两个属性列的新表,其中一列存放系名,一列存放相应系的学生平均年龄。 CREATE TABLE Deptage (Sdept CHAR(15),Avgage SMALLINT); 然后对数据库的student表按系分组求平均年龄,再把系名和平均年龄存入到新表中。

120 INSERT INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept; 3.4.2   修改数据 UPDATE <表名> SET<列名>=<表达式>[,<列名>=<表达式>…] [WHERE <条件>]; 1.   修改某一个元组的值 例4 将学生95001的年龄改为22岁 UPDATE Student SET Sage=22 WHERE Sno=‘95001’;

121 2.   修改多个元组的值 例5 将所有学生的年龄增加1岁。 UPDATE Student SET Sage=Sage+1; 3.    带子查询的修改语句 例6 将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE ‘CS’= (SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno);

122 UPDATE SC SET Grade=0 WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept=‘CS’); 4.   修改操作与数据库的一致性 第一条UPDATE语句修改Student表: UPDATE Student SET Sno=’96089’ WHERE Sno=’95007’; 第二条UPDATE语句修改SC表:

123 UPDATE SC SET Sno=‘96089’ WHERE Sno=’95007’; 问题:SC表中要修改的Sno是引用Student的外键,第一条UPDATE执行后,显然已破坏该参照完整性。这样的过程能正常执行吗? 3.4.3   删除数据 DELETE FROM<表名> [WHERE<条件>]; 1.    删除某一个元组的值 例7 删除学号为95019的学生记录。 DELETE FROM Student WHERE Sno=‘95019’;

124 1.       删除多个元组的值 例8 删除所有的学生选课记录。 DELETE FROM SC; 2.       带子查询的删除语句 例9 删除计算机科学系所有学生的选课记录。 DELETE FROM SC WHERE ‘CS’= (SELECT Sdept FROM Student WHERE Student.Sno=SC.Sno); 3.5  视图 3.5.1   定义视图 1. 建立视图

125 CREATE VIEW<视图名>[(<列名>[,<列名>]…)]
AS<子查询> 如果CREATE VIEW语句仅指定了视图名,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况下必须明确指定组成视图的所有列名: l  其中某个目标列不是单纯的属性名,而是集函数或列表达式。 l   多表连接时选出了几个同名列作为视图的字段。 l   需要在视图中为某个列启用新的更合适的名字。

126 例1 建立信息系学生的视图 CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept=‘IS’; 本例中省略了视图IS_Student的列名,隐含了该视图由子查询中SELECT子句中的3个目标列名组成。DBMS执行此语句就相当于建立虚表: IS_Student (Sno,Sname,Sage) 2.       删除视图 DROP VIEW<视图名>; 例2 删除视图IS_Student。 DROP VIEW IS_Student;

127 3.5.2   查询视图 对视图的查询转换为对基表的查询的过程称为视图的消解(view resolution)。 例3 在信息系学生的视图中找出年龄小于20岁的学生。 SELECT Sno,Sage FROM IS_Student WHERE Sage<20; DBMS执行此查询时,将其与IS_Student视图定义中的子查询 SELECT Sno,Sname,Sage FROM Student WHERE Sdept=‘IS’; 结合起来,转换成对基表student的查询:

128 SELECT Sno,Sage FROM Student WHERE Sdept=‘IS’ AND Sage<20; 3.5.3   更新视图 更新视图包括插入(INSERT)、删除(DELETE)和修改(UPDATE)三类操作。 例如,如定义的视图S_G是由‘学号’和‘平均成绩’两个属性列组成的,其中平均成绩一项是由SC表中多个元组分组后计算平均值得来的。如果想把视图S_G中学号为95001的学生的平均成绩改成90分,SQL语句如下: UPDATE S_G SET Grade=90 WHERE Sno=’95001’;

129 但这个对视图的更新是无法转换成对基表SC的更新的,因为系统无法修改各科成绩,以便平均成绩成为90。所以S_G视图是不可更新的。
l 由一个基表定义的视图,只有含有基表的主键或候补键,并且视图中没有用表达式或函数定义的属性,才允许更新; l  由多表连接所定义的视图不允许更新; l  定义中用到GROUP BY子句或集函数的视图不允许更新。 3.5.4   视图的用途 1.  视图能够简化用户的操作 2.  视图使用户能以多种角度看待同一数据 3.  视图对重构数据库提供了一定程度的逻辑独立性

130 例如,将学生关系 Student(Sno,Sname,Ssex,Sage,Sdept)分为 SX(Sno,Sname,Ssex) 和 SY(Sno,Sage,Sdept) 两个关系,这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student: CREATE VIEW Student (Sno, Sname, Ssex, Sage, Sdept) AS SELECT SX.Sno,Sname,Ssex,Sage,Sdept FROM SX,SY WHERE SX.Sno=SY.Sno; 4.   视图能够对机密数据提供安全保护

131 3.6  嵌入式SQL介绍 嵌入式SQL(embedded SQL) 嵌入式SQL必须解决下列四个问题: (1)宿主语言编译器不可能识别和接受SQL语言,如何将嵌有SQL的宿主语言编译成可执行码,这是首先要解决的问题; (2)宿主语言和DBMS之间如何传递数据和信息; (3)数据库的查询结果一般是元组的集合,而宿主语言使用变量(单值),这些元组须逐个地赋值给程序中的变量,供宿主语言处理,其间存在一个转换问题;

132 (4)两者的数据类型有时不完全对应或等价,须解决必要的数据类型转换问题。要进行何种数据类型转换,与宿主语言和DBMS有关。
如ORACLE的PRO接口:PRO*C、PRO*PASCAL等。

133 第四章   数据库系统结构 4.1  数据库系统的模式结构 type value 4.1.1   数据库系统的三级模式结构 1.  模式 2.  外模式 3.  内模式

134 图4-1 数据库系统的模式结构

135 4.1.2   数据库的二级映象功能与数据独立性 两层映象:外模式/模式映象和模式/内模式映象 4.1.3   Conclusion 4.2  数据库系统的体系结构 从最终用户角度来看,数据库系统分为单用户结构、主从式结构、分布式结构和客户/服务器结构等。 4.2.1 单用户数据库系统 图4-2 单用户数据库系统

136 4.2.2   主从式结构的数据库系统 图4-3 主从式数据库系统 特点:数据集中、处理集中。

137 4.2.3  分布式结构的数据库系统 图4-4 分布式数据库系统 特点:数据分布、处理分布。

138 4.2.4  Client/Server结构的数据库系统
特点:数据集中、处理分布 。

139 特点:数据分布、处理分布 。

140 4.2.5   联邦分布式数据库系统 每个结点所看到的数据模式仅仅限于该结点所用到的数据。它—般由两部分组成:一是本结点的数据模式,二是供本结点共享的其他的点上有关的数据模式。 结点间的数据共享由双边协商确定。 特点:数据分布、处理分布。 目前大型主流DBMS(如ORACLE、SQL Server等)商品化产品均为支持分布的Client/Server结构。

141 4.3  Database Management System
4.3.1   DBMS的功能和组成 1.       数据定义 2.       数据操纵 3.       数据库运行管理 4.       数据组织、存储和管理 5.       数据库的建立和维护 6.       数据通信接口

142 为了提供上述6方面的功能,DBMS通常由以下4部分组成。
1.       数据定义语言及其翻译处理程序 2.       数据操纵语言及其编译(或解释)程序 3.       数据库运行控制程序 4.       实用程序 4.3.2   数据库管理系统的工作过程

143

144 应用程序(或用户)从数据库中读取一个数据通常需要以下步骤:
1.       应用程序A向DBMS发出从数据库中读数据记录的命令; 2.       DBMS对该命令进行语法检查、语义检查,并调用应用程序A对应的外模式,检查A的存取权限,决定是否执行该命令。如果拒绝执行,则向用户返回错误信息; 3.       在决定执行该命令后,DBMS调用模式,依据外模式/模式映象的定义,确定应读入模式中的哪些记录;

145 4.       DBMS调用内模式,依据模式/内模式映象的定义,决定应从哪个文件、用什么存取方式、读入哪个或哪些物理记录;
6.       操作系统执行读数据的有关操作; 7.       操作系统将数据从数据库的存储区送至系统缓冲区; 8.       DBMS依据外模式/模式映象的定义,导出应用程序A所要读取的记录格式;

146 1.       DBMS将数据记录从系统缓冲区传送到应用程序A的用户工作区;

147 图4-8 关系DBMS的层次结构

148 4.3.3   TRANSACTION 1. Atomic Nothing Or All 2. Consistency 3. Isolation 4. Durability 例1 将款项S从A帐号拨给B帐号。 BEGIN TRAN /*事务开始*/ Read A /*读A帐号*/ A=A-S /*从A帐号中减去款项S*/ If A<0 then /*A款不足*/

149 Begin Display “A款不足” ROLLBACK /*卷回事务,即返回到该事务执行之前的状态*/ End Else B=B+S /*为B帐号加上款项S*/ Display “拨款完成” COMMIT /*事务提交,持久化*/

150 出口:ROLLBACK——Nothing COMMIT——All 4.3.4 数据库管理系统的实现方法 1. N方案
4.3.4   数据库管理系统的实现方法 1. N方案 如FOXPRO、MS ACCESS等桌面(DESKTOP)DBMS。

151 2. 2N方案 3. M+N方案 4. N+1方案 l        Nonblocking I/O and asynchronous I/O l        Fair Schedule

152 4.4  Data Catalog (or directory)

153 数据字典(data dictionary)

154 第五章    数据库的存储结构 5.1  数据库存储介质的特点 l   内存 容量低(一般只有几百M,最多一两个G),价格高,速度快,数据易丢失(掉电、当机等)。 一般做DBMS(或CPU)和DB之间的数据缓冲区。 实时/内存数据库系统中使用内存存放实时数据。 l   硬盘 容量高(一般有几十G,多到一两百G),价格中,速度较快,数据不易丢失(除非物理性损坏)。 一般做用来存放DB。实时/内存数据库系统中使用硬盘存放历史数据库。

155 l   移动硬盘(USB接口) 容量高(一般有几十G),价格中,速度较快,数据不易丢失(除非物理性损坏)。 一般做用来做备份。 l   光盘 容量低(一般650M/片,但光盘可在线更换,海量),价格低,速度中,数据不易丢失(除非物理性损坏)。 l    磁盘(软盘) 容量低(一般有几M,优盘多到一两百M),价格中,速度较慢,数据不易丢失(除非物理性损坏)。 一般数据库不使用磁盘。

156 l    磁带 容量低(但可在线更换,海量),价格低,速度最慢,且要按顺序存取,数据不易丢失(除非物理性损坏)。 一般做用来做备份。 按速度从高到低: 内存、硬盘、USB盘(移动硬盘和优盘)、光盘、软盘、磁带。 按在线容量从大到小: 硬盘、移动硬盘、内存、光盘、磁带、优盘、软盘。 物理块:512byte/1K/2K/4K/8K

157 原因: (1)   减少I/O的次数; (2)   减少间隙的数目,提高硬盘空间的利用率。 ORACLE逻辑块与物理块(init.ora中db_block_size定义逻辑块大小) 缓冲块和缓冲区(即SGA中的Data Buffer Cache) 延迟写(delayed write)技术/预取(Prefetching)技术(ORACLE中由DBWR进程完成数据的读写)

158 5.2    记录的存储结构 5.2.1   记录的物理表示 1. Positional Technique

159 2. Relational Technique
3. Counting Technique

160 5.2.2   记录在物理块上的分配 不跨块组织(unspanned organization) 跨块组织(spanned organization)

161

162 5.2.3   物理块在磁盘上的分配 1. 连续分配法(continuous allocation) 2. 链接分配法(linked allocation) 3. 簇集分配法(Clustered Allocation) 4. 索引分配法(Indexed Allocation) 5.2.4   数据压缩技术 1. 消零或空格符法(null suppression) 2. 串型代替法(pattern substitution)

163 3. 索引法(indexing)

164 5.3    文件结构和存取路径 5.3.1   访问文件的方式 1. 查询文件的全部或相当多的记录 2. 查询某一特定记录 3. 查询某些记录 4. 范围查询 5. 记录的更新 5.3.2   数据库对文件的要求 5.3.3   文件的基本类型 1. 堆文件(heap file) 方便(快):插入 不方便(慢):查找、删除 2. 直接文件(direct file)

165 方便(快):按散列键访问 不方便(慢):其它访问方式 3. 索引文件(indexed file) 方便(快):按索引键访问 不方便(慢):其它访问方式,特别是更新时要进行索引维护。 l    索引项=<索引键,地址> l     primary index and secondary index l     nondense index and dense index

166

167

168 l   预查找功能 设要查询年龄为20岁或2l岁的四年级学生,如果学生文件在年龄和年级属性上建有索引,则可查出年龄为20岁的学生记录的集合S20,年龄为2l岁的学生记录的集合S21,四年级学生记录的集合Ss,于是,所需的学生记录的集合S应为: S=(S20∪S21) ∩Ss l  clustering index

169 l   B tree index 动态平衡多叉(分)树 有B+树、B*树等,数据库管理系统中常用B+树实现索引。 B+树结构:

170

171

172 B+树动态平衡特性: (1)  每个结点最多有2k个键值; (2) 根结点至少有—个键值,其他结点至少有k个键值; (3)  除叶结点(即顺序集结点)无子女外,对于其他结点,若有J个键值,则有J+1个子女; (4)  所有叶结点都处于树的同一级上,即树始终保持平衡。 k值一般根据块的大小确定,使得B+树的结点最大不超过一个块,即一个结点占一个块(block)。

173 优点:所有记录都具有相同的访问I/O次数(即树的高度+记录本身访问的I/O次数),(若k=20,树的高度为11,则至少可表示2010=1024X1010个记录)。
缺点:索引维护需要代价,当记录更新引起索引变化时,最差的情况可能从底层一直影响到根结点,即整个树的变动。

174 第六章    查询处理和优化 6.1   Introduction 1. 代数优化 2. 物理优化 3. 规则优化 4. 代价估算优化

175

176 6.2    代数优化

177

178 例1   设有S(供应商),P(零件),SP(供应关系)三个关系,关系模式如下:
S(SNUM,SNAME,CITY) P(PNUM,PNAME,WEIGHT,SIZE) SP(SNUM,PNUM,DEPT,QUAN) 设有查询Q: SELECT SNAME FROM S,P,SP WHERE S.SNUM=SP.SNUM AND SP.PNUM=P.PNUM AND S.CITY=‘NANJING’ AND P.PNAME=‘BOLT’ AND SP.QUAN>10000;

179

180

181

182

183

184 代数优化的大致过程: 1. 以SELECT子句对应投影操作,以FROM子句对应笛卡儿乘积,以WHERE子句对应选择操作,生成原始查询树。 2. 应用变换原则(2)、(6)、(7)、(9),尽可能将选择条件移向树叶方向。 3. 应用连接、笛卡儿乘积的结合律,按照小关系先做的原则,重新安排连接(笛卡儿乘积)的次序。 4. 如果笛卡儿乘积后还须按连接条件进行选择操作,可将两者组合成连接操作。 5. 对每个叶结点添加必要的投影操作,以消除对查询无用的属性。

185 6.3    依赖于存取路径的规则优化 6.3.1   选择操作的实现和优化 1. 相关因素 l   选择条件 l   可用的存取路径 l   选取的元组数在整个关系中所占的比例有关 2. 实现方法 (1)   对于小关系,不必考虑其他存取路径,直接用顺序扫描。例如对于六个物理块大小的关系,如果顺序搜索,则平均的I/O次数为3,不值得采用其他存取路径。 (2)   如果无索引或散列等存取路径可用,或估计中选的元组数在关系中占有较大的比例(例如大于20%)且有关属性上无族集索引,则用顺序扫描。

186 (3)  对于主键的等值条件,最多只有一个元组可以满足此条件,应优先采用主键上的索引或散列。
(4)   对于非主键的等值条件,要估计中选的元组数在关系中所占的比例。如果比例较小(例如小于20%),可以用无序索引,否则只能用簇集索引或顺序扫描。 (5)   对于范围条件,一般先通过索引找到范围的边界,再通过索引的顺序集沿相应方向按索,例如对于条件Sage>20,可先找到Sage=20的顺序集结点,再沿顺序集向右搜索。若中选的元组数在关系中所占比例较大,且无有关属性的簇集索引,则宜采用顺序扫描。例如对于条件Sage>15,因为大学生绝大部分是大于15岁的。

187 (6)     对于用AND连接的合取选择条件。若有相应的多属性索引,则优先采用多属性索引。否则,可检查诸合取条件中有无多个可用二次索引的,若有,则用预查找法处理。即通过二次索引找出满足各合取条件的tid集合,再求这些tid集合的交集。然后取出交集中tid所对应的元组.并在取这些元组的同时,用合取条件中的其余条件检查。凡能满足所有其余条件的元组,即为所选择的元组。如果上述途径都不可行,但合取条件中有个别条件具有规则(3)、(4)、(5)中所述的存取路径,则可用此存取路径选择满足此条件的元组,再将这些元组用合取条件中的其他条件筛选。若在诸合取的条件中,没有一个具有合适的存取路径.那只有用顺序扫描。

188 (7)   对于用OR连接的析取选择条件,尚无好的优化方法,只能按其中各个条件分别选出一个元组集,再求这些元组集的并。众所周知,并是开销大的操作,而且在OR连接的诸条件中,只要有一个条件无合适的存取路径,就不得不采用顺序扫描来处理这种查询。因此,在查询语句中,应尽量避免采用析取选择条件。 (8)  有些选择操作只要访问索引就可得到结果,例如查询索引属性的最大值、最小值、平均值等。在此情况下,应优先利用索引、避免访问数据。

189 6.3.2   连接操作的实现和优化 1.       嵌套循环(nested loop)法 R  R.A=S.B S 外关系(outer relation) 内关系(inner relation) 2.   利用索引或散列寻找匹配元组法 3.   排序归并(sort-merge)法

190

191 下面是选用连接方法的启发式规则。 (1)   如果两个关系都已按连接属性排序,则优先用排序归并法。如果两个关系中已有一个关系按连接属性排序,另一个关系很小,也可考虑对此未排序的关系按连接属性排序,再用排序归并法连接。 (2)   如果两个关系中有一个关系在连接属性上有索引(特别是簇集索引)或散列,则可令另一关系为外关系,顺序扫描,并利用内关系上的索引或散列寻找其匹配元组,以代替多遍扫描。 (3)   如果应用上述两规则的条件都不具备,且两个关系都比较小,可以应用嵌套循环法。 (4)   如果(1)、(2)、(3)规则都不适用,可用散列连接法。

192 6.3.3   投影操作的实现 6.3.4   集合操作的实现 6.3.5   组合操作

193 第七章   事务管理 恢复 事务管理 并发控制 7.1    恢复引论 fault error failure loss 1.  单纯以后备复本为基础的恢复技术

194

195 2.   以后备复本和运行记录(log或journal)为基础的恢复技术
运行记录包括: (1)  前象(Before Image BI)——undo (2)  后象(After Image AI)——redo (3)  事务状态 commit rollback/abort

196 backward recovery —— undo
forward recovery —— redo 3.   基于多复本的恢复技术 independent failure mode

197 多服务器DBS: 1. 双机热备份 2. 双机CLUSTER 3. 磁盘阵列RAID0~5 4. 等

198 7.2         运行记录的结构 1.   Active Transaction List (ATL) 2.   Committed Transaction List (CTL) 3.   前象文件 4.   后象文件 措施: 1.   不保留已提交事务的前象 2.  有选择地保留后象 3.   合并后象

199 7.3   更新事务的执行与恢复 更新事务在执行时应遵守下列两条规则: 1. 提交规则(commit rule) 2. 先记后写规则(log ahead rule) 方案: 1.  后象在事务提交前完全写入数据库 其步骤如下: (1)     TID→ATL (2)     BI→log /*先记后写规则*/ (3)     AI→DB /*在提交前,后象完全写入DB, 满足提交规则*/ (4)     TID→CTL (5)     从ATL中删除TID

200 2.  后象在事务提交后才写入数据库 其步骤如下: (1)     TID→ATL (2)     AI→log /*提交规则*/ (3)     TID→CTL (4)     AI→DB (5)     从ATL中删除TID

201 3. 后象在事务提交前后写入数据库 其步骤如下: (1)  TID→ATL (2)  AI、BI→log /*提交规则及先记后写规则*/ (3)  AI→DB(部分写入) (4)  TID→CTL (5)  AI→DB(继续完成) (6)  从ATL中删除TID

202

203 7.4  易地更新恢复技术

204 设有数据库DB为: DB={F1,……Fj,……Fn}

205 (1)   取M到内存,并读取M[j]; (2)   按M[j]找到PTj,并取PTj到内存中(为Ti所用的PTj的内存版本表示为PTji,见图7-8); (3)  按PTji[k]取Fj的第k页Pjk至内存,并在内存中更新其内容,设更新后的Pjk为P’jk; (4) 写入P’jk至数据库的一个新地方,设其在磁盘上的地址为ADD(P’jk); (5) 在内存中,以ADD(P’jk)加取代PTji[k],因而在内存中形成PTj的新版本PTji;

206 (6)   写入PTji至数据库的一个新地方,设其在磁盘上的地址为ADD(PTji);
(7)     再取M至内存; (8)     以ADD(PTji)取代M[j]; (9)     在原地址写回M,事务提交。 易地更新恢复技术的限制和缺点

207 7.5     消息的处理 消息管理(message manager MM)

208 7.6    失效的类型及恢复的对策 1.   事务失效 措施: l    MM丢弃该事务的消息队列; l    如果需要,进行undo操作; l   从ATL删除该事务的TID,释放该事务所占的资源。 2.   系统失效 l     重新启动操作系统和DBMS; l  恢复数据库至一致状态(对末提交的事务进行undo操作,对已提交的事务进行redo操作)。

209 检查点(check point CP)

210 取CP的过程如下: l    暂停事务的执行 l   写入上一个CP以后所提交的事务留在内存中的后象 l    在运行记录的提交事务表中记下检查点 l   恢复事务的执行。 3.    介质失效 措施: l    修复系统,必要时更换磁盘; l  如果系统(操作系统和DBMS)崩溃,重新启动系统; l    加载最近后备复本; l   用运行记录中的后象,重做取最近后备复本以后提交的所有事务。

211 7.7   并发控制引论 7.7.1   数据库系统中的并发 串行访问 交叉并发 并发访问 同时并发

212 7.7.2   并发的目的 1. 改善系统的资源利用率 2. 改善短事务的响应时间

213 7.7.3   并发引起的问题 1. 丢失更新(lost update) 写—写冲突(write-write conflict) 2. 读脏数据(dirty read) 读—写冲突(read-write conflict)

214

215 3. 读值不可复现(unrepeatable read)
读—写冲突(read-write conflict)

216 7.7.4   并发控制的正确性准则 操作顺序安排的原则是:既要交叉执行,以充分利用系统的资源;又要避免访问冲突。 S=…R1(x)…W2(x)…R1(x)… 目标等价(view equivalence) 冲突等价(conflit equivalence)  冲突的操作:Ri(x)和Wj(x)以及Wi(x)和Wj(x) i≠j 不冲突的操作:Ri(x)和Rj(x)以及Ri(x)和Wj(y) i≠j

217 可串行化(serializable) S=R2(x)W3(x)R1(y)W2(y) S→R2(x)R1(y)W3(x)W2(y)→R1(y)R2(x)W2(y)W3(x)=S’ Conclusion: 在一般DBMS中都是以可串行化作为并发控制的正确性准则(冲突可串行化)。

218 7.8         加锁协议 7.8.1   X锁 X锁:既用于写操作,也用于读操作。

219 连锁卷回(cascading rollback)

220

221 7.8.2   两段封锁协议 定义 在一个事务中,如果加锁动作都在所有释放锁动作之前,则称此事务为两段事务(two-phase transaction)。上述的加锁限制称为两段封锁协议(two-phase locking protocol,简称2PL协议)。

222

223 定义7.8-2 一个事务如果遵守先加锁,后操作的原则,则此事务称为合式(well formed)事务。
定理 如果所有事务都是合式、两段事务,则它们的任何调度都是可串行化的。 严格的2PL协议(strict 2PL protocol) 7.8.3  (S,X)锁 S锁(Sharing locks)用于读访问 X锁(eXclusive locks)用于写访问

224 活锁(live lock): first come first serve   

225 7.8.4 (S,U,X)锁 活锁(live lock): first come first serve   

226 7.9    死锁的检测、处理和防止 死锁(dead lock):对付死锁无非两种办法:一是检测死锁,发现死锁后处理死锁;二是防止死锁。

227

228 7.9.1   死锁的检测和处理        1.     超时法        2.    等待图法(wait-for graph) G=(W,U) 其中,W是结点的集合,w={Ti|Ti是数据库系统中当前运行的事务,i=1,2,…,n} U是边的集合,U={(Ti,Tj)|Ti等待Tj,i≠j} DBMS对死锁一般作如下处理: l        在循环等待的事务中,选一个事务作为牺牲者(victim),给其他事务“让路”; l        卷回牺牲的事务,释放其获得的锁及其他资源; l        将释放的锁让给等待它的事务。

229 被牺牲事务的选择原则: l        选择最迟交付的事务作为牺牲者 l        选择获得锁最少的事务作为牺牲者 l        选择卷回代价最小的事务作为牺牲者 7.9.2   死锁的防止 时间标记(time stamp简称时标ts):随时间增长的正整数。 系统启动时,ts=0,每当一个新事务开始运行时,ts+1,并把此时的ts赋予该事务,作为该事务的时标。 设有两个事务TA和TB,如ts(TA)<ts(TB),则表示TA早于TB,也就是TA比TB“年老”,或者说TB比TA“年轻”。

230 1.  等待—死亡(wait-die)策略 设TB持有某数据对象的锁,当TA申请同一数据对象的锁而发生冲突时,则按如下的规则处理: if ts(TA)<ts(TB) then TA waits; else { rollback TA; /*die */ restart TA with the same ts(TA); } 2.  击伤—等待(wound-wait)策略 if ts(TA)>ts(TB) then TA waits; rollback TB; /*wound */ restart TB with the same ts(TB);

231 7.10  多粒度封锁 7.11  基于时间标记的并发控制技术 7.11.1  基本的时间标记协议 事务的时间标记:ts(T) 数据的时间标记: l        读时间标记tr l        写时间标记tw         1.  事务T读数据D  read(D); if ts(T) ≥tw then /*符合时间标记协议,read(D)即 为读取值*/ tr := max(ts(T), tr);

232 else /*已有比T年轻的事务写入D,违反时间
rollback T and resart it with a new ts(T); 2. 事务T写数据D if ts(T) ≥tr AND ts(T) ≥tw then /*符合时间标记协议*/ { write(D); tw := ts(T); } else /*违反时间标记协议,T应卷回*/

233

234 7.11.2  多版本并发控制技术 7.12         乐观并发控制技术 乐观法(optimistic method) 悲观法(pessimistic method) 1.   读阶段(read phase) 2.  检验阶段(validation phase) 3.   写阶段(write phase) 检验Ti,设Tj是已提交或正在检验的任一事务,如果对所有Tj,Ti满足下列三个条件之一,则检验通过,Ti可进人写阶段;否则,Ti须卷回并重新启动。 (1)   Tj在Ti进入读阶段之前就已完成写阶段 (2) Ti的读数据集与Tj的写数据集的交集为空集, 而且Ti在Tj完成写阶段之后才进人写阶段

235 (3)   Ti的读数据集和写数据集都与Tj的写数据集不相交

236 书后习题: 16.如果把wait-die策略修改为: 如果ts(TA)>ts(TB) 则TA等待 否则,卷回TA,井以原来的ts(TA)重新启动。 请回答以下问题: (1)此策略能否避免死锁? (2)此策略有何主要问题? (3)如何改进此策略,消除其存在的问题? (4)请将改进后的策略与标准的wait-die和wound-wait策略比较。

237 第八章       数据库的安全和完整性约束 数据库的破坏一般来自下列四个方面: (1)系统故障; (2)并发所引起的数据不一致; (3)人为的破坏,例如数据被不该知道的人访问,甚至被篡改或破坏; (4)输入或更新数据库的数据有误,更新事务未遵守保持数据库一致性的原则。 8.1         数据库的安全 安全的操作系统是数据库安全的前提。 8.1.1   视图定义和查询修改 8.1.2   访问控制 数据库用户按其访问权力的大小,一般可分为以下三类。

238 1.   一般数据库用户 在SQL中,这种用户称为“具有CONNECT特权的用户”。这种用户可以与数据库联系,并具有下列特权: (1)按照授权可以查询或更新数据库中的数据; (2)可以创建视图或定义数据的别名。 2.  具有支配部分数据库资源特权的数据库用户 在SQL中,这种用户称为“具有RESOURCE特权的用户”,除具有一般数据库用户所拥有的所有特权外,还有下列特权: (1)可以创建表、索引和簇集; (2)可以授予或收回其他数据库用户对其所创建的数据对象的访问权; (3)有权对其所创建的数据对象跟踪审查(audit)(有关跟踪审查的内容将在稍后介绍)。

239 3.  具有DBA特权的数据库用户 DBA拥有支配整个数据库资源的特权,这种用户除具有上述两种用户所拥有的一切特权外,还有下列特权: (1)有权访问数据库中的任何数据; (2)不但可以授予或收回数据库用户对数据对象的访问权,还可以批准或收回数据库用户; (3)可以为PUBLIC定义别名,PUBLIC是所有数据库用户的总称; (4)有权对数据库进行调整、重组或重构; (5)有权控制整个数据库的跟踪审查。 1.      identification and authentication 2.      authorization

240 GRANT 〈特权类型〉 [{,〈特权类型〉}]TO〈用户标识符〉[IDENTIFIED BY 〈口令〉];
〈特权类型〉::=CONNECT | RESOURCE | DBA 例8-1 GRANT DBA TO WANG IDENTIFIED BY B02M29@J; 例8-2 GRANT CONNECT TO CHANG IDENTIFIED BY xyzabc; GRANT RESOURCE TO CHANG; REVOKE〈特权类型〉 [{,〈特权类型〉}]FROM〈用户标识符〉;

241 GRANT 〈特权〉 ON 〈表名〉 TO 〈受权者〉[{,〈受权者〉}][WITH GRANT OPTION];
〈特权〉::=ALL PRIVILEGES | 〈操作〉[{,〈操作〉}] 〈操作〉::=SELECT | INSERT | DELETE | UPDATE [(〈准许修改的属性表〉)] 〈准许修改的属性表〉::=〈属性名〉[{,〈属性名〉}] 〈受权者〉::=PUBLIC | 〈用户标识符〉 REVOKE 〈特权〉ON〈表名〉FROM〈受权者〉[{,〈受权者〉}];

242 设有用户Ul、U2、U3和U4,U1有一张表S,下面是一连串授权过程:
U1:GRANT SELECT ON TABLE S TO U2 WITH GRANT OPTION; U2授权给U3: U2:GRANT SELECT ON TABLE U1.S TO U3 WITH GRANT OPTION; U3授权给U4: U3:GRANT SELECT ON TABLE U1.S TO U4 WITH GRANT OPTION; U1收回授给U2的特权; U1:REVOKE SELECT ON TABLE S FROM U2;

243 此语句的作用不仅收回U1授予U2的特权(即SELECT ON TABLE S),而且还收回U2授予U3、U3授予U4的这种特权。
GRANT SELECT,UPDATE(GRADE,ADDRESS) ON TABLE S1 TO XU,MA; 8.1.3   数据加密 8.1.4   跟踪审查 AUDIT SELECT,INSERT,DELETE,UPDATE ON emp WHENEVER SUCCESSFUL; 即对emp表的每次成功的选择、增、删、改操作都作跟踪审查记录。 NOAUDIT ALL ON emp;

244 8.2  统计数据库的安全  8.3  完整性约束 8.3.1  完整性约束的类型 固有约束 静态约束 隐含约束 显式约束 动态约束 8.3.2   完整性约束的说明 1    用过程说明约束 2    用断言说明约束 ASSERT余额约束 ON 储蓄账:余额≥0;

245 3   用触发子表示约束 whenever <条件> thcn <动作>; DEFINE TRIGGER 余额约束ON储蓄账: 余额<0 ACTION_PROCEDURE 卷回事务,通知帐户; 4    CHECK子句 8.3.3   完整性约束的实施

246 第九章    分布式数据库管理系统 9.1         分布式数据库系统 分布式数据库系统(distributed database system,简称DDBS) DDBS有以下三个特点: (1)   数据是分布的,因此它不同于通过计算机网共享的集中式数据库系统; (2)   分布的数据是相互有关的,一般是一个单位或多个有关单位的数据,因此它不同于由网络互连的多个独立数据库系统; (3)   数据由DDBMS统一管理,因此它不同于一般的分布式文件系统。 分布式数据库有下列四个优点:

247 (1)   有利于改善性能 (2)   可扩充性好 (3)   可用性好 (4)   自治性好 DDBS的缺点: (1)   异构 (2)   分布设计 9.2         数据分布策略 9.2.1   数据分布的目的 1. 提高访问的局部性(locality of reference) 2. 分担负荷 目的不同,数据库服务器的位置、客户机与其连接的方式均不同。

248 数据分布的方式 1.      划分式(partitioned) 2.      全重复式(fully replicated) 3.      部分重复式(partially replicated)

249 9.2.3   关系的分割 分布单位: 1.  关系 2.   裂片(fragment) 分割方式: l    水平分割 l    垂直分割 l     混合分割 分割准则: a)     Completeness b)     Reconstruction c)     Disjointness

250 9.2.4   数据分布带来的问题 1. 保持多复本—致性 2. 保持分布一致性 3. 全局查询的处理 4. 分布事务的管理 9.3    分布式数据库系统结构

251

252 9.4   数据目录的分布及管理 9.4.1   数据目录分布的策略 1.   集中式(centralized) 2.   扩展的集中式(centralized (extended)) 3.   全重复式(fully replicated) 4.    部分重复式(partially replicated) 5.  用缓存提高目录读速度(speed up through caching) 9.4.2   分布式数据库系统中的命名 1.   全局名空间(global name space) 2.   层次名空间

253

254 9.5  查询分解和优化

255 9.6   分布式数据库系统中的恢复技术 9.6.1   两步提交协议

256 9.6.2   三步提交协议

257 9.7  分布式数据库系统中的并发控制 9.7.1   分步式数据库系统中的两步封锁 1. 写全锁(write locks all) 写全锁的加锁协议如下: l   读:在任一复本上加S锁 l   写:在所有复本上加X锁 l   保持所有锁到全局事务结束(EOT) 2. 多数封锁(majority locking) 加锁协议如下: l    读:对过半数的复本上加S锁 l    写:对过半数的复本上加X锁 l    保持所有锁到全局事务结束(EOT)

258 3. N中取K封锁(K out of N locking)
加锁协议如下: l   写:对n个复本中的k个复本上加X锁 k>n/2 l   读:对n个复本中的n-k+1个复本上加S锁 l   保持所有锁到全局事务结束(EOT) 4. 主结点法 9.7.2   全局死锁的检测

259 第十章      数据依赖和关系模式的规范化 10.1 关系模式设计中的一些语义问题 Functional Dependency (FD): X→Y R(S#,C#,G.,TN,D)

260 F={{S#,C#}→G, C#→TN, TN→D}
计算机系要通知教师准备给学生补考,可以“查询计算机系所开课程的不及格学生的学号、不及格课程号以及任课教师的姓名”: SELECT S#,C#,TN FROM R WHERE D=‘CS’AND G=‘F’; 问题: 1. 数据冗余太大 2. 更新异常(update anomalies): l     modification anomaly l     insertion anomaly l     deletion anomaly

261 solution: 分解——关系模式规范化: SCG(S#,C#,G) CTN(C#,TN) TND(TN,D) SELECT S#,C#,TN FROM SCG,CTN,TND WHERE SCG.C#=CTN.C# AND CTN.TN=TND.TN AND D=’CS’ AND G=’F’;

262 10.2 函数依赖 R U={A1,A2,…,An} F r Define functional dependency R(A1,A2,…,An) XU, Y U t1,t2 r 若t1[X]=t2[X], 则t1[Y]=t2[Y], X→Y Trivial functional dependency: 若Y  X,则X→Y X →Y 若X→Y,Y→X则X↔Y Define full (partial) functional dependency R(A1,A2,…,An) X  U, Y  U 且X≠Y,如X→Y,且X‘ X,使得X’→Y,则称X Y,否则, X Y。 {S#, C#} TN {S#, C#} G

263 Define 10.2-3 transitive functional dependency
R(A1,A2,…,An) X  U, Y  U, Z  U,且X≠Y≠Z,若X→Y,Y → X,Y→Z,则称X Z。 Define 逻辑蕴涵 F是R的FD的集合,X→Y是R的一个FD,若一关系模式满足F,则必然满足X→Y,称F逻辑蕴涵X→Y:F╞ X→Y Define closure 函数依赖集合F所逻辑蕴涵的函数依赖的全体称为F的闭包,记为F+,即F+={X→Y|F╞ X→Y }

264 Armstrong’s axioms: A1: reflexivity 若Y  X  U,则X→Y。 A2: augmentation 若X→Y,且Z  U,则XZ→YZ。 A3: transitivity 若X→Y,Y→Z,则X→Z。 合并规则:{X→Y,X→Z}╞ X→YZ 引理 Armstrong公理是正确的(sound),即如果F成立,则由F根据Armstrong公理所推导的函数依赖总是成立的。

265 引理 下列三条推理规则是正确的: (1)   the union rule:{X→Y,X→Z}╞ X→YZ (2)   the pseudo transitivity rule: {X→Y,WY→Z}╞ XW→Z (3)   the decomposition rule: 如果X→Y且Z  Y,则X→Z成立。 结论:由分解规则,若X→{ A1,A2,…,Ak},则X→Ai(i=1…k);由合并规则,若X→Ai(i=1…k),则X→{A1,A2,…,Ak},故X→{ A1,A2,…,Ak}  X→Ai(i=1…k) Define closureX+ 设X  U,则属性集X关于FD集F的闭包X+={A|A∈U,且X→A可由Armstrong’s axioms导出}

266 引理10.2-3 X→Y可由Armstrong’s axioms导出 Y  X+。
定理 Armstrong’s axioms是正确的、完备的(complete)。 X+={A|A∈U,且X→A∈F+}或X+={A|A∈U,且F╞ X→A} F+={X→Y|X→Y可由Armstrong’s axioms从F导出} 算法 求X+ Input: X  U,F Output: X+ 方法:按下列方法依次求X(0),X(1),……X(i),……

267 (1)   初始化:X(0)=X,i=0; (2)   求B={A|(V)(  W)(V→W∈F∧V  X(i)∧A∈W)} (3)   X(i+1)=B∪X(i) (4)   X(i+1)=X(i)? (5)   不等,i=i+1,返回(2)。 (6)   相等,X+=X(i) 例10-1 设F={AB→C,D→EG,C→A,BE→C,BC→D,CG→BD,ACD→B,CE→AG},计算(BD)+。 解:X(0)=BD 找左部为BD的子集的函数依赖,只有D→EG X(1)=BD∪EG=BDEG

268 找左部为BDEG的子集的函数依赖,有D→EG,BE→C
X(2)= X(1)∪EGC=BCDEG 找左部为BCDEG的子集的函数依赖,有D→EG,C→A,BE→C,BC→D,CG→BD,CE→AG X(3)= X(2)∪ABCDEG=ABCDEG (BD)+=U 算法10.2-1改进: 1. 若X(i)=U,则迭代结束,X+=U 2. 在每次迭代中,用过的FD可不必再选出来,因其对结果已不再增加属性。 Define FD set F、G,若F+=G+,则称FG等价。 引理 F+=G+  F  G+,G  F+

269 10.3 多值依赖 引理10.2-5 任一函数依赖集F总可以为一右部恒为单属性的函数依赖集所覆盖。
Define 函数依赖集F如果满足下列条件,则称为极小函数依赖集或最小覆盖。 (1)F中每个函数依赖的右部为单属性。 (2)F中不存在这样的函数依赖X→A,使得F -(X→A)与F等价。 (3)在F中也不存在这样的X→A,使得F-(X→A)∪(Z→A)与F等价,式中Z X。 定理 任一函数依赖集F都与一最小函数依赖集F’等价。F’称为F的最小覆盖。 10.3 多值依赖 X→→Y X→→U-X-Y

270

271 Define 10.3-1 设X、Y是关系模式R的属性集,如果对于R的任何值r,都有如下性质,则称R满足X→→Y。
如果r中存在两个元组s、t,使得 s[X]=t[X] 则r中必然存在两个元组u、v,使得 u[X]=v[X]=s[X]=t[X] u[Y]=t[Y]且u[U-X-Y]=s[U-X-Y] v[Y]=s[Y]且v[U-X-Y]=t[U-X-Y]

272

273 SPJ=SPJ[S#,P#] SPJ[P#,J#]
10.4 连接依赖 例10-2 设有一关系SPJ(S#,P#,J#),S#表示供应商号,P#表示零件号,J#表示工程号。SPJ表示供应关系,即某供应商供应某零件给某工程。如果此关系的语义满足下列条件: SPJ=SPJ[S#,P#] SPJ[P#,J#] SPJ[J#,S#] 10.5 关系模式的分解及其问题 Define 设有一关系模式R(U),若用一关系模式的集合{R1(U1),R2(U2),…Rk(Uk)}来取代, 其中,U= ,则称此关系模式的集合为R的 一个分解,以ρ={Rl,R2,…,Rk}表示。

274 Define 10.5-2 F在属性集Ui(  U)上的投影定义为

275 关系模式的分解主要有两种准则: (1)   只满足无损分解要求。 (2)   既满足无损分解要求,又满足保持依赖要求。 关系R(ABCD),F={A→B,C→D},则分解ρ={R1(AB),R2(CD)}

276 算法 检验一个分解是否无损分解。 Input: 关系模式R(A1,A2,…,An); R上有FD集F; R上的分解ρ={Rl,R2,…,Rk}。 Output: ρ是否无损分解。 方法:建立n列、k行的矩阵M,其中每列对应于R的一个属性,每行对应于ρ中的一个关系模式。

277 则,ρ不是无损分解。 例10-4 R(ABCDE),ρ={R1(AD),R2(AB),R3(BE),R4(CDE),R5(AE)}是R的一个分解。在R上有下列FD:A→C、B→C、C→D、DE→C、CE→A。试判断ρ是否为无损分解。

278

279 例10-5 在例10-3中:

280 10.6 关系模式的规范化 1NF(Normal Form)

281 2NF 3NF BCNF 4NF 5NF

282

283

284 R(S#,C#,G.,TN,D) F={{S#,C#}→G, C#→TN, TN→D} R分解为R1(S#,C#,G)和R2(C#,TN,D) R2可分解为R3(C#,TN)和R4(TN,D)

285 算法 NF2 1NF 横向或纵向展开。 算法 NF  2NF 即消除非主属性对键的PFD。 设R(K1,K2,A,B),K1+K2为键,AB为非主属性。F={K1→A,K1K2→B} 则将R分解为R1(K1,A)和R2(K1,K2,B) 算法 NF  3NF 即消除非主属性对键的TFD。 设R(K,A,B,C),K为键,ABC为非主属性。F={K→A,K→B,B→C} 则将R分解为R1(B,C)和R2(K,A,B)

286 可以直接从1NF3NF 例10-6 R(ABCD)F={AB→C,B→D,BC→A} 键:AB和BC,则ABC为主属性,D为非主属性,D部分FD于键,分解为: R1(BD)和R2(ABC) 例10-7 R(CTHRSG),C-课程,T-教师,H-时间,R-教室,S-学生,G-成绩。F={C→T,HR→C,HT→R,CS→G,HS→R} 键:HS,HS为主属性,CTRG为非主属性。 HS→R(已知),HS→H(平凡FD)HS→HR(合并规则),HR→C(已知),HS→C(传递律) C→T(已知),HS→T(传递律) HS→R(已知)

287 HS→S(平凡FD)HS→C(已求出)HS→CS(合并规则)CS→G(已知),HS→G(传递律)
处理HS→G(TFD)得R1(CSG)原R变为R(CTHRS) 处理HS→T(TFD)得R2(CT)原R变为R(CHRS) 处理HS→C(TFD)得R3(HRC)原R变为R4(HRS) 即R分解为: R1(CSG):学生的各门课程的成绩 R2(CT):每门课程的教师 R3(HRC):每门课的上课时间和在每个时间的上课教室 R4(HRS):学生在每个时间的上课教室。

288 第十一章    数据库设计 11.1    Introduction 数据库设计的基本任务是:根据—个单位的信息需求,处理需求和数据库的支撑环境(包括DBMS,操作系统和硬件),设计出数据模式(包括外模式,逻辑(概念)模式和内模式)以及典型的应用程序。 信息需求——静态要求 处理需求——动态要求 数据库设计方法: 1. Data-oriented approach 2. Process-oriented approach 数据库设计特征: 1. Iterative

289 2. Tentative 3. Multistage 数据库设计步骤: 1. 需求分析 2. 概念设计 3. 逻辑设计 4. 物理设计

290 11.2    需求分析 11.2.1  需求分析的任务 需求分析的任务是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计数据库。 11.2.2  需求分析的方法 调查与初步分析用户的需求通常需要四步: ①首先调查组织机构情况。包括了解该组织的部门组成情况,各部门的职责等,为分析信息流程作准备。

291 ②然后调查各部门的业务活动情况。包括了解各个部门输入和使用什么数据,如何加工处理这些数据,输出什么信息,输出到什么部门、输出结果的格式是什么。这是调查的重点。
③在熟悉了业务活动的基础上,协助用户明确对新系统的各种要求,包括信息要求、处理要求、完全性与完整性要求,这是调查的又一个重点。 ④最后对前面调查的结果进行初步分析,确定新系统的边界,确定哪些功能由计算机完成或将来准备让计算机完成,哪些活动由人工完成。由计算机完成的功能就是新系统应该实现的功能。 常用的调查方法有以下几种:

292 ①跟班作业。通过亲身参加业务工作来了解业务活动的情况。这种方法可以比较准确地理解用户的需求,但比较耗费时间。
②开调查会。通过与用户座谈来了解业务活动情况及用户需求以相互启发。 ③请专人介绍。 ④询问。对某些调查中的问题,可以找专人询问。 ⑤设计调查表请用户填写。如果调查表设计得合理,这种方法很有效,也易于为用户接受。 ⑥查阅记录。即查阅与原系统有关的数据记录。

293 图11-2 需求分析的策略

294 图11-3 系统高层抽象图

295 图11-4 需求分析的过程

296 实例:假设要开发一个学校管理系统。经过可行性分析和初步需求调查,抽象出该系统最高层数据流图,如图所示。该系统由教师管理子系统、学生管理子系统、后勤管理子系统组成.每个子系统分别配备一个开发小组。
其中学生管理子系统开发小组通过做进一步的需求调查,明确了该子系统的主要功能是进行学籍管理和课程管理,包括学生报到、入学、毕业的管理,学生上课情况的管理。通过详细的信息流程分析和数据收集后,他们生成了该子系统的数据流图,如图所示。

297 图11-5 学校管理系统最高层数据流图

298

299 图11-6 学籍管理的数据流图

300 图11-7 课程管理和数据流图

301 11.2.3  数据字典 数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程5个部分。 1.数据项 数据项是不可再分的数据单位。对数据项的描述通常包括以下内容 数据项描述={数据项名,数据项含义说明.别名,数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系} 2.数据结构 数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}

302 3.数据流 数据流描述={数据流名,说明,数据流来源,数据流去向,组成:{数据结构},平均流量,高峰期流量} 4.数据存储 数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流组成:{数据结构},数据量,存取方式} 5.处理过程 处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}} 以上述学生学籍管理子系统为例,简要说明如何定义数据字典。

303 该子系统涉及很多数据项,其中“学号”数据项可以描述如下:
数据项:学号 含义说明:唯一标识每个学生 别名:学生编号 类型:字符型 长度: 8 取值范围; 至 取值含义:前2位标别该学生所在年级,后6位按顺序编号 与其他数据项的逻辑关系:……

304 “学生”是该系统中的一个核心数据结构,它可以描述如下:
数据结构:学生 含义说明:是学籍管理子系统的主体数据结构,定义了一个学生的有关信息 组成:学号,姓名,性别,年龄,所在系,年级 数据流“体检结果”可描述如下: 数据流:体检结果 说明:学生参加体格检查的最终结果 数据流来源:体检 数据流去向:批准 组成:…… 平均流量:……

305 高峰期流量:…… 数据存储“学生登记表”可描述如下: 数据存储:学生登记表 说明:记录学生的基本情况 流入数据流:…… 流出数据流:…… 组成: 数据量:每年3000张 存取方式:随机存取 处理过程“分配宿舍”可描述如下: 处理过程:分配宿舍 说明;为所有新生分配学生宿舍

306 输入:学生,宿舍 输出:宿舍安排 处理:在新生报到后,为所有新生分配学生宿舍。要求同一间宿舍只能安排同一性别的学生,同一个学生只能安排在一个宿舍中。每个学生的居住面积不小于3平方米。安排新生宿舍其处理时间应不超过15分钟。 11.3    数据库的概念设计 11.3.1  数据库概念设计的基本方法 1. Centralized schema design approach 2. View integration approach 11.3.2  视图设计

307 1.   自顶向下 2.   自底向上 3.   由内向外

308 11.3.3  视图集成 1.  确认视图中的对应和冲突 (1)      命名冲突 (2)      概念冲突 (3)      域冲突 (4)      约束冲突 2. 对视图进行某些修改,解决部分冲突 3.  合并视图,形成全局模式

309

310

311 11.4    数据库的逻辑设计 11.4.1  E-R图到关系模式的转换 1  命名和属性域的处理 2  非原子属性的处理 3   弱实体的处理

312

313 4    联系的转换 (1)      1:1联系

314 若E1全参与: R1(k,a,h,s) R2(h,b) 若E1、E2均部分参与: R1(k,a) R3(k,h,s)

315

316 (2)  1:N联系 若E2部分参与: R1(k,a) R2(h,b) R3(h,k,s) 若E2全参与: R1(k,a) R2(h,b,k,s)

317

318 (3)  M:N联系 R1(k,a) R2(h,b) R3(k,h,s)

319

320 (4) 多元联系 R1(k,a) R2(h,b) R3(j,c) R4(k,h,j,s)

321

322 5  普遍化/特殊化层次的转换 6  范畴的转换 11.4.2  逻辑模式的规范化、调整和实现 1)     规范化, 2)     适应DBMS限制条件的修改, 3)     满足性能、存储空问等要求的调整, 4)     用DBMS所提供的DDL实现逻辑模式 1. 改善数据库性能的调整 (1)   减少连接运算 (2)   减小关系的大小和数据量 (3)   尽可能使用snapshot 2. 节省存储空间的调整 (1)   节省每个属性所占的空间 (2)   采用dummy attribute减少重复数据所占存储空间

323 11.4.3  外模式的设计 11.5    数据库的物理设计 11.5.1  簇集设计 11.5.2  索引的选择 凡是满足下列条件之一的属性或表,不宜建立索引: ①不出现或很少出现在查询条件中的属性。 ②属性值很少的属性。例如属性“性别”只有两个值,若在其上建立索引,每个属性值对应一半的元组;用索引检索,还不如顺序扫描。 ③属性值分布严重不均的属性。例如学生的年龄往往集中在几个属性值上,若在年龄属性上建立索引,则在检索某个年龄的学生时,会涉及到相当多的学生,用索引查询,还不如顺序扫描。

324 ④经常更新的属性或表。因为更新时索引需要维护。
⑤过长的属性,例如超过30个字节。因为在过长的属性上建立索引,索引所占的存储空间较大,而且索引级数也随之增加,有诸多不利之处。如果实在需要在其上建立索引,必须采取索引键压缩措施。 ⑥太小的表,例如小于六个物理块的表。因为采用顺序扫描最多也不过六次I/O,不值得采用索引。 凡符合下列条件之一,可考虑在有关属性上建立索引,下面所指的查询都是常用的或重要的查询:

325 ①主键和外键上一般都建有索引 l   有利于主键唯一性检查 l   有助于引用完整性约束检查 l   可以加速以主键和外键为连接属性的连接操作 ②对于以读为主或只读的表,只要需要,且存储空间允许,可以多建索引。 ③对于等值查询(即查询条件以等号为比较符),如果满足条件的元组是少量的,例如小于5%,可以考虑在有关属性上建立索引。

326 ④对于范围查询(即查询条件以<、>、≤、≥等为比较符),最好在有关的属性上建立簇集索引。如果已在其它属性上建立族集索引,且满足条件的元组数一般低于20%,可以考虑在有关属性上建立非簇集索引。
⑤有些查询可以从索引直接得到结果,不必访问数据块。对于这种查询,在有关属性上建立索引是有利的。 11.5.3  分区设计 11.6    分布式数据库的设计 11.6.1  数据的分割设计 11.6.2  数据的分布设计


Download ppt "数据库原理与设计方法 东南大学自动控制系 邵家玉"

Similar presentations


Ads by Google