第一章 数据库概述
一、四个基本概念
1、数据(Data):数据是描述事物的符号记录。
种类:文本、图形、图像、音频、视频等
特点:数据与语义不可分割,数据是有结构的
2、数据库(DB:Database):长期储存在计算机内、有组织、可共享的数据集合
3、数据库管理系统(DBMS:Database Management System):对数据库中的数据进行存储和管理的软件系统。
例如:Dbase、Oracle、mysql、sql server
功能:
- 数据定义功能——提供数据库定义语言(DDL)
- 数据组织、存储和管理
- 数据操纵功能——提供数据操纵语言(DML)进行基本操作
- 数据事务管理和运行管理
4、数据库系统(DBS:Database Application System)
由数据库、数据库管理系统、应用系统、数据库软硬件支撑环境、数据库管理员和用户构成
二、数据管理技术的发展过程
人工管理阶段:没有磁盘、操作系统,只能计算、无法存储结果
文件系统管理阶段:出现操作系统(文件系统),可以存储计算结果
数据库管理阶段:大容量、大规模、数据共享
三、数据独立性
逻辑独立性:当表达现实世界的信息内容发生变化时,不影响应用程序特性(增加删除信息)
物理独立性:当数据的存储位置或存储结构发生变化时,不影响应用程序的特性(存放位置)
四、数据库系统的组成
狭义:数据库、数据库管理系统、数据库应用系统
广义:数据库、数据库管理系统(核心)、数据库应用系统、人员(数据库管理员、系统分析员和数据库设计员、程序员)、软硬件、用户
第二章 数据库系统结构(内部结构)
一、信息与数据
1、信息:从数据中获得的有意义的内容(人脑对现实世界事物的存在方式、运动状态以及事物之间联系的抽象反应)。
2、数据:描述事物的符号记录。
数据语法:数据的格式
数据语义:数据含义。数据赋予不同语义有不同解释。
表现形式:数字、文字、图像、声音等。
3、数据静态特征:
l 数据基本结构
l 数据的联系
l 数据取值范围的约束
动态特征:对数据的操作(查询、插入删除更新)以及操作规则
对数据的静态特征和动态特征的描述称为数据模型三要素。
3、数据与信息的区别和联系:
数据是信息的符号表示;
信息是对数据的语义解释。
信息=数据+语义 数据+数据处理=信息
二、概念层数据模型(概念模型)
现实世界:由客观存在的事务及其联系组成。如:学生选修课程。
信息世界(概念世界):对客观事物及联系的一种抽象描述。如:学生信息、教师信息
计算机世界(数据世界):对信息世界中信息的数据化。
1、从数据的语义视角抽取模型,按照用户的观点对数据和信息建模。是现实世界到信息世界的抽象。
与具体的DBMS无关,与具体的实现方式无关
常用模型:实体-联系模型、语义对象模型
2、实体-联系模型
(1)实体:客观存在并可以相互区别的“事物”。可以是具体的人事物,又可以是抽象的事件。
用矩形框表示,框内写明实体名。
(2)属性:实体所具有的特征或特质。用椭圆形表示,用无向边与其对应实体连接
(3)联系:数据之间的关联集合
用菱形表示,框内写明联系名,用无向边与有关实体连接,并在边旁标上联系的类型(1..1、1...n或m...n)。
联系种类:
一对一(1:1) 一对多(1:n) 多对多(m:n)
ER 模型转换为关系模式的原则:
一对一:遇到一对一关系的话,在两个实体任选一个添加另一个实体的主键即可。
一对多:遇到一对多关系的话,在多端添加另一端的主键。
多对多:遇到多对多关系的话,我们需要将联系转换为实体,然后在该实体上加上另外两个实体的主键,作为联系实体的主键,然后再加上该联系自身带的属性即可。
三、组织层数据模型(组织模型)
从数据的组织层次来描述数据
根据数据组织方式分,分为:非关系模型(层次模型、网状模型)、关系模型、面向对象模型、对象-关系模型
关系模型概述:
(一)关系数据结构
关系:满足以下性质的二维表
- 关系表中的每一列都是不可再分的基本属性
- 表中行、列次序不重要
关系数据模型:用关系(二位表格数据)表示实体和实体关系之间联系的模型。
元组:表中的一行为一个元组,相当于一个记录值
属性:表中一列是一个属性,属性名称即属性名
分量:元组中的每一个属性值称为元组的一个分量。n元关系的每个元组有n个分量。
域:属性的取值范围。如性别的域为:(‘男’,‘女’)
候选码:能够唯一标识关系中的一个元组的一个属性或最小属性组。
主码:指定候选码中的一个作为主码
主属性:包含在任一候选码中的属性
非主属性:不包含在任意候选码中的属性
关系模式:二维表的结构(表框架或表头结构)。即:关系名R(属性A1,属性A2,...)例如:学生关系模式:学生(学号、姓名、性别、年龄)
关系模式与关系:
关系模式是型,对关系的描述,静态的、稳定的
关系是值,关系模式在某一时刻的状态或内容,是动态的、随时间变化的
(二)关系操作
1、符号
2、传统的关系运算:
(1)并 (2)交
(3)差 (4)笛卡尔积
3、专门的关系运算
(1)选择(从行的角度) (2)投影(从列的角度)
(3)连接
(4)除(行和列)
(三)数据完整性约束
数据完整性是指数据库中存储的数据是有意义的或正确的。
(1)实体完整性:每个元组都是可识别的和唯一的(主键非空)
表中不允许存在:无主码值的记录、主码值相同的记录
(2)参照完整性:描述多个实体之间的联系,一般用外码实现。(外码要么为空,要么为被参照表的主码)
外码:取作子表(本表)属性之一的主表(外表、父表)主码。
关系R的外码或者值为空;或者等于被引用表(被参照表)中某个元组的主码值
外码可以有重复值
(3)用户定义的完整性(域完整性、语义完整性):用户定义应遵循的约束条件
四、数据库系统的结构
(一)内部体系结构
从DBMS来看,采用三级模式结构
1、外模式(External Schema)
又称为子模式或用户模式,数据库用户能看到并允许使用的局部数据的逻辑结构和特征的描述,局部逻辑结构。
外模式是模式的的子集,可有多个。
介于概念模式与应用系统之间,模式与外模式:一对多。外模式与应用:一对多(应用程序基于外模式)。
2、模式(Schema)
又称为概念模式或逻辑模式。是对数据库中全体数据的逻辑结构和特征的描述,是数据库的整体逻辑。
作用:
对下层,不涉及数据的物理存储细节和硬件环境
对上层,与具体的应用程序、程序开发工具和程序设计语言无关
一个数据库只有一个模式
3、内模式(Internal Schema)
又称为存储模式或物理模式,处于最内层。是对数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。
一个数据库只有一个内模式。
小结:一个数据库系统,实际存在的只是物理级数据库,即内模式是数据访问的基础。
用户根据外模式进行的操作,通过外模式到模式的映射与概念级数据库联系起来,又通过模式到内模式的映射与物理界数据库联系起来。
(二)二级映像
保证了数据的逻辑独立性和物理独立性。
外模式/模式映像:保证了数据与程序间的逻辑独立性。即当模式改变时,通过修改此映像,使外模式保持不变,应用程序依赖于外模式,从而应用程序不必修改。(如增加或删除了某些字段)
模式/内模式映像:保证了数据的物理独立性。即当数据库的存储结构改变了,通过修改此映像使模式不变,应用程序不受影响。(如从链表存储改为了哈希表存储)
(二)外部体系结构
从最终用户角度来看:
单用户结构数据库系统:应用程序、DBMS和数据库装在一台计算机,一个用户独占使用。
主从式结构:大型主机带多个终端的多用户结构。
分布式结构:数据库分布存储在不同计算机,逻辑上整体。
客户/服务器结构:服务器和客户机分开。
浏览器/服务器结构:客户通过浏览器
第三章 SQL语言基础
一、基本概念
SQL:结构化查询语言,是关系数据库的标准语言。
SQL功能 |
命令动词 |
数据定义语言(DDL) |
Create、drop、alter |
数据库查询语言(DQL) |
select |
数据库操纵语言(DML) |
Insert、update、delete |
数据库控制语言(DCL) |
Grant、revoke |
基本表:独立存在的表,SQL中一个关系对应一个基本表。一个(或多个)基本表对应一个存储文件,一个表可以带若干索引。
视图:从一个或多个基本表中导出的虚表,数据库中只存放视图的定义。用户可以在视图上在定义视图。
存储文件:逻辑上组成了内模式,物理上是任意的,对用户透明。
索引:为快速访问数据,在包含数据的表由增加的一种组织。分为聚簇索引和非聚簇索引。
聚簇索引:索引项顺序与基本表中记录的物理顺序一致的索引结构。
二、SQL的数据类型
1、数值型
(1)准确型
整数:Bigint: 8字节 lnt:4字节 Smallint:2字节 Tinyint:1字节,O~255整数 Bit:1位,存储1或0
小数:Numeric (p,q)或Decimal (p,q),其中: p为数字位长度,q:小数位长度。
(2)近似型:Float:8字节
2、日期时间型
Datetime: 8字节,年月日时分秒毫秒(例:‘2001/08/03 10:30:00.00o’)
SmallDateTime:4字节,年月日时分(例:‘2001/08/03 10:30:00’)
3、字符串型
(1)普通编码字符串类型
Char (n):定长存储,n<=8000
Varchar (n) :不定长存储(按实际),长度不超过n , n<=8000 注: n为字符个数
Text:存储大于8000字节的文本
(2)统一字符编码字符串类型
nchar (n):定长存储,n<=4000
nvarchar (n) :不定长存储,长度最大不超过n , n<=4000
ntext:存储大于8000字节的文本
特点:每个字符占两个字节
(3)二进制字符串类型
Binary(n):固定长度,n <=8000
Varbinary(n):可变长度,n <=8000 .注: n为二进制数据的字节数
image:大容量、可变长二进制字符数据,可用于存储文件
三、数据定义功能
1、定义基本表
CREATE TABLE<表名>
(<列名><数据类型>[列级完整性约束定义]
{,<列名><数据类型>
[列级完整性约束定义] ...}
[,表级完整性约束定义])
列级完整性约束:
- Not null:列取值非空——name char(10) not null
- Default:给定列的默认值
- Unique:限制列取值不重复
- Check:限制列的取值范围
- Primary key:主码——sno char(7) primary key / primary key(sno,cno)
- Foreign key:外码——foreign key(sno) references 学生表(sno)
Not null和default只能是列级完整性约束,其他约束可以在表级完整性约束处定义。
例:创建学生-课程成绩表
2、删除表
Drop table 表名
3、修改表结构
ALTER TABLE<表名>
[ALTER COLUMN<列名><新数据类型>]|[ADD [COLUMN]<列名><数据类型>|[ DROP COLUMN<列名>]|[ADD PRIMARY KEY(列名[,...n])]|[ADD FOREIGN KEY(列名)
REFERNECES表名(列名)]
四、数据完整性
1、完整性约束条件的作用对象有表、元组和列。
列级约束:对列的数据类型、取值范围、格式、精度等约束。
元组约束:元组中各个字段之间的相互约束。例如:开始日期小于结束日期。
关系元组:若干元组之间、关系之间的联系的约束。例如:学号不重复。
2、实现约束
(1)PRIMARY KEY约束
每个表有且只有一个,保证实体完整性
Alter table 表名 add [constraint 约束名] primary key(列名)
Alter table 雇员表 add constraint PK_EMP primary key(雇员编号)
(2)UNIQUE约束
保证列不输入重复值,用于唯一性质的列上,例如身份证号等。
Alter table 雇员表 add constraint UK_SID unique(电话号码)
(3)FOREIGN KEY约束
外码,加强联系
Alter table 雇员表 add constraint FK_job_id foreign key(工作编号) references 工作表(工作编号)
(4)DEFAULT约束
为列提供默认值,一个default只能约束一列
Alter table 雇员表 add constraint DF_SALARY default 1000 for 工资
(5)CHECK约束
限制列的取值
Alter table 雇员表 add constraint CHK_Salary check(工资>=500)
五、数据库定义与删除
1、定义
Create database数据库名称
on primary ( name=数据文件逻辑名,filename=数据文件物理名,size=初始大小,maxsize=最大,filegrowth=增长率)
log on(日志文件的性质...);
2、删除数据库
语法格式:
Drop database 数据库名称;
例如:Drop database mydb;
第四章 数据操纵语句
一、数据查询
1、基本结构
Select (distinct) 列名 from 表名或视图名 where 条件表达式 group by 列名 having 条件表达式 order by 列名 (asc/desc)
(1)查询全部列:select * from 表名
(2)改变列标题:select name as 姓名,2020-age as 年份,’出生年份’ 出生年份 from student
(3)消除重复行:select distinct sno from SC
(4)查询条件
(5)字符匹配: 列名 [not] like <匹配串>
匹配串中可包含如下四种通配符:
- _:匹配任意一个字符;
- %:匹配O个或多个字符;
- []:匹配[]中的任意一个字符;对于连续字母的匹配,例如匹配[abcd],可简写为[a-d]
- [^]:不匹配[]中的任意一个字符
例.省词姓"张’的字生的详细信息。
SELECT*FROM Student WHERE Sname LIKE"张%"
例.查询学生表中姓‘张’、‘李’和‘刘’的学生的情况。
SELECT *FROM Student WHERE Sname LIKE'[张李刘]%'
例.查询名字中第2个字为‘小’或‘大’的学生的姓名和学号。
SELECT Sname,Sno FROM Student WHERE Sname LIKE '_[小大]%'
(6)多重条件
用AND连接的条件表示必须全部满足所有的条件的结果才为True;
用OR连接的条件表示只要满足其中一个条件结果即为True。
例:查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname FROM Student WHERE Sdept =‘计算机系' AND Sage < 20
(7)计算函数汇总数据:
SQL提供的计算函数有:
-
COUNT( * )﹔统计表中元组个数;
-
COUNT ([DISTINCT]<列名>):统计本列值的个数
-
SUM([DISTINCT]<列名>):计算本列值总和;
-
AVG([DISTINCT]<列名>):计算本列平均值;
-
MAX([DISTINCT]<列名>):求本列最大值;
-
MIN([DISTINCT]<列名>):求本列最小值。
注意:除COUNT(*)外,其他函数均忽略NULL值。
(8)分组计算。执行顺序:where——group by——having
2、多表连接查询
(1)内连接
Select 列名from 表名 [inner] join 被连接表 on 连接条件
自连接:特殊的内连接,即相互连接的表物理上为同一张表,但是为两个表取别名,逻辑上成为两个表
例:查询信恳系修了VB课程的学生的修课成绩,要求列出学生姓名、课程名和成绩。
SELECT Sname,Cname,Grade FROM Student s JOIN sc ON s.Sno = sc.Sno
JOIN Course c ON c.Cno = sc.Cno WHERE Sdept= '信息系' AND Cname = 'VB'
(2)外连接
只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足
语法:from 表1 left/right [outer] join 表2 on <连接条件>
例:查询哪些课程没有人选,列出其课程名。
SELECT Cname FROM Course C LEFT OUTER JOIN SC ON C.Cno = sc.Cno WHERE SC.cno is NULL
3、Top限制结果集
格式:
TOP n [percent] [WITH TIES]Top n:查询结果的前n行
Top percent:查询结果的前n%行数据WITH TIES:包括并列的结果
必须用Order by子句对查询结果排序
4、子查询
子查询是一个select查询,嵌套在语句的where或having子句中,或其他子查询中。
子查询可以做集合测试(in)、比较测试、存在测试(exists)
二、数据更改功能
1、插入数据
Insert into Student values(‘20190001’,’张三’,’男’,18)
2、更新数据
Update Student set sage=21 where sno=’2 0190001’
3、删除数据
Delete from SC where Grade<60
三、查询语句扩展
1、查询结果存到新表中: selete Sdept,count(*) as 人数 into dept_cnt from Student group by Sdept
2、case表达式
3、查询结果的并交差运算
Union(并)、instersect(交)、except(差)
位于多个select查询语句之间
第五章 视图
1、视图:有基本表构成的虚表
2、定义语法:create view <视图名> [视图列名表] as 查询语句
说明:
- 查询语句中通常不含order by和distinct语句
- 缺省时视图列名与查询列名相同
- 查询的源表可以是已定义的视图
视图的列名序列或者全部省略,或全部指定。
例1.建立信息系学生的视图。
CREATE VIEW IS_Student AS
SELECT Sno, Sname, SageFROM Student WHERE Sdept = '信息’
定义了视图后,可以和表一样,用SELECT语句访问它。
修改视图:
Alter view 视图名 [视图列名] as 查询语句
删除视图:
Drop view <视图名>
3、视图作用:
l 简化数据查询语句
l 用户多角度看待统一数据
l 提高数据安全性
l 提高逻辑独立性
第六章 关系数据库规范化理论
数据冗余:同一信息在数据库存储多个副本,可能引起:
- 冗余存储:信息重复存储,浪费空间
- 更新异常:修改一个副本,所以都需要修改。
- 插入异常:只有一些信息已经存放,另外一些才能存入数据库
- 删除异常:删除可能丢失信息
原因:存在模式依赖
解决方式:通过分解关系模式来消除其中不合适的数据依赖。
一、函数依赖
1、基本概念
Y=f(X) 省=f(城市) 给出一个具体的城市值,会有唯一一个Y对应
X函数决定Y函数,或Y函数依赖于X函数,表示为:X—>Y
例1:对学生关系模式
Student (Sno,Sname,Sdept,Sage)
有以下依赖关系:Sno→Sname, Sno→Sdept,Sno→Sage
例2:对于选课关系
SC (Sno,Cno, Grade)
有以下依赖关系:(Sno,Cno)→Grade
2、术语与符号
1.如果X→Y,但Y不包含于X,则称X→Y是非平凡的函数依赖。
2.如果X→Y,但Y包含于X,则称X→Y是平凡的函数依赖。
若无特别声明,讨论的都是非平凡的函数依赖。
3.如果X→Y,则称X为决定因子,Y为被决定因子。
4.如果X→Y,并且Y→X,则记作X<—->Y。
5.如果X→Y,并且对于X的一个任意真子集X’都有X’十>Y,则称Y完全函数依赖于X:
如果X→Y成立,并且对于X的某个真子集X’有x'→Y成立,则称Y部分函数依赖于X:
6.如果X→Y(非平凡函数依赖,且Y十>X)Y→Z,则称z传递函数依赖于x,记作:
二、关系规范化
1、定义:关系规范化是将有“不良”函数依赖的关系模式转换为良好的关系模式的理论。
2、范式种类
各种范式之间存在联系:
某一关系模式R为第n范式,可简记为R∈nNF。
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。
(1)第一范式(1NF):
定义:一个关系模式R的所有属性都是不可分割的基本数据项
注意:不满足第一范式的数据库模式不能成为关系数据库
(2)第二范式(2NF)
2NF的定义:如果R(UF)∈1NF,并且中的每个非主属性都完全函数依赖于码,则R(UF)∈2NF。
例:S-L-C(Sno,Sdept,SLoc,Cno,Grade)因为有:Sno →SLOC,因此存在部分函数依赖,该表不是2NF。
如果某个1NF的关系的主码只由一个码组成,那么这个关系为2NF。
目的:将部份依赖主码的数据移到其他表中。
分解方法:
l 首先,对于组成主码的属性集合的每一个子集,用它作为主码构成一个表。
l 然后,将依赖于这些主码的属性放置到相应的表中。
l 最后,去掉只由主码的子集构成的表。
对S-L-C (Sno,Sdept,SLoc,Cno,Grade)首先分解为如下形式的三张表:
- S-L (Sno,...)
- C (Cno,...)
- S-C(Sno, Cno,...)
然后,将依赖于这些主码的属性放置到相应的表中,形成如下三张表:
- S-L(Sno,Sdept,Sloc)
- C (Cno)
. S-C (Sno, Cno, Grade)
最后,去掉只由主码的子集构成的表。S-L-C(Sno.Sdept.SLOC.Cno.Grade)
分解后的关系模式的函数依赖关系:
S-L (Sno,Sdept,Sloc);
Sno->Sdept,Sno->SLOC是2NF
S-C (Sno, Cno, Grade) :
(Sno, Cno) →Grade是2NF
(3)第三范式(3NF)
第三范式(3NF):如果R(U,F)∈2NF,并且所有非主属性都不传递依赖于码,则R(U,F)∈3NF。
S-L(Sno,Sdept,SLOC) 因为Sno→Sdept,Sdept→SLOC,所以Sno-传递→SLOC,不是3NF。
目标:去掉表中不依赖于主码的数据。
分解方法:
(1)对于个是候选码的每个决定因于,从表中删去依赖于它的所有属性;
(2)新建一个表,新表中包含在原表中所有依赖于该决定因子的属性;
(3)将决定因子作为新表的主码。
S-L(Sno,Sdept,SLOC) Sno->Sdept Sdept->SLOC
s-D (Sno, Sdept)
s-L (Sdept, Sloc)
(4)扩展的第三范式(BCNF)
等价于:非平凡函数依赖的每一个决定属性因素都包含候选码
例:在关系模式STJ(S,T.J)中,S表示学生,T表示教师,J表示课程。每个教师只教一门课,一门课可以有多个老师,学生选定课程就固定了老师。
·函数依赖:
(S,J)→T,(S,T)→J,T一J·候选码:(S,J)和(S,T)
STJ∈3NF,因为没有任何非主属性对码传递依赖或部分依赖
STJ不满足BCNF
解决方法:将STJ分解为二个关系模式;ST(S,T)∈ BCNF,TJ(T,J)∈ BCNF
没有任何属性对码是部分函数依赖或传递函数依赖
第七章 数据库保护
一、事务
1、定义:事务是并发控制的基本单位,事务是用户定义的操作系列,这些操作要么全部执行,要么全部不执行。是一个完整的工作单元。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
2、事务结束类型:
事务提交(commit):将成功完成事务的执行结果永久化,并释放事务占有的全部资源。
事务回滚(rollback):中止当前事务、撤销对数据库所做的更改,并释放资源。
3、事务ACID特征
原子性(Atomicity):事务是数据库的逻辑工作单位,要么都做,要么都不做。任何一项操作失败都将导致整个事务失败,同时其他已经执行的操作也会撤销回滚到最初状态。
一致性(consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。事务前后数据的完整性必须保持一致。
隔离性(isolation):多个用户并发访问数据库时,一个事务的执行不能被其他事务干扰。多个并发事务之间要相互隔离。
持久性(Durability):事务一旦提交,对数据库数据的改变是永久的。接下来即使数据库发生故障也不应该对其有任何影响。
4、SQL事务处理模型
隐式事务:每一条数据操作语句都自动成为一个事务
显式事务:有显示的开始和结束标记的事务
ISO事务处理模型:明尾暗头
明尾暗头:事务的开头是隐含的,事务的结束有明确标记
A.事务结束符
COMMIT:事务成功结束符
ROLLBACK:事务失败结束符
B.事务提交方式
自动提交:每条SQL语句为一个事务
指定位置提交:在事务结束符或程序正常结束处提交
C.事务起始/终止位置
程序的首条SQL语句或事务结束符后的语句。
在程序正常结束处或COMMIT语句处成功终止;
在程序出错处或ROLLBACK处失败终止。
T-SQL事务处理模型:明头明尾
每个事务都有显式的开始和结束标记。
事务的开始标记是:
BEGIN TRANSACTION |TRAN
事务的结束标记为:
COMMIT [TRANSACTION/ TRAN]
ROLLBACK [TRANSACTION / TRAN]
二、并发控制
多用户数据库:允许多个用户同时使用的数据库(订票系统)
1、不同的多事务运行方式:
(1)串行执行
每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。
问题:不能充分利用系统资源,发挥数据库共享资源的特点
(2)交叉并行执行
在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行。单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率。
(3)同时并发方式
多处理机系统中,每个处理机可以运行一个事务,
多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。
本章主要讨论单处理机环境下的并发控制技术。
2、并发执行带来的问题:
多个事务同时存取同一数据(共享资源)
存取不正确的数据,破坏事务一致性和数据库一致性
3、并发操作带来的数据不一致情况
记号:R(x):读数据x W(x):写数据x
(1)丢失更新
(2)读“脏”数据
(3)不可重复读
1)事务T,读取某一数据后,事务T;对其做了修改,当事务T,再次读该数据时,得到与前一次不同的值。
2)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录消失了。
3)事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时也称为幽灵/幻影现象。
数据不一致原因:并发操作破坏了事务的隔离性。
并发操作任务:用正确的方式调度并发操作,保证事务隔离性,避免数据不一致。
4、并发控制措施
(1)并发控制主要技术:加锁、时间戳、乐观控制法
(2)加锁:事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放锁前,其它事务不能更新此数据对象。
封锁类型:
排它锁(exclusive locks):又称为写锁(X锁)。
允许事务读取和修改数据,其他事务不能再加任何锁,直到事务释放X锁。
共享锁(share locks):又称为读锁(S锁)
其他事务只能对数据加S锁,不能加X锁,直到事务释放S锁
5、加锁(封锁)协议
(1)一级封锁协议:
规定:对事务T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)时才释放。
效果:可以防止丢失修改不能防止可重复读和不读“脏”数据。
(2)二级封锁协议
规定:一级封锁协议加上对事务T对要读取的数据加S锁,读完后即释放S锁。
效果:可以防止丢失修改、防止读“脏”数据。不能防止可重复读数据。
(3)三级封锁协议
规定:一级封锁协议加上事务T对要读取的数据加S锁,并直到事务结束才释放。
效果:可以防止丢失修改、防止读“脏”数据、防止不可重复读。
6、活锁和死锁
(1)活锁:不断申请不断等待。
避免策略:采用先来先服务策略。即当多个事务请求封锁同一数据对象时,按照请求的先后次序排队,一但锁释放,首先批准申请队列中第一个事务获得锁。
(2)死锁:两个或多个事务互相等待。
① 死锁的预防:破坏产生死锁的条件,但不适合。
一次封锁法:要求每个事务必须一次将所有要使用的数据全部加锁,否则不能继续执行。
顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务按照这个顺序封锁。
② 死锁的诊断与解除
死锁的诊断方式:超时法、事务等待图法
超时法;如果一个事务的等待时间超过了规定了时限,认为发生了死锁。
等待图法:用事务等待图动态反映所有事务的等待情况。
事务等待图是一个有向图G=(T,U),T为结点的集合,每个结点表示正运行的事务, U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1、T2之间划一条有向边,从T1指向T2。
解除死锁:撤销一个处理死锁代价最小的事务;释放此事务所有锁,使其它事务能继续运行。
7、并发调度的可串行性
可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同。
可串行性:并发事务正确调度的准则。一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。
7、两段锁协议
定义:指所有事务必须分两个阶段对数据项加锁和解锁。
第一阶段:获得封锁,也称为扩展阶段:
- 事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。
第二阶段:释放封锁,也成为收缩阶段:
- 事务可以释放任何数据项上的任何类型的锁,但是不能申请锁。
注意:事务遵守两段锁协议是可串行化调度,可串行化调度不一定都符合两段锁协议。
两段锁协议与防止死锁的一次封锁法:
·一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,因此一次封锁法遵守两段锁协议。
·两段锁协议并不要求事务必须一次将所有使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。
8、封锁粒度
(1)封锁对象的大小称为封锁粒度
封锁对象可以是逻辑单元(属性值、属性值集合、元组、关系、索引项、数据库),也可以是物理单元(页、物理记录)。
(2)选择封锁粒度的原则:
- 封锁粒度和系统的并发度和并发控制的开销密切相关。
- 封锁的粒度越大,数据库能够封锁的数据的单元就越少,并发度越低,系统开销越小。
- 封锁的粒度越小,数据库能够封锁的数据单元越大,并发度越高,系统开销越大。
7、其他并发控制方法
(1)时间戳方法:给每一个事务盖上一个时标,即事务开始的时间。每个事务具有唯一的时间戳,并按照这个时间戳来解决事务的冲突操作。如果发生冲突操作,就回滚到具有较早时间戳的事务,以保证其他事务的正常执行,被回滚的事务被赋予新的时间戳被从头开始执行。
(2)乐观控制法:不对事务进行特殊的管制,而是让它自由执行,事务提交前再进行正确性检查。如果检查后发现该事务执行中出现过冲突并影响了可串行性,则拒绝提交并回滚该事务。又称为验证方法。
(3)多版本并发控制:在数据库中通过维护数据对象的多个版本信息来实现高效并发的一种策略。
三、数据库备份与恢复
(一)数据库故障的种类
1、事务内部的故障:
① 非预期的,不能由应用程序处理。例如:运算溢出,违反完整性限制等。
② 带来问题:数据库处于不正确状态。
③ 恢复操作;撤销事务(undo)
2、系统故障:
① 称为软故障,是指造成系统停止运转的任何事件、使得系统要重新启动。例如:突然停电。
② 带来问题:数据库缓冲区信息丢失,不破坏数据库;整个系统的正常运行突然被破坏。
③ 发生系统故障时,事务未完成:
恢复策略:强行撤消(UNDO)所有未完成事务。
发生系统故障时,事务已提交,但缓冲区中的信息尚未完全写回到磁盘上:
恢复策略:重做(REDO)所有已提交的事务。
3、其他故障
(1)介质故障:
① 称为硬故障,指外存故障。包括磁盘损坏、磁头碰撞、瞬时强磁场干扰等。
② 带来问题:会破坏数据库或部分数据库,并影响正在存取这部分数据的事务。
③ 恢复:装入数据库发生介质故障前某个时刻的数据副本;重做自此时所有的成功事务。
(2)计算机病毒
① 一种人为的故障或破坏,一种计算机程序;可以繁殖和传播。
② 危害:破坏系统文件和数据
③ 应对策略:查杀病毒,安装防火墙或实时监控软件;根据数据备份文件和日志文件恢复数据库。
(二)数据库备份
恢复操作的基本原理是冗余,即利用存储在系统其他地方的冗余数据来重建破坏的数据。
如何建立冗余数据——备份
1、备份内容:
备份数据(数据转储):表结构、数据库用户、用户定义的数据库对象和全部数据。
备份日志(登记日志文件)
2、备份频率:
通常,数据库一周一次,事务日志每日一次。
3、数据转储
(1)转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用的数据称为后备副本或后援副本。
(2)备份方法:
->静态转储与动态转储
静态转储:在系统中无运行事务时进行的转储操作,转储期间不允许对数据库的任何存取、修改活动。得到的是数据一致性的副本。
优点:实现简单。
缺点:降低了数据库的可用性。
动态专储:转储操作与用户事务并发进行,允许对数据库进行存取或修改。
优点:不会影响事务的运行。
缺点:不能保证副本中的数据正确有效。海量转储与增量转储
->海量转储与增量转储
海量转储:每次转储全部数据库。
增量转储:只转储上次转储后更新过的数据。
海量转储与增量转储比较:
从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便;但如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效。
4、登记日志文件
(1)日志文件的格式和内容
日志文件(log):用来记录事务对数据的更新操作的文件
格式:以记录为单位的日志文件:
事务标识;事务的开始标记;事务的结束标记;事务的所有更新操作(更新前旧值;事务的所有更新操作;更新后新值;)
以数据块为单位的日志文件:记录事务标识、被更新的数据块。
(2)日志文件的作用
进行事务故障恢复
进行系统故障恢复
协助后备副本进行介质故障恢复
(3)登记日志文件
登记的次序严格按照并行事务执行的时间次序;
先写日志文件,后写数据库。
(三)数据库恢复
数据库恢复是指将数据库从错误描述状态恢复到正确的描述状态的过程。
1、事务故障的恢复:
事务故障:事务在运行至正常终止点前被终止。
恢复方法:利用日志文件撤销此事务已对数据库进行的修改。
由系统自动完成,对用户透明。
事务故障的恢复步骤
- 1.反向扫描文件日志,查找该事务的更新操作。
- 2.对该事务的更新操作执行逆操作。
- 3.继续反向扫描日志文件,查找其他更新操作,同样处理。
- 4.直至读到此事务的开始标记,事务故障恢复就完成了。
2、系统故障的恢复
系统故障:未完成事务对数据库的更新已写入数据库;已提交事务的更新还留在数据缓冲区没写入数据库。
恢复方法:撤销故障发生时未完成的事务;重做已完成的事务。
由重新启动时自动完成。
3、介质故障的恢复
需要DBA介入:重装副本
4、数据库恢复技术
(1)具有检查点的恢复技术
(2)数据库镜像
第八章 数据库设计
一、数据库设计概述
(一)设计方法概述
新奥尔良方法:
基于E-R模型的方法(概念设计阶段)
3NF(第三范式)的设计方法(逻辑结构阶段)
面向对象的数据库设计方法:ODL(Object Definition Language)方法
(二)数据库设计的基本步骤
需求分析—概念结构设计—逻辑结构设计—物理结构设计—数据库实施—数据库运行和维护
数据库设计分为:数据库结构设计和数据库行为设计。
结构设计包含:数据库概念结构、逻辑结构和存储结构
行为设计包含:数据库的功能组织和流程控制。
二、数据库需求分析
通过自顶向下、逐步分解的方法分析系统,明确用户需求,确定系统功能。
1、系统可抽象为数据处理流图:
2、数据字典
用途:进行详细的数据收集和数据分析所获得的主要结果。
是关于数据库中数据的描述,在需求分析阶段建立,是进行概念设计的基础,并不断修改、完善。
内容:数据项、数据结构、数据流、数据存储、处理过程。
- 数据项是不可再分的数据单位。例如:{数据项名称:车站代码,别名:stationID,类型长度:char(3),描述:3位字母组成车站唯一编码}
- 数据结构:反映了数据之间的组合关系,一个数据结构可以由若干个数据项或数据结构组成。例如:{数据结构名称:乘客信息,含义说明:定义乘客相关信息,组成:身份证号、姓名、电话}
- 数据流:是数据结构在系统内传输的路径。例如:{数据流名称:车票价格,来源:汽车公司,流向:运价表,数据结构:汽车公司、汽车城市}
- 数据存储:数据结构停留或保存的地方。例如:{数据存储名称:车次表,描述:存储车次实例信息,组成:车次编号,车次计划,出发日期,座位}
- 处理过程:具体处理逻辑一般由判定表或判定树来描述。例如:{处理过程名称:车次管理,输入数据:车次信息,输出数据:车次表}
3、需求规格说明书
在对用户需求分析的基础上,把用户的需求规范化、形式化。
二、数据库结构设计
(一)概念结构设计
1、设计策略:
自底向上:先定义局部应用的概念结构,然后按照一定规则集成起来,从未得到全局概念模型。
自顶向下:先定义全局概念模型,在逐步细化。
自里向外:先定义核心结构,在逐步向外扩展。
混合策略:将自顶向下和自底向上结合起来。
2、重要性:数据库概念设计是整个数据库设计的关键,将在需求分析阶段所得到的应用需求首先抽象为概念结构,以此作为各种数据模型的共同基础,从而能更好地、更准确地用某一DBMS实现这些需求。
3、设计步骤:常用自底向上法。
第一步:抽象数据并设计局部视图;—两个准则
第二步:集成局部视图,得到全局的概念结构。—消除冲突
第三步:验证整体概念结构。—消除不必要的冗余
① 抽象:
抽象是对实际的人事物进行处理,抽取共同特性,并用概念准确描述。
将事物作为属性的基本准则:
作为属性,不能再具有需要描述的性质,属性必须是不可分的数据项,不能包含其他属性;
属性不能与其他实体具有联系,即E-R图中所表示的联系是实体之间的联系
② 局部视图设计
通常以中层数据流图作为设计E-R图的依据。
任务:
将各局部应用涉及的数据分别从数据字典中抽取出来;
参照数据流图,标定各局部应用中的实体、实体的属性、标识实体的码(根据数据字典中数据流来画数据流图);
确定实体之间的联系及其类型( 1:1,1:n,m:n)
4、全局视图的集成
(1)集成方式:
一次集成:一次集成多个分E-R图
逐步集成:用累加的方式一次集成两个E-R图
无论采用哪种方式,每次集成局部E-R图时都需要分两步走:
- 合并。解决各分E-R图之间的冲突,将各分E-R图合并起来生成初步E-R图。
- 修改和重构。消除不必要的冗余,生成基本E-R图。
(2)合并产生的冲突:
属性冲突:包括属性域冲突和属性取值单位冲突,需要协商解决。
命名冲突:包括同名异义和异名同义,需要协商解决。
结构冲突:同一对象在不同应用中具有不同的抽象
同一实体在不同分E-R图中所包含的属性个数和属性排列次序不完全相同
实体之间的联系在不同局部视图中呈现不同的类型。
(3)优化全局E-R模型:实体少,实体属性少,联系间无冗余。
(二)逻辑结构设计
把概念结构设计阶段设计好的基本E-R模型转化为具体的组织层数据模型。
1、E-R图转换为关系模型:
(1)实体的转换原则:一个实体转换为一个关系模型
实体的名称、属性、候选码对应关系模式的名称、属性、候选码。
(2)联系的转换原则:
1:1:可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
1:n:可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
M:n:转换为一个关系模式。实体的属性转化为关系的属性,实体的码转化为关系的码。
三个或三个以上实体间的一个多元联系可以转换为一个关系模式。
具有相同码的关系模式可以合并。
2、数据模型的优化
(1)步骤:确定数据依赖
消除冗余联系
确定所属范式
确定是否合并或者分解
(2)常用分解方法:
水平分解:把(基本)关系的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效率
水平分解的适用范围:
- 满足“80/20原则”的应用
- 并发事务经常存取不相交的数据
垂直分解:把关系模式R的属性分解为若干子集合,形成若干子关系模式
垂直分解的适用范围:取决于分解后R上的所有事务的总效率是否得到了提高
(三)物理结构设计
数据库在物理设备上的存储结构和存取方法称为数据库的物理结构,依赖于特定的数据库管理系统。
DBMS常用存取方法:索引方法(B+树索引方法)、聚簇方法、HASH方法
(1)索引
索引是对数据库表中一或多个列的值进行排序的结构,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,可以先通过索引表找到该行数据对应的物理地址然后访问相应的数据
数据库创建索引的好处:
- 通过创建唯一性的索引,可以保证数据库表中每一行数据的唯一性。
- 加快数据的检索速度。
- 加速表和表之间的连接。
- 加快分组和排序
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引的不利的方面:
- 创建索引和维护索引需要消耗时间
- 索引需要占物理空间,除了数据表占据数据空间之外,每一个索引还要占一定的物理空间。
- 构建索引降低数据表的修改操作(增加,删除和修改)的效率。
时候时候建立索引:
- 主键自动建立唯一索引
- 在经常使用where子句中的列
- 经常需要排序的列
- 经常用于连接的列
- 经常根据范围进行搜索的列
什么时候不建立索引:
- 很少数据值的列(例如:性别)
- 经常增删改的列(检索性能低)
- 有大量重复的列
分类:唯一性索引(在索引列全部数据唯一)、复合索引(一个索引创建在连个或多个列上)、主键索引
(2)聚簇:为了提高某个属性的查询速度,把这个属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块上。
作用:提高按照聚簇码查询的效率;节省存储空间
使用范围:
- 既适合用于单个关系独立聚簇,也适合多个关系组合聚簇
- 当通过聚簇码进行访问或连接是主要应用时。例如:order by,group by,union等子句时。
(3)HASH方法
使用条件:
l 该关系的属性主要出现在等值连接条件中或主要出现在相等比较选择条件中
l 该关系的大小可预知,而且不变;或该关系的大小动态改变,但所选用的DBMS提供了动态HASH存取方法
三、数据库行为设计
(一)功能需求设计:“数据流”的调查分析,“事务处理”过程的调查分析。
(二)功能设计:功能结构图
(三)事务设计
事务处理时计算机模拟人处理事务的过程,包括:输入设计、输出设计、功能设计等。