数据库笔记

第一章:

DML(data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language): DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language): 是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
1.2数据模型
-数据模型是对现实世界数据特征的抽象
-通俗地讲数据模型就是现实世界的模拟
-数据模型应满足三方面要求:
能比较真实的模拟现实世界
容易为人所理解
便于在计算机上实现
数据模型是数据库系统的核心和基础

数据模型分为两类(两个不同的层次)
-概念模型
-逻辑模型和物理模型
信息世界中的基本概念:
-.实体:
客观存在并可相互区别的事物称为实体。
可以是具体的人,事,物或抽象的概念
-.属性:
实体所具有的某一特性称为属性,一个实体可以由若干个属性来刻画
-.码:(Key)
唯一标识实体的属性集称为码
-.实体型:
用实体名及其属性名集合来抽象和刻画同类实体称为实体型
-.实体集:
同一类型实体的集合称为实体集
-.联系:
现实世界中事物内部以及事物之间的联系在信息世界中
反映为实体(型)内部的联系和实体(型)之间的联系。
实体内部的联系:是指组成实体的各属性之间的联系
实体之间的联系:通常是指不同实体集之间的联系
实体之间的联系有一对一(1:1),一对多(1:m)和多对多(m : n)等多种类型
–实体模型的一种表示方法:
实体-联系方式
用E-R图来描述现实世界的概念模型
E-R方法也称为E-R模型
1.2.3数据模型的组成要素:
-数据模型是严格定义的一组概念的集合
精确的描述了系统的静态特性,动态特性和完整性约束条件
-数据模型由三部分组成
数据结构–描述系统的静态特性
数据操作–描述系统的动态特性
完整性约束
–数据结构:~~~~~
–数据操作:
对数据库中各种对象的实例允许执行的操作的集合
包括操作及有关的操作规则
数据操作的类型
查询
更新(包括插入,删除,修改)
数据操作语言
定义数据操作的确切含义,符号,优先级别
实现数据操作的语言
查询语言----
更新语言----
–数据的完整性约束条件
一组完整性规则的集合
完整性规则:给定的数据模型中数据及其联系具有的制约和依存规则
用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确,有效和相容
数据模型对完整性约束条件的定义
反映和规定必须遵守的基本的通用的完整性约束条件。
提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件
1.2.4常用的数据模型
-层次模型
-网状模型
-关系模型
-面向对象数据模型
-对象关系数据模型
-半结构化数据模型
-非结构数据模型,图模型

1.2.7关系模型:
在用户观点下,关系模型中数据的逻辑结构是一张二维表
关系:一个关系对应通常说的一张表
元组:表中的一行
属性:表中的一列即为一个属性,给每一个属性起一个名称即属性名
主码:也称码键,表中的某个属性组,它可以唯一确定一个元组
域:是一组具有相同数据类型的值的集合,属性的取值范围来自某个域
例:学生年龄属性的域(15 - 45),
性别的域是(男,女),
系名的域是一个学校所有系名的集合:
分量:元组中的一个属性值。
关系模式:对关系的描述
关系名(属性1,属性2,…,属性n)
学生(学号,姓名,年龄,性别,系名,年龄)
关系必须是规范化的,满足一定的规范条件
最基本的规范条件:关系的每一个分量必须是一个不可分的数据项,不允许表中还有表。
关系模型的操纵与完整性约束
数据操作是集合操作,操作对象和操作结果都是关系
查询,插入,删除,更新
关系的完整性约束条件
实体完整性
参照完整性
(上述二者是关系的两个不变性)
用户定义的完整性

1.3数据库系统的结构
1.4数据库系统的组成
-数据库管理员 DBA

第二章:关系数据库

关系模型(关系数据结构)
-单一的数据结构—关系
 现实世界的实体以及实体间的各种联系均用关系来表示
 概念介绍:
   *域是一组具有相同数据类型的值的集合。例如 整数,实数,介于某个取值范围的整数等等
   *笛卡尔积
    概念:给定一组域D1,D2,…,Dn,允许其中某些域是相同的。
      D1,D2,…,Dn的笛卡尔积为:
      D1 X D2 X … X Dn={(d1,d2,…,dn)| di 属于Di, i = 1,2,…,n}
所有域的所有取值的任意组合
      笛卡尔积可以看着是关系的”域“。
    基数:
    表示方法:
      笛卡尔积可表示为一张二维表
      表中的每行对应一个元组,表中的每列对应一个域
    关系:D1 X D2 X … X Dn的 子集 叫做在域D1,D2,…,Dn上的关系,表示为
       R(D1,D2,...,Dn)
       R:关系名
       n:关系的目或度
    元组:关系中的每个元素(d1,d2,…,dn)叫作一个n元组或简称元组,通常用t表示
    属性:关系中不同的列可以对应相同的域
       为了加以区分,必须对每列起一个名字,称为属性
       n目关系必有n个属性
    码 :
       候选码:
        若关系中的某一属性组的值能唯一的标识一个元组,则称该属性组为候选码
        简单的情况:候选码只包含一个属性
       全码:
        最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码
       主码:
        若一个关系有多个候选码,则选定其中一个为主码
       主属性:
        候选码的诸属性称为主属性
        不包含在任何候选码中的属性称为非主属性或者非码属性
    单元关系与二元关系:
      当n=1时,称该关系为单元关系或一元关系
      当n=2时,称该关系为二元关系
    基本关系的性质:
      1.列是同质的
      2.不同的列可出自同一个域
      3.列的顺序无所谓,列的次序可以任意交换
      4.任意两个元组的候选码不能相同
      5.行的顺序无所谓,行的次序可以任意交换
      6.分量必须取原子值(规范条件中最基本的一条)

第三章

什么是关系模式?
关系模式是型
关系是值
关系模式是对关系的描述
  元组集合的结构
    属性构成
    属性来自的域
    属性与域之间的映像关系
  完整性约束条件
定义关系模式:
关系模式可以形式化的表示为:
R(U,D,DOM,F)
R 关系名
U 组成该关系的属性名集合
D U中属性所来自的域
DOM 属性向域的映像集合
F 属性间数据的依赖关系的集合 
关系模式与关系的“关系”
关系模式:
  对关系的描述
  静态的,稳定的
关系:
  关系模式在某一时刻的状态或内容
  动态的,随时间不断变化的
关系模式和关系往往笼统称为关系

关系模型(关系完整性约束)
实体完整性和参照完整性
 关系模型必须满足的完整性约束条件称为关系的两个不变性,应该由关系系统自动支持
  实体完整性详解:
    关系的主属性不能取空值
    选修(学号,课程号,成绩)
    学号,课程号为主码
    因此二者不能为空
  参照完整性详解:
    在关系模型中实体及实体间的联系都是通过关系来描述的,自然存在着关系与关系间的引用:
    学生实体,专业实体
    学生(学号,姓名,性别,专业号,年龄)
    专业(专业号,专业名)
    学生关系引用了专业关系的主码“专业号”。
    学生关系中的“专业号”值必须是确实存在的专业的专业号
    另一个例子:学生,课程,学生与课程之间的多对多联系
    学生(学号,姓名,性别,专业号,年龄)
    课程(课程号,课程名,学分)
    选修(学号,课程号,成绩)
    选修实体中的学号与课程号应该参照学生中的学号,与课程中的课程号
    学号 和 课程号 是选修关系的外码
    学生关系和课程关系均为被参照关系
    选修关系为参照关系
    又一个例子:
    学生实体及其内部的一对多联系
    学生(学号,姓名,性别,专业号,年龄,班长)
    学号是主码,“班长”是外码,它引用了本关系的”学号“
    ”班长“必须是确实存在的学生的学号
    学生关系既是参照关系也是被参照关系
    外码:
     设F是基本关系R的一个或一组属性,但不是关系R的码。(非主属性)
      如果F与基本关系S的主码Ks相对应,则称F是R的外码
     基本关系R称为参照关系
     基本关系S称为被参照关系或目标关系
     前面的例子中:学生关系的”专业号“与专业关系的主码”专业号“相对应
     ”专业号“属性是学生关系的外码
     专业关系是被参照关系,学生关系为参照关系
    参照完整性规则:
    若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S可以是相同的关系)
    则对于R中每个元组在F上的值必须为:
     或者取空值(F的每个属性值均为空值)
     或者等于S中某个元组的主码值
用户定义的完整性
 应用领域需要遵循的约束条件,体现了具体领域中的语义约束

