基本把所有知识点都罗列了(吧),小部分知识点(求闭包、多值依赖)留到以后再补吧,先把坑留在这里。
整理不易,多多点赞(orz)
第一章 数据库系统
-
数据库:可长期存储在计算机内、有组织、可共享、大量数据的集合
-
数据库管理系统(DBMS):位于用户和操作系统之间的一层数据管理软件,用于科学地组织和存储数据、高效获取和维护数据
-
数据库系统(DBS):在计算机系统中引入数据库后的系统构成。
○ 由数据库、数据管理系统、应用程序、数据库管理员构成。
a. 数据库:提供数据的存储功能
b. 数据库管理系统:提供数据地组织、存取、管理、维护等基础功能
c. 数据库管理员:负责全面管理数据库系统
d. 数据库应用系统:根据应用需求使用数据库 -
数据模型:对现实世界数据特征的抽象和表示。
-
数据模型应当满足的要求:
○ 比较真实模拟现实世界
○ 容易为人所理解
○ 便于在计算机上实现 -
数据模型分类:
○ 概念模型:按用户的观点对数据和信息建模,用于数据库设计。
○ 逻辑模型和物理模型:
■ 逻辑模型:按计算机系统的观点对数据建模,用于数据库管理系统实现。
■ 物理模型:对数据最底层的抽象,描述数据在系统内部或磁盘上的表示方式和存取方法。
○ 现实世界->概念模型->逻辑模型DBMS>物理模型(机器世界) -
概念模型用途:用于信息世界的建模,是现实世界到机器世界的一个中间层次,是数据库设计的有力工具,数据库设计人员和用户之间的交流的语言。
-
概念模型的基本要求:较强的语义表达能力;能方便、直接表达应用中各种语义知识;简单、清晰、易于用户理解。
-
模式:
○ 数据库逻辑结构和特征的描述
○ 是型的描述,不涉及具体值
○ 反映的是数据的结构及其联系
○ 模式是相对稳定的 -
实例:
○ 模式的一个具体值
○ 反映数据库某一时刻的状态
○ 同一个模式可以有很多实例
○ 实例随数据库中的数据更新而变动 -
数据库管理系统应具备哪些功能?
○ 数据定义功能:提供数据定义语言(DDL)、定义数据库中的数据对象
○ 数据组织、存储、管理
■ 分类组织、存储和管理各种数据
■ 确定组织数据的文件结构和存取方式
■ 实现数据之间的联系
■ 提供多种存取方法提高存取效率
○ 数据操纵功能
■ 提供数据操纵语言(DML)
■ 实现对数据库的基本操作 (查询、插入、删除和修改)
○ 数据库的事务管理和运行管理
■ 数据库在建立、运行和维护时由DBMS统一管理和控制
■ 保证数据的安全性、完整性、多用户对数据的并发使用
■ 发生故障后的系统恢复
○ **数据库的建立和维护功能:**数据库初始数据装载转换、数据库转储、介质故障恢复、数据库的重组织、性能监视分析等
○ 其它功能:DBMS与网络中其它软件系统的通信、两个DBMS系统的数据转换、异构数据库之间的互访和互操作 -
数据库系统有哪些特点?
○ 数据结构化
○ 数据共享性高、冗余度低且易扩充
○ 数据独立性高
■ 物理独立性:用户的应用程序与存储在磁盘上的数据库中的数据是相互独立的,当数据的物理存储改变了,应用程序不用改变。
■ 逻辑独立性:用户的应用程序与数据库的逻辑结构是相互独立的,当数据库的逻辑结构改变了,应用程序不用改变。
■ 由数据管理系统的三级模式结构和二级映像功能实现。
○ 由数据库管理系统统一管理和控制 -
**数据模型的组成要素:**数据结构、数据操作、数据的完整性约束。
○ 数据结构:所描述的对象类型的集合,是对系统静态特性的描述
○ 数据操作:对数据库中各种对象和实例允许进行的操作的集合、操作及有关操作的规则,是对系统动态特性的描述。
○ 数据的完整性约束:一组完整性规则的集合。
■ 完整性规则:给定的数据模型中的 数据及其联系 所具有的制约和依存规则。用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效、相容。 -
E-R图:概念模型的一种表示方法:实体-联系方法(E-R 图来描述现实世界的概念模型)
-
实体:客观存在并可互相区别的事物。(可以具体人事物 也可抽象的概念)
-
联系:现实世界中事物内部以及事物之间的联系在信息世界中反映为实体(型)内部的联系和实体(型)之间的联系。
-
数据库系统的三级模式结构:外模式、模式、内模式
○ 外模式:
■ 数据库用户使用的局部数据的逻辑结构和特征的描述。(包括应用程序员和最终用户)
■ 数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
○ 模式:一个数据库只有一个模式!
■ 数据库中全体数据的逻辑结构和特征的描述;
■ 所有用户的公共数据视图。
○ 内模式:一个数据库只有一个内模式!
■ 是数据物理结构和存储方式的描述
■ 是数据在数据库内部的表示方式 -
外模式用途:
○ 保证数据库安全的一个有力措施
○ 每个用户只能看见个访问所对应的外模式中的数据 -
三级模式是对数据的三个抽象级别。
-
二级映像:在数据库管理系统内部实现这三个抽象层次的联系和转换
○ 外模式/模式映像:定义外模式与模式之间的对应关系。映像定义通常包含在各自外模式的描述中
○ 保证数据的逻辑独立性:当模式改变时,数据库管理员对 外模式/模式映象 作相应改变,使外模式保持不变,应用程序是依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
○ 模式/内模式映像:定义了数据全局逻辑结构与存储结构的对应关系。映像定义通常包含在模式的描述中
○ 保证数据的物理独立性:当数据库的存储结构改变了,数据库管理员修改 模式/内模式映象 ,使模式保持不变,模式不变,则应用程序不变,保证了数据与程序的物理独立性,简称数据的物理独立性。 -
产生数据不一致性的根本原因:
● 数据冗余
● 并发控制不当
● 由于各种故障、错误造成的
第二章 关系运算
-
关系三类完整性约束:实体完整性、参照完整性、用户定义的完整性
-
域:一组具有相同数据类型的集合
-
笛卡尔积:所有域的所有取值的一个组合,不能重复
-
元组:关系中的每个元素是关系中的元组。(笛卡尔积中每一个元素叫做一个n元组)
-
关系:
-
属性:关系中不同的列可以对应相同域,为加以区分,每个列取名
-
码:
○ 候选码:关系中某一属性组的值能唯一地标识一个元组,而其子集不能。
○ 全码:关系模式的所有属性组是这个关系模式的候选码。
○ 主码:选定一个候选码为主码
○ 主属性:所有候选码的诸属性
○ 非主(码)属性:不包含在任何候选码中的属性 -
关系代数的基本运算:
连接:一般连接 等值连接 自然连接
第三章 SQL语法
SQL功能:
○ 数据定义:create drop alter
○ 数据操纵:select insert delete update
查询 增删改
○ 数据控制:grant revoke
○ 数据查询:select
关系代数运算以集合运算为基础,五种基本的代数运算:并 差 笛卡尔积 选择 投影
3.1 基本的SQL语言语法
select create drop alter insert update delete grant revokecreate table Student(Sno smallint primary key,/*Sno是主码(列级完整性约束条件)*/name char(20) unique,/*Sname取唯一值*/
)
/*建立学生选课表SC */
CREATE TABLE SC(PRIMARY KEY(Sno,Cno),/*主码由两个属性构成(只能作为表级完整性进行定义)*/FOREIGN KEY(Sno) REFERENCES Student(Sno),/*Sno是外码,被参照表是Student(表级完整性约束条件)*/FOREIGN KEY(Cno) REFERENCES Course(Cno)/*Cno是外码,被参照表是Course(表级完整性约束条件)*/
);
/*建立视图*/
create view IS_Student as
select Sno,Sname,Sage
from Student
where Sdept='is';/*建立索引*/
create unique index 索引名 on 表名(列名,ASC| DESC)
--Course表按课程号升序建唯一索引:
create unique index Coucno ON Course(Cno);
--SC表按学号升序和课程号降序建唯一索引
create unique index SCno ON SC(Sno ASC,Cno DESC);
--在Student表的Sname列上建立一个聚簇索引
create cluster index Stusname ON Student(Sname);
/*修改索引*/
alter index 旧索引名 rename to 新索引名
--将SC表的SCno索引名改为SCSno
alter index SCno rename to SCSNO;alter table Student add 列名 数据类型 完整性约束
alter table Student alter column 列名 数据类型
/*增加课程名称必须取唯一值的约束条件*/
alter table s add unique(Cname);
alter table Student drop 列名 cascade|restrict
alter table Student drop constraint 完整性约束条件名 cascade|restrictdrop schema 模式名 restrcit|cascade; --删除模式
drop table 表名 restrcit|cascade; --删除表
drop index 索引名;
drop view 视图名 cascade;/*属性列的顺序可与表定义中的顺序不一致
没有指定属性列:则插入的是一条完整的元组,属性列属性与表中定义的顺序一致
指定部分属性列:插入的元组在其余属性列上取空*/
--字符号需要用('','')括起来
insert into 表名 (属性列名,...) values (属性值,...)
insert into 表名 (属性列名,...) select ...
insert into Student (Sno,Sname,Ssex,Sdept,Sage)
values('201010','nancy','女','IS',18);
--关系数据库管理系统会在新插入记录的grade列自动附上空值
insert into sc(sno,cno) values('201010','1');
--等价于
insert into sc values('201010','1',NULL);delete from 表名 where 条件
--删除学号201010的学生记录
delete from student where sno='201010';update 表名 set 列名=表达式,...where 条件;
--将全体学生年龄增加一岁
update Student set Sage =Sage+1;
--将计算机科学系全体学生成绩置0
update sc set grade=0
where sno in (select snofrom studentwhere sdept='cs'
);
3.2 一般的查询
--语句格式
select all|distinct 目标列表达式,目标列表达式,...--all表示重复的元组也会被列出来
from 表名或者视图名,表名或者视图名,...
where 条件表达式
GROUP BY 列名 HAVING 条件表达式
ORDER BY 列名 ASC|DESCSELECT:指定要显示的属性列(选取列)
FROM :指定要查询的对象(表或视图)
WHERE :指定查询条件(选择元组)
GROUP BY :对查询结果按指定列的值分组,该属性列值相等的元组为一组,通常会在每组中作用聚集函数
HAVING:满足指定条件的组才予以输出
ORDER BY :对查询结果表按指定列值的升序或者降序排列select * from s;
--使用列别名改变查询结果的列标题
select Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
from Student;--查询既不是计算机科学系,也不是数学系的学生的姓名、性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('MA','CS');
--查询计算机科学系,或者数学系的学生的姓名、性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('MA','CS');---- 字符匹配
/*语法格式: (not) LIKE '匹配串' (ESCAPE'转码字符')
匹配串:可以是一个完整的字符,也可以含通配符%和_%:表示任意长度的字符串(也可以为0)eg: a%b表示所有以a开头b结尾的字符串_:表示任意单个字符eg: a_b表示所有以a开头b结尾、长度为3的字符串
转码字符:将通配符%和_转义为普通字符
*/
--查询学号为201010的学生的详细情况
select *
from Student
where Sno liek '201010';
--等价于 WHERE Sno='201010';--查询名字中第2字为阳的学生的姓名和学号
select Sname,Sno
from Student
where Sname like '_阳%';--查询所有不姓刘学生的姓名、学号、性别
select Sname,Sno,Ssex
from Student
where Sname not like '刘%';--查询DB_Design课程的课程号和学分
select Cno,Ccreadit
from Course
where Cname like 'DB\_DESIGN' escape '\\';
--其实是一个\,但是由于语雀软件为了换码,需要两个--查询以DB_开头的,且倒数第三个字符为i的课程详细情况
select *
from Course
where Cname like 'DB\_%i__' eacape '\\';
/* 'ESCAPE'\'表示\为换码字符 */----空值
/*IS 不能用=代替*/
--查询没有成绩的学生的学号和课程号
select Sno,Cno
from SC
where Grade is NULL--查询所有有成绩的学生的学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL----多重条件查询
--查询计算机系年龄在20岁以下的学生名字
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;
--查询计算机科学系、数学系、信息系的学生的性别和姓名
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
--等价于
WHERE Sdept='CS' OR Sdept='Ma' OR Sdept='IS';-----排序
/*
可以按一个或多个属性列排序
升序:ASC (缺省值默认为升序)
降序:DESC
对于空值,排序时显示的次序由具体系统实现来决定
*/
--查询选修了3号课程的学生的学号和成绩,查询结果按分数降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
--查询全体学生情况,结果按所在系的系号升序,同一系中学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept ,Sage DESC;----聚集函数
count(*)--统计元组个数
count(distinct|ALL 列名)--统计一列中值的个数
sum(distinct|ALL 列名)--计算一列值的总和(此列必须为数值型)
avg(distinct|ALL 列名)--计算一列值的平均值(此列必须为数值型)
max(distinct|ALL 列名)--求一列值的最大值
min(distinct|ALL 列名)--求一列值的最小值--查询学生总人数
SELECT COUNT(*)
FROM Student;
--查询选修了课程的学生人数
SELECT COUNT(dintinct Sno)
FROM SC;
--计算1号课程的学生的平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno='1';
--查询选修1号课程的学生最高分数
SELECT MAX(Grade)
FROM SC
WHERE Cno='1';
--查询学生201010选修课程的总学分数
SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201010' AND SC.Cno=Course.Cno;/*
可以使用having短语对分组后的数据进行筛选。
注意:
!!!where子句不能用聚集函数作为条件表达式!!!
聚集函数只能用于GROUP BY的HAVING子句。!!!!!!!!!!!!!!!!!!!
HAVING短语和WHERE子句的区别:作用对象不同:* WHERE子句用于基表或视图,从中选择满足条件的元组,* HAVING用于组,从中选择满足条件的组。
*/--查询选修了3门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3--查询平均成绩大于等于90分的学生学号和平均成绩
错误:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;正确:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90/*自身连接*/
--查询每一门课的间接先修课程(先修课的先修课)
SELECT FIRST.Cno,SRCOND.Cpno--选取表一的课程+表二的先修课
FROM Course FIRST,Course SECOND--先给表取名
WHERE FIRST.Cpno=SECOND.Cno;--如果表一的先修课是表二的课程/*嵌套查询*/
--不能使用order by 子句!!!SELECT Sname--外层查询 父查询
FROM Student
WHERE Sno IN (SELECT Sno--内层查询 子查询FROM SC WHERE Cno='2'
);
--查询和"刘晨"在同一个系学习的学生--不相关子查询
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN --2. 查找所有在CS系的学生(SELECT Sdept--1. 确定刘晨所在的系名--'CS'FROM StudentWHERE Sname='刘晨');--找出每个学生超过他选修课课程平均成绩的学号、课程号
SELECT Sno,Cno
FROM SC x--给表改名
WHERE Grade>=(SELECT AVG(Grade)FROM SC yWHERE y.Sno=x.Sno---相关子查询
);--查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄
select sname,sage
from student
where sdept!='CS' --父2查询块中的条件and sage<any(select sagefrom studentwhere sdept='CS');--用聚集函数实现
select sname,sage
from student
where sdept<>'CS'--父2查询块中的条件 and sage<(select MAX(sage)from studentwhere sdept='CS') ;--查询与刘晨在同一个系的学生
select sname
from student S1
where exists(select *from student S2where S2.sdept=S1.sdept and S2.sname='李晨');--查询选修了所有课程的学生姓名
--没有课程是他不选的
select sname
from student
where not exists(select * --选出没有被全部选的课程from coursewhere not exists(select * --拼接三个表 选了课程的学生所有信息from SC,student,coursewhere SC.sno=student.sno and SC.cno=course.cno)
);--查询计算机科学系的学生以及年龄不大于19岁的学生
select * from student where sdept='CS'
union
select * from student where sage<=19--查询计算机科学系的学生与年龄不大于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 Sage>19;/*派生表的查询*/
--找出每个学生超过他自己选修课程平均成绩的课程号
select sno,cno
from sc,
(select sno,avg(grade) from sc group by sno) as view_grade(avg_sno,avg_grade)
where sc.sno=view_grade.avg_sno and sc.grade=view_grade.avg_grade--视图的定义
/*建立视图*/
create view IS_Student(view_sno,view_sname,view_sage) as
select Sno,Sname,Sage
from Student
where Sdept='is'
with check option;--保证视图更新、插入、删除的行满足视图定义中的谓词条件(子查询的条件表达式)
/*修改基表student的结构后,student表和视图的映像关系被破坏,会导致该视图不能正确工作*/
3.3 视图
- 视图的作用:
○ 简化用户操作
○ 使用户能以多种角度看待同一数据
○ 对重构数据库提供了一定程度上的逻辑独立性
○ 能对机密数据提供安全保护
○ 适当利用视图可以更清晰的表达查询 - 视图的特点:
○ 虚表,是从一个或者几个基本表或视图导出的表
○ 数据库中只存放视图的定义,不存放视图对应的数据
○ 基表中的数据发生变化,从视图中查询出的数据也随之改变
○ 用户可以在视图上再定义视图
视图的操作:定义、查询、更新、删除
模式:定义一个命名空间
第四章 数据库安全性
- 数据库的安全性:保护数据库以防不合法的使用所造成的数据泄露、更改和破坏
- 三类安全性问题:
○ 技术安全类
○ 管理安全类
○ 政策法律类 - 实现数据库安全性控制常用的方法和技术:
○ 用户识别和鉴定
○ 存取控制
■ 存取控制机制组成:
● 定义用户权限。用户对某一数据对象的操作权力称为权限。
● 合法权限检查。DBMS对用户发出的操作请求进行检查。
● 用户权限定义和合法权检查机制一起组成了DBMS的安全子系统
■ 常用的存取控制方法:自主存取控制 强制存取控制
○ 视图
○ 审计
○ 数据加密 - 自主存取控制:
○ 通过grant
和revoke
实现
○ 用户权限组成:数据对象+操作类型
○ 功能:定义用户存取权限
○ 定义存取权限叫做授权
○ 缺点:
■ 可能存在数据的无意泄露
■ 原因:这种机制仅仅通过数据的存取权限来进行安全控制,而数据本身并无安全性标记
■ 解决:对系统控制下的所有主客体实施强制存取控制策略
--把对s表和c表的全部授权授予给u2和u3
grant all priviliges on table s,c to u2,u3;
--把对表sc查询权限授予所有用户
grant select on table sc to public;--在mysql中不适用
--把查询s表和修改学号的权限给用户u4
grant select,update(Sno)--对属性列授权时,必须明确指出相应属性列名
on table s
to u4;
--把表sc的insert权限授予u5,并允许再授权给其他用户
grant insert on table sc to u5
with grant option;
--传播这个权限--收回u4修改学号的权限
revoke update(Sno) on table s from u4;
--收回所有用户对表sc的查询权限
revoke select on table sc from public;
--收回u5对sc的insert权限
revoke insert on table sc from u5 cascade;
--因为u5授权给了u6,u7,因此这里必须加上cascade才能从u5这里收回权限
--如果u6,u7从其他用户也获得了insert权限,则仍然具有该权限,否则就不记得
-
强制存取控制MAC:
○ 优点:
■ 保证更高程度的安全性
■ 用户不能直接感知或进行控制
■ 适用于对数据有严格而固定密级分类的部门(军事部门、政府部门)
○ 敏感标记:绝密、机密、可信、公开
○ 许可证级别:主体的敏感度
○ 密级:客体的敏感度
○ 强制存取控制规则:
■ 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
■ 仅当主体的许可证级别小于等于客体的密级时,该主体才能写相应的客体
自主存取控制和强制存取控制共同构成DBMS安全检查机制。 -
定义视图对安全性有什么好处:
○ 把保密的数据对无权存取的用户隐藏起来,对数据提供一定程度上的保护。
○ 简介实现支持存取谓词的用户权限定义 -
审计:
○ 启用一个专用的审计日志,将用户对数据库的所有操作都记录在上面
○ 审计员利用审计日志监控数据库中的各种行为,找出非法存取数据的人、时间、内容
--对修改sc表结构和数据操作进行审计
audit alter,update
on sc;
--取消对sc表的一切审计
noaudit alter,update
on sc;
- 数据加密:
○ 防止数据库在数据存储和传输中失密
○ 基本思想:按一定算法将原始数据(明文)变换为不可识别格式(密文)
○ 方法:存储加密、传输加密
第五章 数据库完整性
- 数据库的完整性:防止数据库中存在不符合语义的数据。
○ 数据的正确性:数据符合现实语义,反映实际状况
○ 数据的相容性:数据库同一对象在不同关系表中的数据是符合逻辑的 - 数据库的安全性:保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 。
- 二者相同点:都是对数据库中的数据进行控制,各自所实现的功能目标不同。
- 关系数据库中有哪些类型的完整性?
○ 实体完整性
○ 参照完整性
○ 用户自定义完整性 - 实体完整性的含义及其定义方法 :
○ 在create table
中primary key
定义
○ 单属性构成的码:定义为列级约束条件or 表级约束条件
○ 多属性构成的码:只能定义为表级约束条件
--将表sc中sno cno属性组定义为主码
create table sc(sno char(9) not null,cno char(4) not null,primary key(sno,cno)
);
- 参照完整性含义及其定义方法:
○ 在create table
中foreign key
定义哪些为外码,references
定义外码参照哪些表 - 参照完整性的违约处理方法:
a. 拒绝执行(默认)
b. 级联操作
c. 设置为空值(需要定义外码列是否可以为NULL)
--定义sc中参照完整性
create table sc(sno char(9) not null,cno char(4) not null,grade smallint,primary key(sno,cno), --表级定义实体完整性foreign key(sno) references s(sno),forrign key(cno) references c(cno)
);
- 用户自定义的完整性的定义方法:
create table dept(deptno numeric(2),dname char(9) unique not null,--列值唯一且不能取空值primary key(deptno)
);create table s (sno char(9) primary key,sex char(2) check (sex in ('男','女')),--性别只允许取男 or 女
);create table sc(grade smallint check (grade>=0 and grade<=100)--取值范围[0,100]
);--当学生性别是男时候,名字不能以Ms.开头
create table s(sno char(9) primary key,sname char(9) not null,ssex char(2),check(ssex='女' or sname not like 'Ms.%')
);--格式:
constraint 完整性约束条件名 完整性约束条件
--完整性约束条件:
not null \ unique \ primary key \ foreign key \ check--老师工资不低于3000
create table teacher(eno numeric(4) primary key,ename char(10),sal numeric(7,2),--工资deduct numeric(7,2),--扣除项deptno numeric(2),constraint c1 foreign key(deptno) references dept(deptno),constraint c2 check(sal+deduct>=3000)
);
第六章 关系数据理论
- 为什么要进行规范化设计?(关系模式中存在的问题)
○ 数据冗余太大,浪费存储空间
○ 更新异常
○ 插入异常
○ 删除异常 - 函数依赖:对于一个属性集U上的关系模式R(U),X和Y是U的子集,如果对R(U)的任意一个可能关系r,r中不可能存在两个元组在X上的属性值相同,而在Y上的属性值不等,则成函数X确定Y。
- (非)平凡函数依赖:在关系模式R(U)中,对于U的子集X和Y,
X→Y,但Y ∈ X,则称X→Y是非平凡的函数依赖
X→Y,但Y ∈ X, 则称X→Y是平凡的函数依赖 - **完全(部份)函数依赖:**在关系模式R(U)中,
对于X的任何一个真子集X’,都有X’不确定Y, 则称Y对X完全函数依赖,记作X —F—>Y。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X —P—>Y。 - 传递函数依赖:
- 码:K是R<U,F>中的属性或属性组和,如果K—F—>U,则称K为R的候选码。
- 主码:多个候选码,选定其中一个为主码。
- 主属性:包含在任何一个候选码中的属性都为主属性。
- 非主属性:不包含在任何码中的属性。
- 全码:当整个属性组是码的时候,称为全码。
- 外码:F是基本关系R的一个或一组属性,但不是关系R的码,如果F域基本关系S的主码Ks,对应,则称F是R的外码。
● 函数依赖:x确定y
● 平凡函数依赖 + 非平凡函数依赖:
○ 平凡函数依赖:x确定y,y属于x
○ 非平凡函数依赖:x确定y,y不属于x
● 完全函数依赖 + 部分函数依赖:
○ 完全函数依赖:只有完整的x才能确定y F
○ 部分函数依赖:部份x都能确定y P
● 传递函数依赖:x非平凡函数确定y,y不确定x,y非平凡函数确定z,z对x传递函数依赖
-
规范化理论:通过分解关系模式,来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常、数据冗余问题。
-
规范化:一个低一级范式的关系模式通过模式分解转化为若干个高一级范式的关系模式的集合的过程。
-
1NF:关系模式R的所有属性都是不可分的基本数据项(对关系模式的基本要求)
-
2NF:关系模式R属于第一范式,每一个非主属性 都 完全函数依赖 于R的主码。
○ 1NF ->2NF方法:投影分解:将部分函数依赖的非主属性和部份主码拿出来另开一个表。 -
3NF:关系模式R属于第一范式,不存在 非主属性 对 主属性的 传递函数依赖。
(可能会存在主属性对码的部份依赖和传递依赖)
○ 获得3NF方法:投影分解:非主属性除了完全依赖于码以外,还传递依赖于码。将中间传递的y和z开一个表,x和y开一个表 -
BCNF:
○ 所有非主属性对每一个码都是完全函数依赖
○ 所有主属性对每一个不包含他的码都完全函数依赖
○ 没有任何属性完全函数依赖于非码的任何一组属性
○ -
4NF:去除非平凡非函数依赖的多值依赖。
-
掌握数据依赖的公理系统,能求解闭包和最小依赖集。
第七章 数据库设计
- 数据库设计包括哪些基本步骤?
○ 需求分析:综合各个用户的应用需求
○ 概念结构设计:将用户需求抽象为独立于机器特点、独立于数据库管理系统的概念模式(E-R图)
○ 逻辑结构分析:将E-R图转化为数据模型,形成数据库逻辑模式。
○ 物理结构分析:进行物理存储安排,建立索引,形成数据库内模式。
○ 数据库实施:构建数据库,编写和调试应用程序,试运行
○ 数据库的运行和维护:投入正式运行,不断评估调整修改。
设计一个完善的数据库系统往往是上述六个阶段的不断反复。 - 数据字典:数据库中对数据的描述,即元数据,不是数据本身,是数据的数据。
- 数据字典内容:数据项、数据结构、数据流、数据存储、处理过程
- 实体和属性的划分:
a. 属性必须是不可再分的数据项,不能包含其他属性
b. 属性不能与其他实体具有联系
第八章 数据库编程 - 主变量:在SQL语句中使用的主语言程序变量。用于主语言向SQL语言提供参数。
- 嵌入式SQL中引入游标的作用:
○ SQL语言和主语言具有不同的数据处理方式,SQL语言是面向集合的,一条SQL语句原则上可以产生和处理多条记录,而主语言是面向记录的,一组主变量只能存放一条记录。
○ 仅使用主变量无法完全满足SQL语句的输出数据的要求,因此引入游标,来协调这两种不同的数据处理方式。 - 如何协调SQL语言的集合处理方式和主语言的单记录处理方式?
○ 使用游标,将集合操作转换成单记录处理方式。 - ODBC编程的基本步骤:
a. 配置数据源
b. 初始化环境
c. 建立连接
d. 分配语句句柄
e. 执行SQL语句
f. 结果集处理
g. 中止处理 - 存储过程:由过程化SQL语句书写的过程,经编译和优化后存储在数据库服务器种,使用时只要调用即可。
- JDBC:
● 用于执行SQL语句的Java API的面向对象的应用程序接口
● 通过一组Java 接口实现其目标
● 可以做三件事:与数据库建立连接、创建SQL语句对象并执行、返回结果数据集并提取数据给高级语言程序。
第九章 关系查询处理和查询优化
- 查询优化:
○ 代数优化:将关系代数表达式转化为等价的表示,通过调整操作顺序优化查询效率
○ 物理优化:存储路径和底层操作算法的选择 - 查询树的启发式优化规则:
2.1. 选择运算尽可能先做
2.2. 执行连接前对关系适当预处理,在连接的属性上建立索引和对关系排序,再进行连接
2.3. 投影和选择运算同时进行
2.4. 把投影同其前后的双目运算(笛卡尔乘积,自然连接)结合起来
2.5. 把某些选择同在他前面要执行的笛卡尔积结合起来,成为一个连接运算。(连接比笛卡尔积更省时间)
2.6. 找出公共子表达式
第十章 数据库恢复技术
- 事务:
○ 用户定义的一个数据库操作序列
○ 不可分割的工作单位
○ 是恢复和并发控制的基本单位 - 事务有哪些特性:
○ 原子性:事务中的一组操作要么都做,要么都不做
○ 一致性:数据库只能从一个正确的一致性状态转到另一个正确的一致性状态
○ 隔离性:一个事务的执行不能被其他事务打扰
○ 持久性:事务一旦提交,他对数据库数据的修改是永久的 - 事务和程序比较:
○ 事务:可以是一个或多个SQL语句,也可以是一个或多个程序
○ 程序:一个程序通常包含多个事务。 - 故障的种类:
○ 事务故障:运算溢出、事务撤销
■ 恢复策略:rollback,强行回滚该事务,即撤销该事务已经做出的对数据库的修改,好像该事务没有被启动一样。
■ 反向扫描,逆操作,直至读到事务的开始标记。
○ 系统故障:系统故障、缓冲区信息丢失、不破坏数据库
■ 恢复策略:系统重新启动时,所有非正常终止的事务回滚rollback,即撤销所有未完成事务;所有已经提交的事务重做redo。
■ 正向扫描分类,反向扫描逆操作or正向扫描重做
○ 介质故障:磁盘损坏、强磁场干扰
■ 恢复策略:装入发生介质故障前的数据库副本,redo重做自备份相应副本数据后的所有成功事务,将这些事务已提交的更新结果反映到数据库中去。
○ 计算机病毒
■ 恢复策略:通过数据库的安全机制、审计机制等实现对数据的授权访问和保护
○ 影响事务:事务故障、系统故障、介质故障
○ 影响数据库数据:介质故障、计算机病毒 - 数据库中为什么要有恢复子系统?它的功能是什么?
○ 计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此必须要有恢复子系统。
○ 功能:把数据库从错误状态恢复到某一已知的正确状态。 - 数据库恢复的基本技术有哪些?
○ 数据转储:数据库管理员定期将整个数据库赋值到磁带、磁盘或其他存储介质上保存起来的过程。
○ 登记日志文件:记录事务对数据库的更新操作的文件
■ 日志文件用途:
● 进行事务故障恢复
● 进行系统故障恢复
● 协助后备副本进行介质故障恢复 - 为什么先写日志文件后写数据库?
○ 因为如果先写了数据库修改,而在日志文件中没有登记下这个修改,两个操作之间发送了故障,以后就无法恢复修改了。
○ 如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,不会影响数据库的正确性。 - 具有检查点的恢复技术:
○ 在日志文件中增加检查点记录
○ 增加重新开始文件
○ 恢复子系统在登陆日志文件期间动态地维护日志 - 检查点记录内容:
○ 建立检查点时刻,所有正在执行的事务清单
○ 这些事务最近的一个日志记录的地址 - 为什么需要检查点?
○ 没有检查点技术之前,恢复时需要搜索整个日志文件,耗费时间很多,
○ 重做处理,重新执行,耗费大量时间 - 重新开始文件内容:各个检查点记录在日志文件中的地址
- 检查点方法进行恢复的步骤:
a. 在重新开始文件中找到最近检查点在日志文件中的地址,找到最近检查点的记录。
b. 由该检查点的记录获得检查点建立时刻所有正在执行事务清单,建立undo redo事务队列
c. 从检查点开始正向扫描日志文件,根据是否提交选择重做或撤销
d. 对队列执行事务操作
第十一章 并发控制 - 并发控制可以保证事务的一致性和隔离性。
- 并发操作带来的数据不一致性:
○ 丢失修改:两个或多个事务都读取了同一数据值并修改,最后提交事务的执行结果覆盖了前面提交事务的执行结果,从而导致前面事务的更新被丢失。
○ 不可重复读:事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
○ 读脏数据:事务T1修改了某一数据,写入磁盘,事务T2读取数据,然后T1因为某原因被撤销,此时T1修改的数据恢复原值,但此时T2读到的值与数据库里不一致。 - 并发控制的主要技术:
○ 封锁
○ 时间戳
○ 乐观控制法
○ 多版本并发控制 - 封锁:事务T在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁后,事务T就对这个数据有了一定的控制权,在事务T释放锁之前,其他事务不能对该数据进行更新或读取。
- 三级封锁协议:
○ 一级封锁协议:事务修改数据R之前必须先对其加X锁,直到事务结束才释放。
○ 实现防止丢失修改。
○ 二级封锁协议:一级封锁协议+事务T在读取数据R之前必须先对其加S锁,读完后可释放S锁。
○ 实现防止丢失修改和读脏数据。
○ 三级封锁协议:一级封锁协议+事务T在读取数据R之前必须先对其加S锁,直到事务结束后才可释放S锁。
○ 防止丢失修改、读脏数据、不可重复读。 - 活锁:某一事务永远处于等待状态
- 解决办法:
○ 采用先来先服务的策略
○ 当多个事务请求封锁同一数据对象时,按请求封锁的先后次序对这些事务排队,一旦数据对象的锁被释放,就首先批准申请队列中第一个事务获得锁。 - 死锁:两个或多个事务都已封锁了一些数据对象,然后又都请求对已被其他事务封锁的数据对象加锁,从而出现循环死等待。
- 预防死锁:一次封锁法+顺序封锁法
- 死锁的诊断:超时法+等待图法
- 死锁的解除:选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁,使其他事务能继续运行下去。
可串行化调度
冲突可串行化调度
两段锁协议:指所有事务必须分两个阶段对数据项加锁和解锁。
● 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
● 在释放一个封锁之后,事务不再申请和获得任何其他封锁。
判断一个并发调度是不是冲突可串行化调度。
冲突操作:不同事务对同一数据的写写/读写操作
● 为什么要引进意向锁? 意向锁的含义是什么?
○ 引进意向锁是为了提高封锁子系统的效率。
○ 原因是:在多粒度封锁方法中,一个数据对象可能以两种方式加锁—显式封锁和隐式封锁。因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突;还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突;显然,这样的检查方法效率很低。为此引进了意向锁。
○ 意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。
什么是封锁协议?
● 运用封锁技术对数据加锁时,要约定一些规则。例如,在运用X锁和S锁对数据对象加锁时,要约定何时申请X锁或S锁、何时释放封锁等。这些约定或者规则称为封锁协议。对封锁方式约定不同的规则,就形成了各种不同的封锁协议。