第一章 绪论
- 4个基本概念:数据、数据库、数据库管理系统、数据库系统
- 数据:描述事物的符号记录
- 数据的含义称为数据的语义
- 计算机系统层次结构:硬件、操作系统、数据库管理系统、应用开发工具、应用系统
- 数据库发展阶段:人工管理阶段、文件系统阶段、数据库系统阶段。从文件系统到数据库系统标着着数据管理技术的飞跃。
- 数据库是计算机的基础软件
- 数据库系统特点:
- 数据结构化
- 数据共享性高、冗余度低且易扩充
- 数据独立性高
- 物理独立性:指用户的应用程序与数据库中数据的物理储存时相互独立的。
- 逻辑独立性:指用户的应用程序与数据库的逻辑结构是相互独立的。
- 数据由数据库管理系统统一管理和控制
- 数据模型: 是数据库系统的核心和基础。描述了系统的静态特性、动态特性和完整性约束条件。
- 第一类:概念模型
- 第二类:逻辑模型和物理模型
- 概念模型表示法:实体联系方法:用E-R图表示。
- 数据模型的组成要素:
- 数据结构
- 数据操作
- 数据的完整性约束条件
- 常用数据模型:
- 层次模型
- 网状模型
- 关系模型:最重要的数据模型,是用二维表的形式表示实体和实体间联系的数据模型。
- 面向对象数据类型
- 对象关系的数据模型
- 半结构化数据模型
- 实体:客观存在且相互可区别的事物。实体间联系:一对一、一对多、多对多。
- 基本层次联系:指两个记录以及它们之间一对多(包括一对一)的联系。
- 关系模型要求关系必须是规范化的。
- 模式:是数据库中全体数据的逻辑结构和特征的描述。只涉及“型”,不涉及值。
- 实例:模式的一个具体值。
- 模式是相对稳定的、实例是相对变动的。
-
三级模式结构:
- 模式,也称为逻辑模式
- 外模式,也称为子模式或用户模式。
- 内模式:也曾内存储模式。一个数据库中只能有一个内模式。
- 两种映像:外模式/模式映像、模式/内模式映像。
第二章 关系数据库
- 数据模型一般来说是由三个部分组成:
- 数据结构
- 数据操作
- 数据约束
- 域:一组具有相同数据类型的值的集合。
- 一个域允许不同取值的个数称为这个域的基数。
- 候选码:某一个属性组的值能唯一标识一个元组,而其子集不能,成该属性组为候选码。
- 多个候选码,选定其中一个为主码
- 主属性:候选码的诸属性。
- 非主属性(或非码属性):不包含在任何候选码中的属性。
- 关系的三种类型:
- 基本关系(基本表或基表)
- 查询表
- 视图表
- 基本关系的六个性质:
- 列的顺序无所谓。
- 行的顺序无所谓。
- 不同列可以来自同一个域。
- 无限关系是无意义的。
- 候选码不能重复
- 分量必须取原子值(即不能再分割)【最基本的一条】
- 关系的完整性(约束):
- 实体完整性:主属性不能取空值
- 参照完整性。
- 用户自定义完整性。
关系代数
- 传统集合运算:
- 并(union):列还是那么多列,只不过把一行行的数据条做了整合。
- 差(except):把某些数据行去掉
- 交(union):列还是那么多列,数据条做整合,取属于两个表公有的。
- 笛卡尔积:n1×m1的表和n2×m2的表作乘积后为 (n1+n2)×(m1+m2)。
- 专门关系运算:
- 选择:
等价于
select * from R where F;
如δ_Sage<20(Student)
表示select * from Student where Stage<20
。
- 投影:
等价于:
select A from R;
如π_Sage,Sdept(Student)
为select Sage,Sdept from Student
。
- 连接:
等价于:
select R.*,S.* from R,S where AθB;
如Student(Student.Sno=SC.Sno)SC
等于select Student.*,SC.* from Student,SC where Student.Sno=SC.Sno
。
- 除运算
第三章 关系数据库标准语言SQL
- 创建表
create table 表名(
列名 数据类型 not null, //非空性约束
列名 数据类型 unique, //唯一性约束
列名 数据类型 check(检查条件),//检查性约束
............
constraint 主键名 primary key(主属性列表),
constraint 外键名 foreign key (外键属性列表) references 被参考表名(参考列),
constraint 检查名 check(校验条件)
)
- 常用查询条件:
= , > , < , >= , <= , != , <>(也是不等于), !> , !< , not+上述运算符
-
between and , not between and
- 如
where age between 18 and 20;
等价于where age <=18 and age<=20;
- 如
in , not in
-
like , not like
-
like
可以当做=
用以比较字符串,也可以使用通配符来模糊匹配字符串。%
表示匹配0个或多个字符,_
匹配一个。\%
用来转义百分号,以此类推。
-
-
is null,is not null
- 空值不能用
=null
判断。因为null
不等于任何值。
- 空值不能用
and , or , not
- where子句中不能*加聚集函数。
- 带有ALL(SOME)以及SOME的谓词的子查询
....
where Sage<ANY(select Sage from.........) //有的将ANY写为SOME
表示Sage小于后面子查询中的某一个值。
....
where Sage<ALL(select Sage from.........)
表示Sage小于后面子查询中的任何一个一个值。
- EXISTS和NOT EXISTS谓词子查询
....
where exists (select .........)
当后面的子查询结果集不为空时,exists返回true
,否则返回false
。
not exists和exists刚好相反。
- 插入数据
insert into 表名 (属性名,属性名,...) values (值1,值2,.....) //属性名列表可省略
- 修改数据
update 表名 set 列名=表达式,列名=表达式,..... where 条件
- 删除数据
delete from 表名 where 条件。
- 空值运算:表达式中只要含有空值,其结果就是空值。
- 视图
- 视图是从一个或几个基本表(或视图)导出的表,它是一个虚表而不是基本表。
- 数据库中只存放视图的定义而不存放试图定义的数据。视图的定义存储在数据字典中。基本表删除的话,视图还会保留,但是因为它是引用的数据,当数据源(基本表的数据)已经不存在时,视图就无法使用了。
- 建立一个视图
create view 视图名(列名列表)
as
select ....
from ...
where ...
[with check option;]
其中,如果使用了
with check option```则对该视图进行插入删除修改的操作时,系统自动加上where中的那个条件。
- 一个视图:①从单个基本表中导出;②去掉了某些行列但保留了主码。这样的视图交行列子集视图。
- 视图是虚表,所以对视图的更新最终要转换为对基本表的更新。不是所有视图都是可更新的。一般的, 行列子集视图是可更新的,只有对行列子集视图的数据更新和查询操作才能够正确转换和执行。
- 视图消解 :从数据字典中取出视图的定义,再把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后在执行了修正的查询,这一过程称为视图消解。
第四章 数据库安全性
- 数据库安全性:保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
- 不安全因素和应对措施:
- 非授权用户对数据库的恶意存取和破坏:用户身份鉴别、存取控制、视图等。
- 数据库中重要或敏感数据被泄露:强制存取控制、数据加密储存、加密传输等、
- 安全环境脆弱性:加强计算机系统的安全性保证。
- 自主存取控制方法:
- 用户权限:数据库对象和操作类型组成。
- 授权:
grant select,update(sno)
on table Student
to user1;
把select、sno列上update权限授予用户user1
grant all privileges
on table Student,Course
to user1,user2
with grant option;
```
把Student,Course上的全部权限授予user1、user2,并且,with grant option;表示允许user1、user2继续向别人授予这些权限。
- 收回权限
revoke select
on table SC
from public;
把授予**全部用户**在SC上的修改权限收回。
revoke insert
on table SC
from user1 cascade;
```
假定user1把insert权限此前授予别人,则收回user1权限同时,cascade表示将user1授予别人的权限也都收回来。
- 角色:角色是被命名的一组与数据库操作相关的权限。角色是权限的集合。
- 创建角色
create role 角色名
- 给角色授权
grant 权限,权限....
on 对象(表名)
to 角色1,角色2
- 将一个角色授予其他的用户
grant 角色1,角色2,...
to 其他角色,用户,.....
[with adimin option]
其中,[with adimin option]可以让被授权者把这种权限授予给其他角色。
- 角色权限收回
revoke 权限,......
on 对象(表名)
from 角色1,,角色2,.......
- 强制存取控制方法
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分割整体,只有符合密级标记要求的用户才可以操纵数据,从而提高安全级别。
第五章 数据库完整性
- 参照完整性检查和违约处理:当外键所在的子表和被参照的父表发生数据不一致时,有以下策略:
- 拒绝执行(默认)
- 级联操作
- 设为空值
foreign key(Sno) references Student(Sno)
on delete cascade /*当删除Student表的Sno时,该表的Sno对应数据也删除*/
on update cascade /*当更新Student表的Sno时,该表的Sno对应数据也更新*/
- 关于完整性约束的SQL语句、约束条件命名子句,参考:第三章 关系数据库标准语言SQL——创建表一节
第六章 关系数据理论
- 数据依赖中,最重要的是函数依赖和多值依赖。
- 关系模式可能存在问题:
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
- 一个好的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应该尽可能地少。
- 规范化:一个低一级的范式的关系模式通过模式分解,转换为若干个高一级的范式的关系模式集合的过程。
- 第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。简而言之,第一范式就是无重复的列。第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
- 第二范式:若R∈1NF,每一个+非主属性+完全函数依赖于+任何一个+候选码,则R属于2NF。
不满足第二范式会发生:
- 插入异常
- 删除异常
- 修改复杂
- 第三范式:不存在这样的码X、属性组Y和非主属性Z,使得X→Y,Y→Z成立且X不依赖于Y,则它是第三范式。若R是第三范式,那么也是第二范式。
- BCNF:若X→Y且X不包含Y时,X中必定含有码,则属于BCNF。
考虑R(A,B,C),函数依赖:(A,B)→C,(B,C)→A,显然(A,B)、(B,C)都可以作为候选码,这个关系模式中没有属性对码的传递依赖和部分依赖,所以它是第三范式,而且除了(A,B)、(B,C)没有其他决定因素,所以它也是BCNF。 - 总体来说:
- 第一范式+没有非主属性对码的部分函数依赖=第二范式
- 第二范式+没有非主属性对码的传递函数依赖=第三范式
- 第三范式+没有主属性对码的部分和传递依赖=BCNF
- BCNF+没有非平凡和非函数依赖的多值依赖=第四范式
- 多值依赖:设U=X+Y+Z,多值依赖X→→Y成立,当且仅当,给定一对(x,z),就有一组Y值与之对应,且它至于x有关,与z无关。这就是说(x,z)给定以后,就有一组y也确定;当保持x不变之变z,则这组y值仍保持不变;一旦x发生变化,则y值可能发生变化;即这组y值发生变化的充分条件是x发生了变化。
- 平凡的多值依赖:上述中Z∈∅。
- 多值依赖具有:
- 对称性:若X→→Y,则X→→Z,其中U=X+Y+Z
- 传递性:若X→→Y,Y→→Z,则X→→Z-Y
- 函数依赖是特殊的多值依赖(平凡的多值依赖):若X→Y,则X→→Y,且此时若Y'∈Y,则X→→Y',反之不成立。
- 模式分解的三种不同定义
- 具有无损连接性:一定能到达第四范式
- 保持函数依赖:此时模式分解一定能到达第三范式,但不一定到BCNF
- 既要保持函数依赖,也要有无损连接性:可以到达第三范式,但不一定到BCNF
第七章 数据库设计
- 基本步骤:
- 需求分析
- 概念结构设计
- 逻辑结构设计
- 物理结构设计
- 数据库实施
- 数据库运行和维护
第十章 数据库恢复技术
- 事务:一个数据库操作序列,要么都做,要么都不做。
- 事务的ACID特性:
- 原子性
- 一致性
- 隔离性
- 持续性
- 故障种类:
- 事物内部故障
- 系统故障(软故障)
- 介质故障(硬故障)
- 计算机病毒
- 数据库的恢复技术
- 数据转储:定期将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程。
* 静态增量/静态海量转储
* 动态增量/动态海量转储
- 登记日志文件
- 恢复子系统(检查点方法)
第十一章 并发控制
- 事务是并发控制的基本单位
- 事务并发的种类:
- 交叉并发
- 同时并发
- 并发出现的三类问题:
- 丢失修改
- 不可重复读
- 脏读数据
- 并发的主要技术:
- 封锁(基本方法)
- 时间戳
- 乐观控制法
- 多版本并发控制
- 封锁
- 排它锁(X锁、写锁):其他事务不能再加任何类型的锁
- 共享锁(S锁、读锁):可读但不可修改,其他事务只能再加S锁但不能再加X锁,直到目前释放为止。
- 封锁协议
- 一级封锁协议(防止丢失修改,保证事务可恢复):事务T修改数据R之前必须先加X锁,事务结束(commit OR rollback)后释放
- 二级封锁协议(防止丢失修改,保证事务可恢复,进一步防止脏读数据):一级封锁协议之上,再加上:事务T读取数据之前加读锁S,读完后释放
- 三级封锁协议(防止丢失修改,保证事务可恢复,防止脏读数据,防止不可重复读):一级封锁协议之上,增加:事务T在读取数据之前必须加S锁,事务结束后释放
- 活锁:某个事务可能永远等待。解决方法:先来先服务的策略。
- 死锁:两个事务相互等待,永远不可能结束。解决方法:选择一个处理死锁代价最小的事务,将其撤销,释放此事务的所有锁,将其他事务得以运行。
- 可串行化调度:多个事务的并发是正确的,当且仅当其结果与按照某一顺序的串行执行这些事务的结果相同。
- 两段锁协议:可串行化调度的充分不必要条件
- 第一阶段:获得锁,也就是扩展阶段
- 第二阶段:释放锁,也就是收缩阶段
- 封锁粒度:封锁对象大小叫做封锁粒度。