关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
关系代数
运算对象是关系
运算结果亦为关系
关系代数的运算符有两类:集合运算符和专门的关系运算符
集合运算符:并,差,交,笛卡尔积
专门的关系运算符:选择,投影,连接,除。
一些记号:
(1)t[Ai] 表示元组t中相应于属性Ai的一个分量
(2)A,t[A],A, A = {Ai1,Ai2,Ai3,…,Aik},其中Ai1Ail是A1An中的一部分,则A称为属性列或属性组
t[A] = (t[Ai1],t[Ai2],…,t[Aik])表示元组t在属性列A上诸分量的集合
A 则表示{A1,A2,…,An}中去掉{Ai1,Ai2,…,Aik}后剩余的属性组
(3)tr^ts(真实的符号应该是一个弧线) R为n关系,S为m目关系,tr属于R,ts输入S,tr^ts称为元组的连接。
tr^ts是一个n + m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组
(4)象集Zx
给定一个关系R(X,Z),X和Z为属性组。
当t[X] = x时,x在R中的象集为:
Zx = {t[Z]|t属于R,t[X] = x}
它表示R中属性组X上值为x的诸元组在Z上分量的集合
e.g:
R
x1 z1
x1 z2
x1 z3
x2 z2
x2 z3
x3 z1
x3 z3
x1在R中的象集 Zx1 = {Z1,Z2,Z3},
x2在R中的象集 Zx2 = {Z2,Z3},
x3在R中的象集 Zx3 = {Z1,Z3}
传统:
1.R并S:仍为n目关系,由属于R或属于S的元组组成 R并S = {t|t 属于R V t 属于 S}
2.R-S: 仍为n目关系,由属于R而不属于S的所有元组组成 R - S = {t| t 属于 R 且 t 不属于S }
3.交运算
4.笛卡尔积
专门:
1.选择:{t|t属于R且F(t) = ‘真’}
F:选择条件,是一个逻辑表达式,取值为‘真’或‘假’,判断符号可以是 > , >= , < , <= , = 或<>
是针对行的操作
2.投影:从R中选择出若干属性列组成新的关系,是针对列的操作
投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
3.连接:含义:
从两个关系的笛卡尔积中选取属性值满足一定条件的元组
连接运算从R和S的广义笛卡尔积R X S中选取R关系在A属性组上的值与S关系在
B属性组上的值满足比较关系o的元组

关系演算:以数理逻辑中的谓词演算为基础
按谓词变元不同进行分类:
1.元组关系演算:
以元组变量作为谓词变元的基本对象
元组关系演算语言ALPHA
2.域关系演算:
以域变量作为谓词变元的基本对象
域关系演算语言QBE
3.3数据的定义:
1.定义模式:
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>
如果没有指定<模式名>,那么<模式名>隐含为<用户名>。
要创建模式,调用该命令的用户必须拥有数据库管理员权限 ,或者获得了数据库管理员授予的 CREATE SCHEMA
3.4数据查询
SELECT [ALL|DISTINCT] <目标列表达式>。。。。
FROM
[WHERE]
[GROUP BY] [HAVING<条件表达式>]
[ORDER BY][ASC|DESC]
单表查询
1.选择表中的若干列
-查询指定列
SELECT SNO,SNAME
FROM STUDENT
-查询全部列
SELECT *
FROM STUDENT
-查询经过计算的值
SELECT SANME,2014-SAGE
FROM STUDENT
2.选择表中的若干元组
-消除取值重复的行
查询结果里面包含了很多重复的行,如果去掉结果表中的重复行,必须指定DISTINCT
DISTINCT :
SELECT DISTINCT SNO
FROM SC
-查询满足条件的元组
–>比较大小
用于进行比较的运算符一般包括 = (等于),>(大于),< (小于),>= (大于等于), <= (小于等于),!= 或 <> (不等于) , !> (不大于),!<(不小于)
E.G:
SELECT SNAME
FROM STUDENT
WHERE SDEPT = ‘CS’
E.G:
查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < 20
E.G:
查询考试成绩不及格的学生的学号
SELECT DISTINCT Sno
FROM SC
WHERE Grade < 60
–>确定范围
谓词 BETWEEN…AND 和 NOT BETWEEN … AND …可以用来查找属性值在(或不在)指定范围内的元组。
BETWEEN 后面跟的是下限 AND 后面跟的是 上限。
E.G:
查询年龄在20到23岁(包括20岁和23岁)之间的学生姓名,系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23
–>确定集合
谓词 IN 可以用来查找属性值属于指定集合的元组
与IN 相对的谓词是 NOT IN,用于查找属性值不属于指定集合的元组。
E.G:
查询不是计算机,数学,信息系的学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN (‘CS’,‘MA’,‘IS’)
–>字符匹配
谓词LIKE可以用来进行字符串的匹配
格式:
[NOT] LIKE’<匹配串>’ [ESCAPE‘<换码字符>’]
其含义是查找指定的属性列值与<匹配串>相匹配的元组。
<匹配串>可以是一个完整的字符串,也可以含有通配符% 和 _。
%代表任意长度的字符串,例如a%b 表示以a开头,以b结尾的任意长度的字符串。如 acb,addgb都是符合条件的
_代表任意单个字符,例如a_b, 表示以a开头,b结尾的,长度为3的任意字符串。

在一些场合 可用 = 取代LIKE, != 或 <> 取代 NOT LIKE
E.G:
查询所有姓刘的学生的姓名,学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
E.G:
查询姓“欧阳”且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE‘欧阳_’;
注意:数据库字符集为ASCII时一个汉字需要两个_;当字符串为GBK时只需要一个_。
E.G:
查询名字中第二个字为’阳’的学生的姓名和学号
SELECT Sname,Ssno
FROM Student
WHERE Sname LIKE ‘_阳%’;
E.G:
查询所有不姓刘的学生的姓名,学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE ‘刘%’

特殊情况:用户要查询的字符串本身就含有通配符 % 或 _ ,这时就要使用 ESCAPE ‘<换码字符>’ 短语对通配符进行转义了。
E.G:
查询 DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB_Design’ ESCAPE’’ ;
E.G:
查询以”DB_“开头,且倒数第三个字符为i的课程的详细情况。
FROM Course
WHERE Cname LIKE’DB_%i__’ ESCAPE’';
–> 涉及空值的查询
背景介绍:
某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。
E.G:
查询缺少成绩的学生的学号和相应的课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
注意:这里的 IS 不能用 = 代替
E.G:
查询所有有成绩的学生学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
–>多重条件查询
逻辑运算符 AND 和 OR 可用来连接多个查询条件。AND 的优先级高于 OR,可用括号改变优先级
这里举例子就简写了
WHERE Sdept = ‘CS’ AND Sage < 20;
WHERE Sdept = ‘CS’ OR Sdept = ‘MA’
IN 谓词实际上是多个 OR 运算符的缩写
3.ORDER BY 子句
对查询结果按照一个或多个属性列的升序或者降序,默认为升序
–> ASC 升序
–> DESC 降序
对于空值,排序时显示的次序由具体系统实现来决定。
例如按升序排,含空值的元组最后显示,按降序排,空值的元组则最先显示。各个系统的实现可以不同,只要保持一致就行
E.G:
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
4.聚集函数
COUNT() 统计元组个数
-COUNT([DISTINCT | ALL]<列名>) 统计一列中值的个数
-SUM([DISTINCT | ALL]<列名>) 计算一列值的总和(此列必须是数值型)
-AVG([DISTINCT | ALL]<列名>) 计算一列值的平均值(此列必须是数值型)
-MAX([DISTINCT | ALL]<列名>) 求一列值中的最大值
-MIN([DISTINCT | ALL]<列名>) 求一列值中的最小值
如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT 短语或指定ALL短语,则表示不取消重复值
E.G:
查询学生总人数。
SELECT COUNT(
)
FROM Student;
E.G:
查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
在这项统计里面一定要使用DISTINCT 语句, 因为一个学生可以选多门课
E.G:
计算选修1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno = ‘1’
E.G:
查询学生 2012 选修课程的总学分数。
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno=‘2012’ AND SC.Cno = Course.Cno;
当聚集函数遇到空值时,除COUNT()外,都跳过空值而只处理非空值。COUNT()
是对元组进行计数,某个元组的一个或部分列取空值不影响COUNT的统计结果。
注意:WHERE 子句中是不能用聚集函数作为条件表达式的,聚集函数只能用于SELECT 子句和GROUP BY 中的HAVING 子句。
5.GROUP BY 子句(分组)
GROUP BY 子句将查询结果按某一列或多列的值分组,值相等的为一组。
对查询结果分组的目的是为了细化聚集函数的作用对象。
如果没有对查询结果进行分类,那么聚合函数就作用于整个查询结果,分组后聚集函数将作用于每一个组,
即每一组都有一个函数值。
E.G:
求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno
得到的表见书上98页
E.G:
查询选修了三门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT() > 3;
E.G:
查询平均成绩大于等于90分的学生学号和平均成绩。
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade) >= 90
3.4.2 连接查询
1.等值与非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为
[<表名 1> . ] <列名 1><比较运算符>[<表名 2> . ] <列名 2>
其中比较运算符主要有 =,> , < , >= , <=, !=(或 <> ) 等。
此外连接谓词还可以使用下面形式:
[<表名 1>.]<列名 1> BETWEEN [<表名 2> . ]<列名 2> AND [<表名 2> .]<列名 3>
当连接谓词中的列名称为 = 时,称为 等值连接。使用其他运算称为非等值连接。
连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同。
SELECT Student.
,Sc.*
FROM Student,SC
WHERE Student.Sno = SC.Sno;
注意:如果属性名在参加连接的各表中是唯一的,则可以省略表名前缀。
注意:嵌套循环连接算法,在两表连接中运用到,类似于两重for循环
注意:若在等值连接中把目标列中重复的属性列去掉则为自然连接
2.自身连接
一个表与其自己进行连接,称为表的自身连接。
E.G
查询一门课的间接先修课(先修课的先修课)
分析:
在Course表中只有每门课的直接先修课信息,而没有先修课的先修课。
要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号查找它的先修课程。
这就要将Course表与其自身连接
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
3.外连接
背景:想把每一位同学的选课情况列出来,但是存在同学没有选课
仍要把Student的悬浮元组保存在结果关系中,而在SC表的属性上填写NULL
这时就需要外连接
4.多表查询
连接操作除了可以是两表连接,也可以是多表连接。
3.4.3嵌套查询
一个SELECT - FROM - WHERE 称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
E.G:
SELECT Sname
FROM Student
WHERE Sno IN
(
SELECT Sno
FROM SC
WHERE Cno =‘2’
);
SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。
需要特别指出的是,子查询的SELECT语句中不能使用ORDER BY 子句,ORDER BY 子句只能对最终查询结果排序
1.带有IN谓词的子查询
子查询的查询不依赖于父查询称为不相关子查询。
子查询的查询条件依赖于父查询,称为相关查询,整个查询语句称为
E.G:
查询与刘晨在同一个系学习的学生
SELECT Sno,Sname,S,dept
FROM Student
WHERE Sdept IN
(
SELECT Sdept
FROM Student
WHERE Sname = ‘刘晨’
);
也可用自身连接来完成
SELECT S1.Sno,S1.name,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND S2.Sname = ‘刘晨’;

2.带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接
E.G:
找到每个学生超过他自己选修课程平均成绩的课程号。
SELECT Sno,Cno
FROM SC x
WHERE Grade >= (
SELECT AVG(Grade)
FROM SC y
WHERE y.Sno = x.Sno
);
3.带有ANY(SOME)或ALL谓词的子查询

ANY 大于子查询结果中的某个值
ALL 大于子查询结果中的所有值
<ANY 小于子查询结果中的某个值
<ALL 小于子查询结果中所有所有值
=ANY 大于等于子查询结果中的某个值
=ALL 大于等于子查询结果中的所有值
<=ANY 小于等于子查询结果中的某个值
<=ALL 小于等于子查询结果中的所有值
=ANY 等于子查询结果中的某个值
=ALL等于子查询结果中的所有值
!=(或<>) ANY 不等于子查询结果中的某个值
!=(或<>) ALL 不等于子查询结果中的任何一个值
E.G:
查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY(SELECT Sage
FROM Student
WHERE Sdept = ‘CS’)
AND Sdept <> ‘CS’;
4.带有EXISTS谓词的子查询
EXISTS 代表存在量词 ,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值”true“ 或者逻辑假值”false“。
E.G:
查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(
SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = ‘1’
);
使用存在量词 EXISTS 后,若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。
由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或者假值,给出列名无意义
与之对应的是 NOT EXISTS 用法类似。
3.4.4集合查询
SELECT 语句的查询结果是元组的集合,所以多个SELECT 语句的结果课进行集合操作。集合操作主要包括并操作 UNION,交操作 INTERSECT
和差操作 EXCEPT.
注意,参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
E.G:
查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept = ‘CS’
UNION
SELECT *
FROM Student
WHERE Sage<=19;
使用UNION将多个查询结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则用 UNION ALL 操作符。
查询选修了课程1或者选修了课程2的学生。
SELECT Sno
FROM SC
WHERE Cno = ‘1’
UNION
SELECT Sno
FROM SC
WHERE Cno = ‘2’;
查询计算机科学系的学生与年龄不大于19岁的学生的交集。
SELECT *
FROM Student
WHERE Sdept = ‘CS’
INTERSECT
SELECT*
FROM Student
WHERE Sage <= 19;
查询计算机科学系的学生与年龄不大于19岁的学生的差集。
SELECT *
FROM Student
WHERE Sdept = ‘CS’
EXCEPT
SELECT *
FROM Student
WHERE Sdept = ‘CS’ AND Sage > 19;
这也等价于查询计算机科学系中年龄大于19岁的学生。

3.4.5基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象。
E.G:
找出每个学生超过他自己选修课程平均成绩的课程号。
SELECT Sno,Cno
FROM SC,(SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno AND SC.Grade>=Avg_sc.avg_grade;
这里FROM子句中的子查询将生成一个派生表 Avg_sc.该表由avg_sno 和 avg_grade两个属性组成,记录了每个学生的学号及平均成绩。
主查询将SC表与Avg_sc按学号相等进行连接,选出选修课成绩大于其平均成绩的课程号。

如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT 子句后面的列名为其默认属性。
E.G:
SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno = ‘1’) AS SC1
WHERE Student.Sno = SC1.Sno;
需要说明的是,通过FROM子句生成派生类时,AS关键字可以省略,但必须为派生关系指定一个别名。
3.4.6SELECT语句的一般格式

3.5数据更新
3.5.1 插入数据
-插入元组
E.G:
将一个新学生元组,插入到Student表中。
INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES(‘2013222’,‘name’,‘sex’,‘sdept’,age)
或者
INSERT INTO Student
VALUES(‘2013222’,‘name’,‘sex’,‘sdept’,age)
-插入子查询结果
(1)先创建一个新表
CREATE TABLE Dept_age (Sdept CHAR(15),Avg_age SMALLINT);
(2)插入子查询结果:
INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept ,AVG(Sage)
FROM Student
GROUP BY Sdept;
3.5.2修改数据
1.修改某一元组的值
将学生201215121 的年龄修改为22岁
UPDATE Student
SET Sage = 22
WHERE Sno = ‘201215121’;
2.修改多个元组的值
将所有学生年龄增加一岁。
UPDATE Student
SET Sage = Sage + 1;
3.带子查询的修改语句
将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade = 0
WHERE Sno IN
(
SELECT Sno
FROM Student
WHERE Sdept = ‘CS’
);
3.5.3 删除数据
1.删除某一个元组的值
删除学号为201215128的学生记录
DELETE
FROM Student
WHERE Sno = ‘201215128’;
2.删除多个元组的值
DELETE
FROM SC;
3.带子查询的删除语句
删除计算机科学系所有学生的选课记录。
DELETE
FROM SC
WHERE Sno IN
(
SELECT Sno
FROM Student
WHERE Sdept = ‘CS’
);
3.6空值的处理
1.空值的产生
2.空值的判断
用 IS NULL 或 IS NOT NULL 来表示。
E.G:
SELECT *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL
3.空值的约束条件
4.空值的算术运算,比较运算和逻辑运算
3.7视图
视图的特点:
虚表,是从一个或几个基本表(或视图)导出的表
只存放视图的定义,不存放视图对应的数据
基表中的数据发生变化,从视图中查询出的数据也随之改变
定义视图

第四章

4.1.1数据库的不安全因素
-非授权用户对数据库的恶意存取和破坏
-数据库中重要或敏感的数据被泄露
-安全环境的脆弱性
4.1.2安全标准简介:
信息安全标准的发展历史 p135
4.2数据库安全性控制
计算机系统中,安全措施是一级一级层层设置
用户 <-> DBMS <-> OS <-> DB
用户标识和鉴别 数据库安全保护 操作系统安全保护 数据密码存储
系统根据用户标识鉴定用户身份,合法用户才准许进入计算机系统
4.2.3自主存取控制(简称DAC)
-用户对不同的数据对象有不同的存取权限
-不同的用户对同一对象也有不同的权限
-用户还可将其拥有的存取权限转授给其他用户
-通过SQL的GRANT语句和REVOKE语句实现
关系数据库系统中存取控制对象
对象类型 对象 操作类型
数据库模式 模式 CREATE SCHEMA
基本表 CREATE TABLE,ALTER TABLE
视图 CREATE VIEW
索引 CREATE INDEX
数据 基本表和视图 SELECT,INSERT,UPDATE,DELETE,REFERENCES,ALL,PRIVILEGES
属性列 SELECT,INSERT,UPDATE,REFERENCES,ALL,PRIVILEGES
4.2.4
权限授予:GRANT(不允许循环授权)
发出GRANT:
-数据库管理员
-数据库对象创建者(即属主Owner)
-拥有该权限的用户
接受权限的用户:
-一个或多个具体用户
-PUBLIC(即全体用户)
权限回收:REVOKE
授予的权限可以由数据库管理员或其他授权者用REVOKE语句回收
4.2.5数据库角色的引入
1.角色的创建
CREATE ROLE<角色名>
2.给角色授权
GRANT<权限>[,<权限>]…
ON<对象类型>对象名
TO<角色>[,<角色>]…
3.将一个角色授予其他的角色或用户
4.角色权限的收回:REVOKE
REVOKE执行者是:
-角色的创建者
-拥有在这个角色上的ADMIN OPTION
4.2.6强制存取控制方法
强制存取控制(MAC)
保证更高程度的安全性

第五章

第六章

1.函数依赖
设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能
的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等则称为
“X函数确定Y ”或“Y函数依赖于X”,记作X->Y.
-X称为这个函数依赖的决定属性组,也称为决定因数
-Y不函数依赖于X,则记为X!->Y。
如何确定函数依赖:
-函数依赖是语言范畴的概念。只能根据数据的语义来确定函数依赖。
Sname -> Sno 函数依赖只有在“学生不允许有重名”的条件下成立
-数据库设计者可以对现实世界作强制的规定(强制规定不允许学生有重名)
2.平凡函数依赖与非平凡函数依赖
-x->y ,y 不是 x 的子集,则称x -> y 是非平凡的函数依赖。(Sno,Cno)-> Grade
-x->y,但是 y 是 x 的子集,则称为x -> y是平凡的函数依赖。(Sno,Cno) -> Sno
对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,因此若不特别声明,
我们总是讨论非平凡函数依赖。
3.完全函数依赖与部分函数依赖
在关系模式R(U)中,如果X->Y,并且对于X的任何一个真子集X’,X’!->Y,则称为Y完全函数依赖于X
反之为部分函数依赖于X.
F p
完全函数依赖 X -> Y 部分函数依赖 X -> Y
(Sno,Cno) -> Grade 就是完全函数依赖
(Sno,Cno) -> Sdept 就是部分函数依赖,因为Sno - > Sdept

4.传递函数依赖
在R(U)中,如果X -> Y,(Y 不是 X的子集),Y!->X,Y ->Z,则称为Z对X传递函数依赖
如果 Y->X, 即X <-> Y,则Z直接依赖于X。
传递
X -> Z

6.2.2码 F
设K为关系模式 R<U,F>中的属性或属性组合。K->U,则K称为R的一个候选码
-如果U部分函数依赖于K,则K称为超码
-候选码是最小的超码,即K的任意一个真子集都不是候选码(码)
若关系模式R有多个候选码,则选定其中的一个作为主码
主属性与非主属性
-包含在任何一个候选码中的属性,称为主属性
-不包含在任何码中的属性称为非主属性或非码属性
全码:整个属性组是码,称为全码
外部码:前面有描述
################################################################
判断候选码:
闭包的判断:
闭包就是由一个属性直接或间接推导出的所有属性的集合,例如: f={a->b,b->c,a->d,e->f} ,由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}。
例:设关系R(A,B,C, D,E, G)有函数依赖集F={AB→C, BC→AD,D→E, CG→B},求AB的闭包。
解:首先从AB出发,令X={A,B},由于函数依赖AB→C左边的所有属性都在X中,所以可以把右边的C添加到X中,这时X={A, B,C},其次考虑函数依赖BC→AD,左边B,C均在X中,右边D不在X中,将其添加到X中,此时X={A,B,C,D}。
再考虑函数依赖D→E,同理可将E添加到X中,此时x={A,B,C,D,E}。上述方法再不能向X中添加属性,所以得到{A,B} +={A,B,C,D, E}。
1.如果有属性只在函数依赖集的左边出现,则该属性一定包含在候选码中(继续求它的闭包,如果他的闭包是属性全集,则为候选码,如果不是,则需要结合其他属性求闭包,继而判断是否是候选码)

2.只在函数依赖集右边出现的属性,一定不属于候选码

3.对于左右都出现过的属性:
(1)先结合只在左边出现的属性求闭包,看看是否包括所有属性,如果他的闭包是属性全集,则为候选码;
(2)如果没有包括所有属性,就结合其他左右都出现的求闭包,看看是否包括所有属性,如果他的闭包是属性全集,则为候选码
4.如果有属性不在函数依赖集中出现(外部属性),那么一定包含在候选码中(继续求它的闭包,如果他的闭包是属性全集,则为候选码,如果不是,则需要结合其他属性求闭包,继而判断是否是候选码)
另外
如果有属性或者属性组能唯一标识元组,则他就是候选码(定义)
##################################################################
6.2.3范式
-范式是符合某一种级别的关系模式的集合
-关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式
-范式的种类:
第一范式1NF
第二范式2NF
第三范式3NF
BC范式 BCNF
第四范式4NF
第五范式5NF
-各种范式之间存在联系:
1NF >(包含) 2NF >(包含) 3NF > (包含) > BCNF > (包含) > 4NF
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这个过程就叫 规范化。

1NF的定义:
如果一个关系模式R的所有属性都是不可分的基本数据项,则R属于1NF.
(第一范式是对关系模式的最起码的要求,不满足第一范式的数据库模式不能称为关系数据模式)
满足第一范式的关系模式并不一定是一个好的关系模式:
e.g
2NF的定义:
关系模式是1NF,并且每一个非主属性都完全依赖于R的码,则R是2NF
如果一个关系模式不是2NF会产生的问题:
(1)插入异常:见课本。
(2)删除异常:
(3)数据冗余度大
(4)修改复杂
就可以采用投影分解法,把S-L-C 分解为两个关系模式,就可以消除部分函数依赖
这样非主属性对码都是完全函数依赖了上述四个问题也得到了一定的解决
第三范式:
存在非主属性对于码的传递依赖
(1)插入异常
(2) 删除异常
(3)冗余度大
(4)修改复杂
关系模式R<U,F>属于1NF,若R中不存在这样的码X,属性组Y及非主属性Z(Z不属于Y),使得 X -> Y ,Y -> Z, X 不依赖于 Y ,成立则称R<U,F>是三范式
-3NF的一些性质:
若R是三范式,则R的每一个非主属性既不部分函数依赖于候选码也不传递依赖于候选码
如果R是三范式,则R也是二范式
采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF原2NF关系中存在的插入异常删除异常,数据冗杂度大
修改复杂等问题
将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余
BCNF:设关系模式R<U,F>是1NF,如果对于R的每个函数依赖X->Y,且X不包含于Y,X必含有码,那么R就是BCNF。
   即,在关系模式R<U,F>中,如果每一个决定因素都包含码,则R是BCNF。
BCNF性质:
1.所有非主属性对每一个码都是完全函数依赖。
2.所有主属性对每一个不包含它的码也是完全函数依赖。
3.没有任何属性完全函数依赖于非码的任何一组属性。
如果关系模式R是BCNF,必定有R是3NF
如果关系模式R是3NF,不一定有R是BCNF
如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了操作异常诸多问题。

规范化小结:
一个关系模式只要其分量都是不可分的数据项,它就是规范化的关系模式,但这只是最基本的规范化
规范化程度过低的关系模式不一定能够很好地描述现实世界,可能会存在插入异常,删除异常,修改复杂,数据冗杂等问题,解决方法就是对其进行规范化,转换成高级范式
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。
关系数据库的规范化理论是数据库逻辑设计的工具。
  消除非主属性对码的部分函数依赖
1NF         ->       2NF    
  消除非主属性对码的传递函数依赖
2NF  -> 3NF 
  消除主属性对码的部分和传递函数依赖
3NF         -> BCNF
  消除非平凡且非函数依赖的多值依赖
BCNF        ->        4NF
6.3数据依赖的公理系统
数据依赖的公理系统是模式分解算法的理论基础
函数依赖的一个有效而完备的公理系统-Armstrong公理系统
 从一组函数依赖求得蕴含的函数依赖。例如问X->Y是否被F所蕴含
 求给定关系模式的码。
逻辑蕴含
  对于满足一组函数依赖F的关系模式R<U,F>,其任何一个关系r,若函数依赖x->Y都成立
  (即r中任意两元组t,s,若t[X] = S[X],则t[Y]= S[Y]),则称F逻辑蕴含 X -> Y .
Armstrong公理系统
设u为属性集总体,F是U上的一组函数依赖,于是有关系模式R<U,F>.
对R<U,F>来说有以下的推理规则:
A1.自反律:若Y是X的子集,然后X是U的子集,则X->Y为F所蕴含。
A2.增广律:若X->Y为F所蕴含,且Z是U的子集,则XZ->YZ为F所蕴含。
A3.传递律:若X->Y及Y->Z为F所蕴含,则X->Z为F所蕴含。
导出规则:
1.根据A1,A2,A3这三条推理规则可以得到下面三条规则:
合并规则:由X->Y,X->Z,有X->YZ.
伪传递规则:由X->Y,WY->Z,有XW->Z.
分解规则:由X->Y及Z是Y的子集,有X->Z
2.根据合并规则和分解规则,可得引理6.1
引理6.1 X->A1A2…Ak成立的充分必要条件是X->Ai成立(i = 1,2,…,k).

函数依赖闭包:F+ 在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作F的闭包,记为F+.

X关于函数依赖集F的闭包Xf+:
设F为属性集U上的一组函数依赖,X是U的子集,X(F+) = {A|X ->A 能由F根据Armstrong公理导出},X(F+)称为属性集X关于函数依赖集F的闭包

函数依赖集等价定义:
如果 G+ = F+,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
两个依赖集等价是它们的闭包等价。

-如果函数依赖集F满足下列条件,则称F为一个最小依赖集。
1.F中任一函数依赖的右部仅含有一个属性
2.F中不存在这样的函数依赖X->A,使得F与F-{X->A}等价。(即F中的函数依赖均不能由F中其他函数依赖导出)
3.F中不存在这样的函数依赖X->A,X有真子集Z使得F-{X->A}∪{Z->A}与F等价(F中各属性依赖左部均为最小属性集(不存在冗余属性))、
e.g:求最小函数依赖集方法:
R<U,F>,U = ABCD
函数依赖集 F = {A -> BD,AB ->C,C -> D}.
求:F最小函数依赖集
解法步骤:
1.将F中的所有函数依赖右边化为单一属性
F={A->BD,AB->C,C ->D}
F = {A->B,A->D,AB->C,C->D}
2.去掉F中的所有函数依赖左边的冗余属性
此处只需考虑AB->C即可
A+ = {A,B,C,D}
因为A已经满足可以推导出全集U
所以B是冗余的
3.去掉F中所有冗余的函数依赖关系
F = {A->B,A->D,A->C,C->D}
去掉某个函数依赖,仍然存在码那么该函数依赖就是冗余的

F的最小依赖集Fm不一定是唯一的
它与对各函数依赖FDi及X->A中X各属性的处置的顺序有关。
6.4模式的分解:
6.4.1模式分解的3个定义:
模式分解:(关系模式的规范化过程是通过对模式的分解来实现的)
三定义:
-把低一级的关系分解为若干个高一级的关系模式并不是唯一的
-在这些分解方法中,只有能够保证分解后的关系模式与原关系模式等价的方法才有意义
-从不同的角度去观察问题,对“等价”的概率形成了3种不同的定义:
1.分解具有无损连接性
2.分解要保持函数依赖
3.分解既要保持函数依赖,又要具有无损连接性
这三个定义是实行模式分解的三条准则。

第七章,数据库设计:

狭义数据库设计:是数据库应用系统设计的一部分
什么是数据库设计:对于一个给定的应用环境,设计一个优良的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据处理要求:
信息管理要求:在数据库中存储和管理需要的数据对象
数据处理要求:对数据对象需要进行的处理,如查询,增删改,统计和分析等

7.1.1数据库设计的特点:
1.数据库建设的基本规律
-三分技术,七分管理,十二分基础数据
-管理
-基础数据:数据的收集,整理,组织和不断更新
2.结构(数据)设计和行为(处理)设计相结合
-将数据库结构设计和数据处理设计密切结合
-传统的软件工程:重行为设计
-早期的数据库设计:重结构设计
7.1.2数据库设计方法:
1.要求多方面的知识和技术
2.手工设计法
3.规范设计法
-典型方法-新奥尔良方法
4.基于E-R模型的设计方法
5.3NF的设计方法
6.ODL方法(面向对象的数据库设计方法)
7.UML方法(面向对象的建模方法)
数据库设计工具:
SYBASE PowerDesigner (UMl工具)

7.1.3数据库设计的基本步骤
数据库设计分6个阶段:
1.需求分析
数字字典,全系统中数据项,数据结构,数据流,数据存储的描述
2.概念结构设计
E-R图
3.逻辑结构设计
某种数据模型
关系 与 非关系模型
4.物理结构设计
存储安排,存取方法选择,存取路径建立
5.数据库实施
创建数据库模式,装入数据,数据库试运行
6.数据库运行和维护
性能监测,转储、恢复,数据库重组和重构
7.2需求分析:
什么是需求分析–分析用户的要求
-是设计数据库的起点
需求分析的重要性
-结果是否准确地反映了用户的实际要求,将直接影响到后面各个
阶段的设计,并影响到设计结果是否合理和实用
需求分析常常被忽视
7.2.1需求分析的任务
-充分了解原系统工作概况
-详细调查要开发应用系统的组织/部门/企业等
-明确用户的各种需求
确定新系统的功能
注意:新系统今后可能的扩充和改变。
7.2.2需求分析的方法
7.2.3数据字典
什么是数据字典?
数据字典是关于数据库中数据的描述,称为元数据。
它不是数据本身,而是数据的数据。
-数据字典在需求分析阶段建立,在数据库设计过程中不断修改,充实,完善。
-数据字典是进行详细的数据收集和分析所获得的主要结果
1.数据字典的内容:
-数据项
-数据结构
-数据流
-数据存储
-处理过程
》数据项是数据的最小组成单位
》若干个数据项可以组成一个数据结构
》通过对数据项和数据结构的定义来描述数据流,数据存储的逻辑内容
》数据项描述=
{数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值含义,
与其他数据项的逻辑关系,数据项之间的联系}
》关系规范化理论为指导,用数据依赖的概率分析和抽象数据项之间的联系-函数依赖
》”取值范围“,”与其他数据项的逻辑关系“
定义了数据的完整性约束条件,是模式设计,完整性检查条件
2.数据结构:
-数据结构反映了数据之间的组合关系。
-一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合使用
-数据结构描述:{数据结构名,含义说明,组成:{数据项或数据结构}}
以学生为例,‘学生’是该系统的一个核心数据结构:
数据结构:学生
含义说明:
组成: 学号,姓名,性别,年龄,所在系,年纪
3.数据流
-数据流是数据结构在系统内部传输的路径
-对数据流的描述
数据流描述={数据流名,说明,数据流来源,数据流去向,组成:{数据结构},平均流量,高峰期流量}
4.数据存储:
-是数据结构停留或保持的地方,也是数据流的来源和去向之一。
-数据存储描述={数据存储名,说明,编号,输入的数据流,输出的数据流,组成:{数据结构},数据量,存取频率,存取方式}
5.处理过程:
具体处理逻辑一般用判定表或判定树来描述
-数据字典中只需要描述处理过程的说明性信息
-处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}}
7.3概念结构设计
7.3.1概念模型
概念模型设计是将需求得到的用户需求抽象为信息结构即概率模型的过程就是概念结构设计;
概念结构是现实世界的一个真实模型。是各种数据模型的共同基础,它比数据模型更独于机器,更抽象,从而更加稳定
》概念模型的用途
-概念模型用于信息世界的建模
-是现实世界到机器世界的一个中间层次
-是数据库设计的有力工具
-数据库设计人员和用户之间进行交流的语言
》对概念模型的基本要求
-较强的语义表达能力
-简单,清晰,易于用户理解
回顾内容:
-.实体:
客观存在并可相互区别的事物称为实体。
可以是具体的人,事,物或抽象的概念
-.属性:
实体所具有的某一特性称为属性,一个实体可以由若干个属性来刻画
-.码:(Key)
唯一标识实体的属性集称为码
-.实体型:
用实体名及其属性名集合来抽象和刻画同类实体称为实体型
-.实体集:
同一类型实体的集合称为实体集
-.联系:
现实世界中事物内部以及事物之间的联系在信息世界中
反映为实体(型)内部的联系和实体(型)之间的联系。
实体内部的联系:是指组成实体的各属性之间的联系
实体之间的联系:通常是指不同实体集之间的联系
实体之间的联系有一对一(1:1),一对多(1:m)和多对多(m : n)等多种类型

7.3.2E-R模型:
(1):
一对一联系(1:1):
如果对于实体集A中的每一个实体,实体集B最多有一个(也可以没有)实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系,记1:1
就像班长与班级
一对多(1:n)
如果对于实体集A中的每一个实体,实体集B中有n个实体(n>=0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记1:n.
多对多(m:n)
(2):
两个以上的实体型之间的联系:也存在着一对一,一对多,多对多联系。
对于课程,教师与参考书,如果一门课程可以有若干个教师讲授,使用若干本参考书,而每一个教师只讲授一门
课程,每一本参考书只提供一门课程使用。
则课程与教师,参考书之间的联系是一对多的。
(3):
单个实体型内的联系,也存在一对一,一对多,多对多的联系。

把参与联系的实体型的数目称为联系的度。
两个实体型之间的联系度为2,也称为二元联系
三个实体型之间的联系度为3,也称为三元联系
N个实体型之间的联系度为N,也称为N元联系
(4):
E-R图:提供了表示实体型,属性和联系的方法:
实体型:用矩形表示,矩形框内写明实体名。
属性:用椭圆形表示,并用无向边将其与相应的实体型连接起来
联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1:1,1:n或m:n)。联系可以具有属性
7.3.5:概念结构设计
1.实体与属性的划分原则
现实世界的事物能作为属性对待的,尽量作为属性对待
这样可以简化E-R图的处置
划分实体与属性的两条准则:
(1)作为属性,不能再具有需要描述的性质。
属性必须是不可分的数据项,不能包含其他属性
(2)属性不能与其他实体具有联系
E-R图中所表示的联系是实体与实体之间的联系
E.G:
职工实体有职工号,姓名,年龄等属性,但是每个职工都是职称的,
-如果不需要存储和处理与职称相关的工资,福利根据准则(1)设计为职工的属性
-如果需要存储或处理,则职称应被设计为一个实体
2.设计各个子系统的分E-R图
7.4逻辑结构设计
任务:
-把概念结构设计阶段设计好的基本E-R图转换
为与选用的DBMS产品所支持的逻辑结构
-目前主要使用关系模型,关系模型的逻辑结构是一组关系模式的集合
7.4.1 E-R图向关系模型的转换
-转换内容
将E-R图转换为关系模型:
将实体型,实体的属性和实体型之间的联系转化为关系模式。
-转换原则
1.实体型的转换:一个实体型转换为一个关系模式
-关系模式的属性:实体的属性
-关系模式的码:实体的码
2.实体型间的1:1联系:
-可以转换为一个独立的关系模式
关系模式的属性:与该联系相连的各实体的码以及联系本身的属性
关系模式的候选码:每个实体的码均是该关系模式的候选码
-也可以与相连的任意一端对应的关系模式合并
关系模式的属性:
与某一端关系模式合并,则在改关系模式的属性中加入另一端关系模式的码和联系的属性
合并后关系模式的码:不变
e.g:
班级 - <管理> - 教师 是1:1联系的
->转换为一个独立的关系模式:
管理(职工号,班级号)或者管理(班级号,职工号)(加上联系的属性) 每个实体的码也新关系的码
->"管理"与“班级”关系模式合并:
班级(班级号(码),学生人数,职工号)
->"管理"与"教师"关系模式合并
教师(职工号(码),姓名,性别,职称,班级号)
1:n联系
将其转换为关系模式的两种方法:
班级-<组成>-学生 是1:n的
(1)使其成为一个独立的关系模式:
组成(学号(码),班级号,关系的属性)
码为n那端的码
(2)将其与“学生”合并:
学生(学号(码),姓名,出生日期,所在系,年级,班级号,平均成绩)
码为n端的码

m:n联系:
学生-<选修>-课程
一般是将其转换为一个独立的关系模式:
选修(学号(码),课程号(码),成绩)其中学号与课程号的组合码
两端的码组成新关系的码,或者是新关系码的一部分
三元联系
课程-<讲授>-教师 1: n
教科书-<讲授>-课程 1: 1
教科书-<讲授>-教师 1:n
讲授(课程号,职工号,书号) 这三个是组合码
各端的码组成新的码,或者为新的码的一部分
加上关系的属性
三个或三个以上实体间的一个多元联系:
转换为一个关系模式
关系模式的属性:与该多元联系相连的各实体的码+联系本身的属性
关系模式的码:各实体码的组合
具有相同码的关系模式可合并
目的:减少系统中的关系个数
合并方法:
将其中一个关系模式的全部属性加入到另一个关系模式中
然后去掉其中的同义属性
调整属性的次序

7.4.3设计用户子模式
数据库模式-全局模式
用户子模式-视图机制

7.5数据库的物理设计
为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程,就是数据库的物理设计
数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于选定的DBMS

数据库物理设计的步骤:
1.确定数据库的物理结构
2.对物理结构进行评价

索引存取方法的选择:
建立索引为了:提高存取的效率-查询,插入,删除,更新的效率
看书得了

第九章:

过程:
查询分析(词法分析,语法分析) -->查询检查(有效性检查,视图转换,完全性检查,完整性检查)
–>查询优化(代数优化,物理优化等)–>查询执行(代码生成)
1.查询分析
与编译器原理相似,检查是否有语法错误等。
2.查询检查
有效性检查:检查语句中的数据库对象,如关系名,属性名是否存在和有效,根据数据字典中有关的模式定义信息进行检查
视图转换:
安全性检查:根据数据字典中的用户权限对用户的存取权限进行检查
完整性检查:根据数据字典中存储的完整性约束定义,对句子进行检查, sno = 1111212,就是错误的,该类型应该是字符类型的
3.查询优化:
分类:
代数优化/逻辑优化:指针对关系代数表达式的优化
物理优化:指存取路径和底层操作算法的选择
4.查询执行:自下而上,至上而下。
选择操作的实现:
(1)全表扫描方法
(2)索引扫描方法
适合于选择条件中的属性上有索引(如B+树索引或Hash索引)
通过索引先找到满足条件的元组主码或元组指针,再通过元组指针
直接在查询的基本表中找到元组
连接操作的实现:
(1)嵌套循环算法 (第一个表有n个元组,那么第二个表就要扫描n次)
(2)排序-合并算法(两张表各扫描一次就行)
(3)索引连接算法
(4)Hash Join算法
关系查询优化:
1.优点:
-是关系数据库管理系统实现的关键技术又是关系系统的优点所在
-减轻了用户对于系统底层选择存取路径的负担
-用户就可以关注查询的正确表达上,而无需考虑查询的执行效率如何
2.系统优化后的程序通常可以比用户程序做得更好
-关系数据库管理系统通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案
集中式数据库
执行开销主要包括
磁盘存取块数(I/O代价)
处理机时间(CPU代价)
内存空间的开销
I/O代价是最主要的
分布式数据库
总代价=I/O代价+CPU代价 + 内存代价 + 通信代价
查询优化的总目标
上述为物理优化
代数优化:
连接,笛卡尔积的交换结合律
投影的串接定律
选择的串接定律:
选择 a(选择 b ()) = 选择a且b()
选择与投影操作的交换律
选择(投影) = 投影(选择)
启发式规则:
(1)选择运算尽可能先做
在优化策略中这是最重要,最基本的一条
(2)把投影运算和选择运算同时进行
如有若干投影和选择运算,并且它们都对同一个关系操作
则可用在扫描此关系的同时完成所有的这些运算以避免重复扫描关系。
(3)把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系
(4)把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间。
(5)找出公共子表达式
看看书这里。

第十章 数据库恢复技术

10.1 事务的基本概念:
-事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
-事务和程序是两个概念
在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序
一个程序通常包含多个事务
-事务是恢复和并发控制的基本单位
定义事务
1.显示定义方式:
BEGIN TRANSACTION
SQL 语句1
SQL 语句2

COMMIT
事务正常结束
提交事务的所有操作
事务中所有对数据库的更新写回到磁盘上的物理数据库中。

BEGIN TRANSACTION
SQL 语句1
SQL 语句2

ROLLBACK
事务异常终止
事务运行的过程中发生了障碍,不能继续执行
系统将事务中队数据库的所有已完成的操作全部撤销
事务回滚到开始的状态
2.隐式方法:
当用户没有显示地定义事务时,
数据库管理系统按缺省规定自动划分事务

事务的ACID特性:
-原子性
事务是数据库的逻辑工作单位
事务中包括的诸操作要么都做,要么都不做
-一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
一致状态:数据库中只包含成功事务提交的结果
不一致状态:这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态
-隔离性
一个事务的执行不能被其他事务干扰
一个事务内部的操作及使用的数据对其他并发事务是隔离的
并发执行的各个事务之间不能互相干扰
-持续性也称永久性
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
接下来的其他操作或故障不应该对其执行结果有任何影响
破坏事务ACID特性的因素
(1)多个事务并行运行时,不同事物的操作交叉执行
数据库管理系统必须保证多个事务的交叉运行不影响这些事务的隔离性
(2)事务在运行过程中被强行停止
数据库管理系统必须保证被强行终止的事务对数据库和其他事务没有任何影响

10.2数据库恢复概述
故障是不可避免的
计算机硬件故障
软件的错误
操作员的失误
恶意的破坏
故障的影响
运行事务非正常中断,影响数据库中数据的正确性
破坏数据库,全部或部分丢失数据
数据库的恢复
数据库管理系统必须具有把数据库从错误状态恢复到某
一已知的正确状态(亦称为一致状态或完整状态)的功能,
这就是数据库的恢复管理系统对故障的对策
恢复子系统是数据库管理系统的一个重要组成部分
恢复技术是衡量系统优劣的重要指标
10.3故障的种类
1.事务内部的故障
有的是可以通过事务程序本身发现的
有的是非预期的,不能由事务程序处理的
e.g:
运算溢出
并发事务发生死锁而被选中撤销该事务
违反了某些完整性限制而被终止等
事务内部故障的恢复
事务故障意味着:
-事务没有达到预期的终点(COMMIT或者显示的ROLLBACK)
-数据库可能处于不正确状态
事务故障的恢复:事务撤销(UNDO)
强行回滚(ROLLBACK)该事务
撤销该事务已经作出的任何对数据库的修改,使得该事务像根本没有启动一样
2.系统故障
称为软故障,是指造成系统停止运转的任何事件,使得系统要重新启动
-特定类型的硬件错误(CPU故障)
-操作系统故障
-数据库管理系统代码错误
-系统断电
系统故障的影响:
-整个系统的正常运行突然被破坏
-所有正在运行的事务都非正常终止
-内存中数据库缓冲区的信息全部丢失
-不破坏数据库
系统故障的恢复
-发生系统故障时,一些尚未完成的事务的结果可能已送入物理数据库,造成数据库可能处于不正确状态
恢复策略:系统重新启动时,恢复程序让所有非正常终止的事务回滚,强行撤销(UNDO)所有未完成事务
-发生系统故障时,有些已完成的事务可能有一部分甚至全部留在缓冲区,尚未写回到磁盘上的物理数据库中,系统故障使得这些事务对数据库的修改部分或全部丢失
回复策略:系统重新启动时,恢复程序需要重做(REDO)所有已提交的事务

总结:系统故障的恢复需要做两件事情:
1.撤销所有未完成的事务
2.重做所有已提交的事务
3.介质故障
称为硬故障,指外存故障
磁盘损坏
磁头碰撞
瞬时强磁场干扰
介质故障破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务
介质故障比前两类故障的可能性小很多,但破坏性大得多
4.计算机病毒
-一种人为的故障或破坏,是一些恶作剧者研制的一种计算机程序
-可以繁殖和传播,造成对计算机系统包括数据库的危害
计算机病毒已成为计算机系统的主要威胁,自然也是数据库系统的主要威胁
数据库一旦被破坏仍要用恢复技术把数据库加以恢复

故障小结:
各类故障,对数据库的影响有两种可能性
-一是数据库本身被破坏
-二是数据库没有被破坏,但数据可能不正常,这是由于事务的运行被非正常终止造成的。
恢复操作的基本原理、;冗余
利用存储在系统别处的冗余数据来重建数据库中已被破坏或不正常的那部分数据
恢复的实现技术:复杂
一个大型数据库产品,恢复子系统的代码要占全部代码的10%以上

10.4恢复的实现技术
恢复机制涉及的关键问题
1.如何建立冗余数据
数据转储(backup)
转储是指数据库管理员定期地将整个数据库复制到磁带,磁盘或其他存储介质上保存起来的过程
备用的数据文本称为后备副本或后援副本
数据库遭到破坏后可以将后备副本重新装入
重载后备副本只能将数据库恢复到转储时的状态
要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务
转储方法:
(1)静态转储与动态转储
静态:
在系统中无法运行事务时进行的转储操作
转储开始时数据库处于一致性状态
转储期间不允许对数据库的任何存取,修改活动
得到的一定是一个数据一致性的副本
动态:
转储操作与用户事务并发进行
转储期间允许对数据库进行存取或修改
利用动态转储得到的副本进行故障恢复
需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件
后备副本加上日志文件就能把数据库恢复到某一刻的正确状态
(2)海量转储与增量转储
海量转储:每次转储全部数据库
增量转储:只转储上次转储后更新过的数据
海量转储与增量转储比较
从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便
如果数据库很大,事务处理又十分频繁,则增量转储更使用更有效
转储方法分类:
动转,静转,动海转,静海转,动增转,静增转。
登记日志文件(logging)
日志文件是用来记录事务对数据库的更新操作的文件
1.日志文件的格式和内容
日志文件的格式:
以记录为单位的日志文件
各个事务的开始标记(BEGIN TRANSACTION)
事务标志+BEGIN TRANSACTION
事务标志用于标明是那个事务如 : T1 BEGIN TRANSACTION
各个事务的结束标记(COMMIT或ROLLBACK)
事务标志+COMMIT
事务标志+ROLLBACK
各个事务的所有更新操作

					以上均作为日志文件中的一个日志记录
				以数据块为单位的日志文件
				 	内容:
						事务标识
						被更新的数据块
		2.日志文件的作用
			用途:
				进行事务故障恢复
				进行系统故障恢复
				协助后备副本进行介质故障恢复
			具体作用:
				事务故障恢复和系统故障恢复必须用日志文件。
				在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库
				在静态转储方式中,也可以建立日志文件。
		3.登记日志文件
		为保证数据库是可恢复的,登记日志文件必须遵循两条原则
			登记的次序严格按并发事务执行的时间次序
			必须先写日志文件,后写数据库
						
2.如何利用这些冗余数据实施数据库恢复

10.5.1恢复策略
1.事务故障的恢复:(前面已经提到了)
具体步骤:
(1)反向扫描文件日志(即从最后向前扫描日志文件)查找该事务发更新操作
(2)对该事务的更新操作执行逆操作。即将日志记录中“更新前的值”写入数据库.
插入操作,“更新前的值”为空,则相当于做删除操作
删除操作,“更新后的值”为空,则相当于做插入操作
若是修改操作,则相当于用修改前的值代替修改后值
(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理
(4)如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。

2.系统故障的恢复
具体步骤:(1)正向扫描日志文件(从头到尾扫描日志文件)
重做(REDO)队列:在故障发生前已经提交的事务
这些事务既有BEGIN TRANSACTION记录,也有COMMIT记录
撤销(UNDO)队列:故障发生时尚未完成的事务
这些事务只有BEGIN TRANSACTION记录,无相应的COMMIT记录
(2)对撤销(UNDO)队列事务进行撤销(UNDO)处理
反向扫描日志文件,对每个撤销事务的更新操作执行逆操作
即将日志记录中“更新前的值”写入数据库
(3)对重做(REDO)队列事务进行重做(REDO)处理
正向扫描日志文件,对每个重做事务重新执行登记的操作
即将日志记录中“更新后的值”写入数据库
3.介质故障的恢复
具体步骤见书上
10.6具有检查点的恢复技术
问题:搜索整个日志将耗费大量的时间
重新处理:重新执行,浪费了大量时间
具有检查点的恢复技术
在日志文件中添加检查点记录
增加重新开始文件
恢复子系统在登录日志文件期间动态地维护日志
2.检查点技术
-检查点记录的内容
建立检查点时刻所有正在执行的事务清单
这些事务最近一个日志记录的地址
-重新开始文件的内容
记录各个检查点记录在日志文件中的地址
-动态维护日志文件的方法
周期性地执行如下操作:建立检查点,保存数据库状态
具体步骤是:
(1)将当前日志缓冲区中的所有日志记录写入磁盘的日志文件中
(2)在日志文件中写入一个检查点记录
(3)将当前数据缓冲区的所有数据记录写入磁盘的数据库中
(4)把检查点记录在日志文件中的地址写入一个重新开始文件
-建立检查点
恢复子系统可以定期或不定期地建立检查点,保存数据库状态
定期:
按照预定的一个时间间隔,如每隔一小时建立一个检查点
不定期:
按照某种规则,如日志文件已写满一半建立一个检查点
-使用检查点方法可以改善系统故障恢复效率
E.G:
当事务T在一个检查点之前提交
.T对数据库所做的修改已写入数据库
.写入时间是在这个检查点建立之前或在这个检查点建立之时
.在进行恢复处理时,没有必要对事务T执行重做操作
当事务T在检查点时还没有完成
.T对数据库所做的修改已写入数据库
.在进行恢复处理时,如果需要重做T,重做的起始点是检查点
利用检查点的恢复步骤
(1)从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
(2)由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST
建立两个事务队列
UNDO-LIST
REDO-LIST
把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂为空。
(3)从检查点开始正向扫描日志文件,直到日志文件结束
如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列
如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列;直到日志文件结束
(4) 对UNDO-LIST中的每个事务执行UNDO操作
对REDO-LIST中的每个事务执行REDO操作
10.7数据库镜像
解决介质故障的方法
数据库管理系统自动把整个数据库或其中的关键数据复制到另一个磁盘上
数据库管理系统自动保证镜像数据与主数据的一致性
每当主数据库更新时,数据库管理系统自动把更新后的数据复制过去
-出现介质故障时
可由镜像磁盘继续提供使用
同时数据库管理系统自动利用镜像磁盘数据进行数据库的恢复
不需要关闭系统和重装数据库副本
-没有出现故障时
可用于并发操作
一个用户对数据加排他锁修改数据,其他用户可以读镜像数据库上的数据,而不必等待该用户释放锁
-频繁的复制数据自然会降低系统运行效率

11章 并发控制

多用户数据库系统
允许多个用户同时使用的数据库系统
淘宝等
多事务执行方式
(1)事务串行执行
每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行
不能充分利用系统资源,发挥数据库共享资源的特点
(2)交叉并发方式
在单处理机系统中,事务的并发执行是这些并行事务的并行操作轮流交叉运行
单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率
(3)同时并发方式
多处理系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行
最理想的并发方式,但受制于硬件环境
更复杂的并发方式机制
本章讨论的数据库系统并发控制技术是以单处理机系统为基础的
事务并发执行带来的问题
会产生多个事务同时存取同一数据的情况
可能会存取和存储不正确的数据,破坏事务隔离性和数据库的一致性
数据库管理系统必须提供并发控制机制
并发控制机制是衡量一个数据库管理系统性能的重要标志之一

11.1并发控制概述:
事务是并发控制的基本单位
并发控制机制的任务
对并发操作进行正确调度
保证事务的 隔离性
保证数据库的一致性
并发操作带来的数据不一致性
1.丢失修改
两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改丢失
2.不可重复读
不可重复读是指事物T1读取数据后,事物T2执行更新操作,使T1无法再现前一次读取结果
三种情况:
(1).事物1读取某一数据
.事物2对其做了修改
.当事务1再次读该数据时,得到与前一次不同的值
(2).事务T1按一定条件从数据库中读取了某些数据记录
.事务T2删除了其中部分记录
.当T1再次按相同条件读取数据时,发现某些记录消失了。
(3).事务T1按一定条件从数据库中读取某些数据记录
.事务T2插入了一些记录
.当T1再次按相同条件读取数据时,发现多了一些记录
3.读脏数据
介绍:
事务T1修改某一数据,并将其写回磁盘
事务T2读取同一数据后,T1由于某种原因被插销
这时T1已修改的数据恢复原值,T2读到的数据就与数据库中的数据不一致
T2读到的数据就为“脏”数据,即不正确的数据

记号 R(x):读数据x
W(x):写数据X
数据不一致性:由于并发操作破坏了事务的隔离性
并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性
对数据库的应用有时允许某些不一致性,可以降低对一致性的要求以减少系统开销
并发控制的主要技术:
封锁
时间戳
乐观控制法
多版本并发控制
11.2封锁:
-就是事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁
-加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事物不能更新此数据对象
基本封锁类型
排它锁(X锁 或 写锁)
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
共享锁(S锁 或读锁)
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁
11.3封锁协议
-在运用X锁和S锁对数据对象加锁时,需要约定一些规定,这些规则为封锁协议
何时申请X锁或S锁
持锁时间
何时释放
-对封锁方式规定不同的规则,就形成了各种不同的封锁协议,在不同的程度上保证并发操作的正确调度
三级封锁协议
1.一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
正常结束(COMMIT)
非正常结束(ROLLBACK)
一级封锁协议可防止丢失修改,并保证事务T是可恢复的。
2.二级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁
二级封锁协议可以防止丢失修改和读“脏”数据。
3.三级封锁协议
一级分数封锁协议加上事务T在读取R之前必须先对其加S锁,直到事务结束才释放
三级封锁协议可防止丢失修改,读脏数据和不可重复读。
11.4活锁与死锁
11.4.1 活锁
避免活锁:采用先来先服务的策略
当多个事务请求封锁同一数据对象时
按请求封锁的先后次序对这些事务排队
该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁
11.4.2 死锁
解决死锁的两类方法:
(1)死锁的预防:
产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待
预防死锁的发生就是要破坏产生死锁的条件
一次封锁法:
要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
过早加锁,降低并发度
难于事先精确确定封锁对象
顺序封锁法:
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事物都按这个顺序实行封锁
问题:
维护成本高
难以实现,很难按规定的顺序去施加封锁
(2)死锁的诊断与解除
1.超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
优点:实现简单
缺点:有可能误判死锁
时限若设置得太长,死锁发生后不能及时发现
2.等待图解法
用事务等待图动态反映所有事物的等待情况
-事物等待图是一个有向图G=(T,U)
-T为结点的集合,每个结点表示正运行的事务
-U为边的集合,每条边表示事务等待的情况
-若T1等待T2,则T1,T2之间划一条有向边,从T1指向T2
并发控制子系统周期性地(比如每隔数秒)生成事务等待图,检测事务。如果发现图中存在回路,则表示系统中出现了死锁。
解除死锁
选择一个处理死锁代价最小的事务,将其撤销
释放此事务持有的所有的锁,使其它事务能继续运行下去。
11.5并发调度的可串行行性
-数据库管理系统对并发事务不同的调度可能会产生不同的结果
-串行调度是正确的
-执行结果等价于串行调度的调度也是正确的,称为可串行化调度
11.5.1可串行化调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同
可串行性
是并发事务正确调度的准则
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度

11.5.2冲突可串行化调度
一个比可串行化更严格的条件
冲突操作:是指不同的事务对同一数据的读写操作和写写操作://重点是不同的事物
Ri(x)与Wj(x) /Ti读x,Tj 写x ,其中i!=j/
Wi(x)与Wj(x)
特点:涉及同一个数据库元素,并且至少有一个是写操作
不冲突操作:
ri(x);rj(y)
ri(x);wj(y)
wi(x);rj(y)
wi(x);wj(y)
不能交换的操作:
同一事物的两个操作
不同事物的冲突操作
Ri(x)与Wj(x)
Wi(x)与Wj(x)
冲突可串行化:
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事物不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称调度Sc是冲突可串行化的调度
若一个调度是冲突可串行化,则一定是可串行化的调度
三个事物的一个调度
r3(B)r1(A)w3(B)r2(B)r2(A)w2(B)r1(B)w1(A)
因为r1(A)与w3(B)r2(B)r2(A)w2(B)都是不同事务且不冲突事件所以可以交换故而得到:
r3(B)w3(B)r2(B)r2(A)w2(B)r1(A)r1(B)w1(A)
为冲突可串行化,所以该调度是可串行化的调度

冲突可串行化调度是可串行化调度的充分条件,不是必要条件。还有不满足冲突可串行化条件的可串行化调度
11.6两段锁协议
数据库管理系统普遍采用两段锁协议的方法实现并发调度的可串行性,从而保证调度的正确性
两段锁协议:
指所有事务必须分两个阶段对数据项加锁和解锁
在对任何数据进行读,写操作之前,事务首先要获得对该数据的封锁
在释放一个封锁之后,事务不再申请和获得任何其他封锁
双段锁的含义
事务分为两个阶段
第一阶段是获得封锁,也称为扩展阶段
事务可以申请获得任何数据项的任何类型的锁,但是不能释放任何锁
第二阶段是释放封锁,也称为收缩阶段
事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁
E.G:
事务Ti遵守两段锁协议,其封锁序列是:
Slock A Slock B Xlock C Unlock B Unlock A Unlock C;
|<- 扩展阶段 ->||<- 收缩阶段 ->|

Tj 不遵守两段锁协议
Slock A Unlock A Slock B Xlock C Unlock C Unlock B;

事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件
若并发事务都遵循两端锁协议,则对这些事务的任何并发调度策略都是可串行化的
若并发事务的一个调度是可串行化的,不一定所有事务都符合两端锁协议

两端锁协议与防止死锁的一次封锁法
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两端锁协议
但是两端锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁

11.7封锁粒度
-封锁对象的大小被称为封锁粒度
-封锁的对象:逻辑单元,物理单元
例:关系数据库中的封锁对象
逻辑单元:属性值,属性值的集合,元组,关系,索引项,整个索引,整个数据库等
物理单元:页(数据页或索引页),物理记录等
-封锁粒度与系统的并发度和并发控制的开销密切相关
封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小
封锁的粒度越小,并发度较高,但系统开销也就越大
-多粒度封锁:
在一个系统中同时支持多种封锁粒度功不同的事务选择
-选择封锁粒度
同时考虑封锁开销和并发度两个因素,适当选择封锁粒度
需要处理大量元组的用户事务:以关系为封锁单元
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位
只处理少量元组的用户事务:以元组为封锁单位
11.7.1多粒度封锁
多粒度树:
以树形结构来表示多级封锁粒度
根结点是整个数据库,表示最大的数据粒度
叶节点表示最小的数据粒度
多粒度封锁协议:
运行多粒度树中的每个结点被独立地加锁
对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁
在多粒度封锁中一个数据对象可能以两种方式封锁:显示封锁和隐私封锁
显示封锁:直接加到数据对象上的封锁
隐私封锁:是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁
多粒度中,显示与隐私的效果是一样的
对某个数据对象加锁,系统要检查
该数据对象
有无显示封锁与之冲突
所有上级结点
检查本事务的显示封锁是否与该节点对象上的隐私封锁冲突
所有下级结点
看上面的显示封锁是否与本事务的隐私封锁(将加到下级结点的封锁)冲突
11.7.2
引进意向锁目的
提高对某个数据对象加锁时系统的检查效率
如果对一个结点加意向锁,则说明该节点的下层结点正在被加锁
对任一结点加基本锁,必须先对它的上层结点加意向锁
常用意向锁
意向共享锁 IS锁
如果对一个数据对象加IS锁,表示它的后裔结点拟加S锁
意向排它锁 IX锁
如果对一个数据对象加IX锁,表示它的后裔结点拟加X锁
共享意向排它锁 SIX锁
如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S + IX。
锁的强度 X -> SIX->(S,IX) ->IS
一个事务在申请封锁时以强锁代替弱锁是安全的,反之则不然
具有意向锁的多粒度封锁方法
申请封锁时应该按自上而下的次序进行
释放封锁时则应该按自下而上的次序进行
具有意向锁的多粒度封锁方式
提高了系统的并发度
减少了加锁和解锁的开销
在实际的数据库管理系统产品中得到广泛应用

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dearzcs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值