1. 数据模型
1.1 概念数据模型
概念数据模型一般用 E-R 图表示,常用术语如下:
- 实体:客观存在的事物,如:一个单位、一个职工、一个部门、一个项目。
- 属性:学生实体有学号、姓名、出生日期等属性。
- 码:可以唯一标识实体的属性,如学生的学号。
- 域:属性的取值范围,如:性别的域为(男,女)。
- 实体型:实体名和属性名集合,如:学生(学号,姓名,性别,班号)。
- 实体集:同一类实体的集合,如:全体学生。
- 联系:实体(型)之间的对应关系。联系分为两种:实体内各属性之间的联系、实体之间的联系。
两个实体之间的联系有 3 种类型:一对一(1:1)、一对多(1:n)、多对多(m:n)
E-R 图提供了表示实体、属性、联系的方法。实体用矩形表示,属性用椭圆表示,联系用菱形表示,联系也可能有属性。
1.2 结构数据模型
结构数据模型是面向数据库的逻辑结构,任何一个 DBMS(数据库管理系统)都是以某个结构数据模型为基础。
结构数据模型主要包括:
- 层次模型(树结构)
- 网状模型(图结构)
- 关系模型:用二维表格结构来表示实体之间的联系
- 面向对象模型
下面描述的就是关系模型:
教师(教师编号,姓名,性别,所在系名)
课程(课程号,课程名,任课教师编号,上课教室)
2. 三级模式和两级映像
数据库产品有很多,但体系结构大都具有相同的特征,采用 “三级模式和两级映像”。
三级模式包括:
- 外模式(用户模式、子模式):对应视图,用户操作的就是外模式
- 概念模式(模式):对应基本表
- 内模式(存储模式):对应存储文件
两级映像
数据库在三级模式之间提供了两级映像:外模式/模式映像、模式/内模式映像。两级映像保证了数据库中的数据具有较高的逻辑独立性和物理独立性。
外模式/模式映像:存在于外部级和概念级之间,实现了外模式和概念模式的相互转换。
模式/内模式映像:存在于概念级和内部级之间,实现了概念模式和内模式的相互转换。
逻辑独立性:数据的逻辑结构改变后,用户程序不用修改。但是为了保证应用程序能正确执行,需要修改外模式和概念模式之间的映像。
物理独立性:数据的内模式发生改变后,数据的逻辑结构不用变。为了保证应用程序能正确执行,需要修改概念模式和内模式之间的映像。
3. 关系模型
3.1 基本术语
- 关系:一个关系就是一个二维表,表明就是关系名
- 元组:二维表中的一行记录
- 属性:二维表的列
- 域:属性的取值范围,如性别的取值是男或女
- 关系模式:由关系名及其属性名集合构成,如:S(Sno, Sname, SD, Sage, Sex) 表示学生关系模式
- 候选码/候选键:能够唯一标识一个元组的属性或属性组合
- 主码/主键:从多个候选码中选择一个作为主码。
- 主属性:包含在候选码中的属性为主属性,不包含在任何候选码中的属性为非主属性。
- 外码/外键:一个属性并非当前关系中的主键,而是其他关系中的主键
- 全码:所有属性的组合才能唯一标识当前的元组
- 超码/超键:学号是码,则(学号, 姓名)是超码
3.2 关系模型的定义
关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。
关系数据结构:二维表格。
关系操作集合:选择、投影、连接、除、并、交、差等查询操作和增加、删除操作等。
关系完整性约束:
- 实体完整性:关系中主码不能为空或部分为空。
- 参照完整性:外码必须在以它为主键的表中能找到,或者为空(员工刚入职,部门可以为null)。
- 用户定义完整性
4. 关系代数
4.1 关系代数表达式
笛卡尔积
并:两个关系取并集
差:从关系 R 中删除与关系 S 中相同的元组,记为 R-S
交:两个关系取交集
投影:
选择:
连接
(1)θ 连接:在笛卡尔积的基础上进行条件运算,可以是 >、<、≥、≤
(2)等值连接:在笛卡尔积的基础上进行条件运算,只能是 =
(3)自然连接(最重要):所有公共列的属性都相同,则合并为一条记录
(第一行开始,分别与第二个表的每一行比较)
原本的原理:
没有公共属性列时,自然连接退化为笛卡尔积。
左外连接:保留自然连接中左侧表丢失的元组
右外连接:保留自然连接中右侧表丢失的元组
全外连接:自然连接后,既保留左侧表丢失的元组,又保留右侧表丢失的元组
题目:
4.2 投影、选择转 SQL
注意:select 后面不能像关系代数表达式中一样将列写成 1、2、3
4.3 笛卡尔积转 SQL
4.4 自然连接转 SQL
5. SQL:数据定义语言、数据操纵语言
SQL 语言按照用途可以分为:
- DDL:数据定义语言,创建或删除数据库对象(表、索引、视图),包括 create、alter、drop
- DML:数据操纵语言,包括 insert、delete、update
- DQL:数据查询语言,包括 select
- DCL:数据控制语言,包括数据库对象的事务管理和权限管理
5.1 数据定义语言 create、alter、drop
(1)创建数据库
create database 数据库名
(2)创建表
create table 表名(列名 数据类型[列级完整性约束条件][,列名 数据类型[列级完整性约束条件]]...[,表级完整性约束条件]
);
定义列时使用的基本数据类型如下:
- integer:整数,也可写成 int
- float(n):浮点数,精度至少为 n 位数字
- numeric(p,d):定点数,由 p 位数字(不包括符号、小数点)组威,小数点后面有 d 位数字。也可写成 decimal(p,d) 或 dec(p,d))
- char(n):长度为 n 的定长字符串
- datetime:日期时间型
create table Student (Sno char(9) primary key,Sname char(20),Ssex char(2),Sage int
);
完整性约束主要有 3 种子句:
- 主键子句(PRIMARY KEY),对应实体完整性
- 外键子句(FOREIGN KEY),对应参照完整性
- 检查子句(CHECK),对应用户定义完整性
create table student(-- 设置主键sno char(9) primary key,name char(20) not null,sex char(2) default '男',age int check(age>18 and age<30),email vachar(20) unique,-- 设置外键cno varchar(20) foreign key references class(cno)
)
create table student(sno char(9) not null,name char(20) not null,scno char(9),--设置主键constraint pk primary key(sno,sname),--设置外键constraint fk foreign key(scno) references class(cno)
)
(3)修改基本表结构
增加一个新列
alter table student add Sdept char(10)
修改一个新列
alter table student alter column Sdept int
删除一个列
alter table student drop column Sdept
(4)删除基本表
drop table student
5.2 数据操纵语言 insert、delete、update
插入语句
insert into student (sno, name, sex, age, email, cno)
values('108', 'amy', '女', 18, '111@qq.com', '0901')
--如果values全部给出并且按顺序给出,可以省略列名
insert into student
values('108', 'amy', '女', 18, '111@qq.com', '0901')
删除语句
--如果不带where条件,将删除表中的所有记录
delete from student
where name='amy'
修改语句
--如果不带where条件,会修改所有记录的age为19
update student
set age=19,cno='0911'
where name='amy'
6. SQL:数据查询语言 select
6.1 select-from
select 语句的输出项可以是列名,或者由列名、常数和 + - * /
运算符构成的算数表达式,使用 distinct 可以使查询结果中不存在重复元组。
可以在 select 的列名后使用 as 新列名,来用新列名展示查询到的数据
select 学号 as 'sno', 姓名 as 'name', 性别 as 'sex', 班号 as 'class'
from student
from 子句中出现多个基本表或视图时,执行笛卡尔积操作。
select * from R, S
6.2 where
where 条件中可以使用的运算符:
(1)范围查询
select *
from tb_score
where score between 60 and 80
--60 ≤ x ≤ 80
--等价于
select *
from tb_score
where score≥60 and score≤80
(2)字符串的匹配运算
%
代表任意长度的字符串(长度可以为 0),如 a%b 可以匹配 acb、acdeb 等。_
代表任意单个字符,如 a_b 可以匹配 acb、adb 等。
--查询姓王的学生的信息
select * from student where name like '王%'
-- 也可以使用 not like 来查询不姓王的记录
(3)查询在集合中的记录
--查询成绩为 85, 86, 88 的记录
select * from tb_score
where score in (85, 86, 88)
--也可以使用 not in 查询其他记录
(4)逻辑组合运算
--查询班级为09031或性别为女的学生
select sno, name, cno from student
where cno='09031' or sex='女'
(5)空值比较运算
select * from tb_score where score is null
--也可以使用is not null来查询score不为null的记录
6.3 order by
order by 必须是 select 命今中的最后一个子句。
以学号降序查询学生信息:
select sno, name, cno from student
where sex='男'
order by sno desc
--asc是升序,desc是降序,不指定就是默认升序
以课程号升序、分数降序查询所有记录:
select * from tb_score
order by courseid, score desc
6.4 聚合函数
聚合函数针对一组值进行计算并返回单一的值,常与 group by 一起使用,常用的聚合函数如下表:
统计 900331 班有多少人:
select count(*) as '人数'
from student
where cno='09031'
--如果某条记录的cno为空,
-- select count(cno)不会统计cno列为空的记录
-- select count(*)会统计
统计所有学生来自几个班级:
select count(distinct cno) as classnum
from student
统计 6-116 课程的平均分:
select avg(score) as '6-116课程平均分'
from tb_score
where courseid='6-116'
6.5 group by
投影中除了聚合函数列,其他列都要加在 group by 后面用于分组
查询每个课程的总分、平均分:
select 课程号, sum(分数), avg(分数) from score
group by 课程号
查询最低分大于70,最高分小于90的学生的学号:
select sno from tb_score
group by sno
having min(score)>70 and max(score)<90
条件中包含聚合函数,必须使用 having 子句,不能使用 where 子句
查询最高分与最低分相差大于 12 分的课程号:
select courseid as '课程号', max(score) as '最高分', min(score) as '最低分'
from tb_score
group by courseid
having max(score)-min(score)>12
6.6 子查询
一个子查询的返回值为多行时,雷要使用 ANY、ALL、IN 和 NOT IN 等。
(1)查询与学号为105的同学同年出生的所有学生的学号、姓名和出生日期列
select 学号, 姓名, year(出生日期) as '出生年份'
from student
where year(出生日期)=(select year(出生日期) from student where 学号='105')
(2)查询学生人数多于5人的某课程的任课教师姓名
select 姓名
from teacher
where 教师编号 in(select x.任课教师编号from course x, score ywhere x.课程号=y.课程号group by x.任课教师编号having count(x.任课教师编号)>5)
(3)查询选修 3-105 课程且成绩高于任意选修 3-245 课程的学生的课程号、学号和分数,并按分数从高到低次序排列。
select 课程号, 学号, 分数
from score
where 课程号='3-105' and 分数 > Any(select 分数 from score where 课程号='3-245'
)
order by 分数 desc
(4)查询选修 3-105 课程,且成绩高于 3-245 课程的学生的课程号、学号和分数。
select 课程号, 学号, 分数
from score
where 课程号='3-105' and 分数 > All(select 分数 from score where 课程号='3-245'
)
(5)查询成绩比课程平均成绩低的学生的学号、课程号、分数
select 学号, 课程号, 分数
from score a
where 分数 < (select avg(分数) from score b where b.课程号=a.课程号
)
(6)查询所有任课教师的姓名和系别
exist:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则 exist 子句返回 true,这一行可作为外查询的结果行,否则不能。
select 姓名, 系别
from teacher
where exists(select * from course where course.任课教师编号=teacher.教师编号
)
(6)查询所有未任课教师的姓名和系别(还是上面的表)
select 姓名, 系别
from teacher
where not exists(select * from course where course.任课教师编号=teacher.教师编号
)
6.7 查询结果的并、交、差
union:查询所有教师和学生的姓名、性别、出生年份
select 姓名, 性别, year(出生年份) as '出生年份'
from teacher
union
select 姓名, 性别, year(出生年份) as '出生年份'
from student
intersect:求交集。假如王萍既是老师,又是学生,则下面语句的运行结果就只有王萍一条记录。
select 姓名, 性别, year(出生年份) as '出生年份'
from teacher
intersect
select 姓名, 性别, year(出生年份) as '出生年份'
from student
except:从前一个集合中去掉存在于后一个集合的记录。假如王萍既是老师,又是学生,则下面语句的运行结果就是除了王萍之外,其他老师的记录。
select 姓名, 性别, year(出生年份) as '出生年份'
from teacher
except
select 姓名, 性别, year(出生年份) as '出生年份'
from student
题目:
7. SQL 访问控制
授权:
收回权限:
(1)按要求给数据库 SPJ 中的供应商 S、零件 P、项目 J 表赋予各种权限。
- 将对供应商 S、零件 P、项目 J 的所有操作权限赋给用户 User1 及 User2。
grant all privileges
on table S, P, J
to User1, User2
- 将对供应商 S 的插入权限赋给用户 User1,并允许将此权限赋给其他用户。
grant insert
on table S
to User1
with grant option
- 将数据库 SPJ 的建表权限赋给用户 User1
grant createtab on database SPJ to User1
(2)按要求回收用户对数据库 SPJ 中供应商 S、零件 P、项目 J 表的操作权限。
- 将用户 User1 和 User2 对供应商 S、零件 P、项目 J 的所有操作权限收回
revoke all privileges
on table S, P, J
from User1, User2
- 将所有用户对供应商 S 的所有查询权限收回
revoke select
on table S
from public
- 将 User1 用户对供应商 S 的供应商编号 Sno 的修改权限收回
revoke update(Sno) on table S from User1
题目:
8. 视图
视图:从一个或多个基本表(或视图)导出的虚拟表。它基于查询定义来动态地获取数据,本身不包含数据。
创建视图:
with check option:对通过视图进行的数据修改操作(update、insert、delete)进行约束。如果修改操作不满足视图创建时的 where 条件,则拒绝执行并报错。
【例】 若学生关系模式为 Student (Sno, Sname, Sage, Sex, SD, Email, Tel),建立 “计算机系” (CS表示计算机系) 学生的视图,并要求修改、插入的只有计算机系的学生。
create view cs-student
as select Sno,Sname,Sage,Sex
from student
where SD='CS'
with check option;
视图本质上是一个虚拟表,操作视图实际就是在操作基本表。
运行结果:如上面的 student 视图。
运行结果:student 视图中不会有这条数据,因为与创建视图时的where条件不符;但基本表(学生表)中会有。
运行结果:student 视图中会有这条数据,因为与创建视图时的 where 条件相符;基本表(学生表)中也会有。
运行结果:如上面的 student 视图。
运行结果:这条数据不会出现在 student 视图中,也不会出现在基本表(学生表)中,并且报错。
运行结果:这条数据会出现在 student 视图中,也会出现在基本表(学生表)中。
运行结果:修改失败并报错,因为不符合视图建立时的 where 条件。
运行结果:修改成功,因为符合视图建立时的 where 条件。
视图的删除:drop view 视图名
题目:
9. 索引
建立索引
create [unique][cluster] index <索引名>
on <表名>(<列名>[次序]...)
【例】假设供应销售数据库中有供应商 S、零件 P、工程项目 J、供销情况 SPJ 关系,希望建立 4 个索引。其中,供应商 S 中 Sno 按升序建立索引,零件 P 中 Pno 按升序建立索引,工程项目 J 中 Jno 按升序建立索引,供销情况 SPJ 中 Sno 按升序、Pno 按降序、Jno 按升序建立索引。
create unique index S-Sno on S(Sno);
create unique index P-Pno on P(Pno):
create unique index J-Jno on J(Jno);
create unique index SPJno on SPJ(Sno asc,Pno desc,Jno asc);
删除索引:drop index 索引名
内模式(存储模式):是数据物理结构和存储方式的描述,定义了内部记录的类型、索引、文件的组织方式。如:记录的存储方式是按照顺序存储,按照B树存储,还是Hash方法存储;索引按照什么方式组织;数据是否压缩存储,是否加密等。
10. 函数依赖
在关系 R<U, F> 中,R 是关系名,U 是一组属性, F 是函数依赖。
-
函数依赖:学号➡姓名,就是学号决定姓名、姓名依赖于学号、学号能唯一确定姓名
-
非平凡的函数依赖:学号➡姓名,因为姓名 ⊈ 学号,所以是非平凡的函数依赖
-
平凡的函数依赖:(学号, 姓名)➡姓名,因为姓名 ⊆ (学号, 姓名),所以是平凡的函数依赖
-
完全函数依赖:(学号, 课程号)➡成绩,学号或课程号都不能单独决定成绩,所以成绩完全函数依赖于 (学号, 课程号)。记作: ( 学号 , 课程号 ) → f 成绩 (学号, 课程号)\xrightarrow{f}成绩 (学号,课程号)f成绩
-
部分/局部函数依赖:(学号, 课程号)➡姓名,但姓名可以仅由学号决定,所以部分函数依赖于(学号, 课程号),记作: ( 学号 , 课程号 ) → p 姓名 (学号, 课程号)\xrightarrow{p}姓名 (学号,课程号)p姓名
-
传递函数依赖:学号➡姓名(姓名 ⊈ 学号),姓名➡性别,所以性别传递函数依赖于学号
-
函数依赖的推理规则:
自反律:若 X 1 ⊆ X ⊆ U X_1⊆X⊆U X1⊆X⊆U,则 X ➡ X 1 X➡X_1 X➡X1
增广律:若 X ➡ Y X➡Y X➡Y, Z Z Z⊆U,则 X Z ➡ Y Z XZ➡YZ XZ➡YZ
传递律:若 X ➡ Y X➡Y X➡Y, Y ➡ Z Y➡Z Y➡Z,则 X ➡ Z X➡Z X➡Z
合并规则:若 X ➡ Y X➡Y X➡Y, X ➡ Z X➡Z X➡Z,则 X ➡ Y Z X➡YZ X➡YZ
分解规则:若 X ➡ Y X➡Y X➡Y, Y 1 Y_1 Y1⊆Y,则 X ➡ Y 1 X➡Y_1 X➡Y1
伪传递率:若 X ➡ Y X➡Y X➡Y, W Y ➡ Z WY➡Z WY➡Z,则 X W ➡ Z XW➡Z XW➡Z -
候选码:候选码能唯一确定一条记录,候选码的任意真子集不可以,即候选码要最简。候选码也称候选关键字。
-
主码:从候选码中选出一个作为主码。
-
主属性和非主属性:候选码中的属性称为主属性,不属于任何候选码的属性是非主属性。
-
外码:即外键,其他关系的码。
-
全码:所有属性的组合才能唯一确定一条记录
-
超码/超键:学号是码,则(学号, 姓名)是超码
11. 属性闭包运算
闭包运算用于求候选码。
没有在右边出现过的属性一定包含在候选码中。
AC 属性没有在右边出现过,所以包含在候选码中。求闭包运算:(AC) + ^+ +➡(ABHCE) + ^+ +➡(ABDHCE) + ^+ += U,能推出所有属性,所以 AC 是候选码。
A 属性没有在右边出现过,所以包含在候选码中。求闭包运算:(A) + ^+ +➡(ABC) + ^+ +➡(ABCD) + ^+ += U,能推出所有属性,所以 A 是候选码。
A1 属性没有在右边出现过,所以包含在候选码中。但是仅有A1无法推断。但是 ( A 1 , A 3 ) + → ( A 1 , A 3 , A 2 ) {(A_1,A_3)^+\rightarrow(A_1,A_3,A_2)} (A1,A3)+→(A1,A3,A2)、 ( A 1 , A 2 ) + → ( A 1 , A 2 , A 3 ) {(A_1,A_2)^+\rightarrow(A_1,A_2,A_3)} (A1,A2)+→(A1,A2,A3),所以 ( A 1 , A 3 ) {(A_1,A_3)} (A1,A3)、 ( A 1 , A 2 ) {(A_1,A_2)} (A1,A2) 都是候选码。
题目:
12. 关系模式的范式
范式是衡量关系模式规范化程度的标准,目前主要有 6 种范式:1NF、2NF、3NF、BCNF、4NF 和 5NF。其中 3NF 和 BCNF 是规范化的目标。
12.1 第一范式
第一范式:所有属性都不可再分。不满足 1NF 的数据库不能称为关系数据库。
缺点:存在数据冗余和更新异常问题
【例】
- 数据冗余度大:姓名、学院、院长重复存储,数据冗余;
- 插入异常:插入一个学生的信息时,如果该学生还没有选课,就会导致插入异常(主码不完整);
- 删除异常:如果某同学退选所有课程,就要把相关记录都删除,表中也就不存在该同学的信息了;
- 修改异常:修改也有可能涉及多条记录的修改,比较影响效率。
12.2 第二范式
第二范式:在 1NF 的基础上,消除非主属性对候选码的部分函数依赖。
上一节的例子,将关系由第一范式➡第二范式:
候选码是 (学号, 课程号),非主属性是姓名、学院、院长、课程名、成绩。其中,姓名、学院、院长部分函数依赖于候选码(学号);课程名部分函数依赖于候选码(课程号)。
- 姓名、学院、院长分解出来,与学号构成关系:
- 课程名分解出来,与课程号构成关系:
- 剩余的成绩完全函数依赖于候选码 (学号, 课程号),所以构成关系:
最终得到:
将一个 1NF 的关系分解为多个 2NF 的关系,可以减轻数据冗余度大、更新异常等问题,但并不能完全消除。比如第一个关系中:
- 数冗余度大:如果多个学生来自同一个学院,则学院和院长这两个属性都要重复存储;
- 修改异常:修改时也要大面积修改,影响效率;
- 插入异常:如果要插入一个新的学院,没有学生学号也无法插入(缺少主码);
- 删除异常:如果某学院第一届学生全部毕业,就要删除所有学生,但是会发现学院也随之删除了。
这是因为第二范式中可能存在传递函数依赖。在第一个关系中体现为:学号➡学院➡院长。
12.3 第三范式
第三范式:在 2NF 的基础上,消除非主属性对候选码的传递函数依赖。
上一节中存在传递函数依赖的关系如下:
对于 学号➡学院,学院➡院长 这样的传递依赖,通常是将后者分离出来。
如果存在 X➡Y,Y➡Z1,Y➡Z2, Y➡Z3,也是将 Y➡Z1,Y➡Z2, Y➡Z3 分解出来组成单独的一个关系(Y, Z1, Z2, Z3)。
最终得到:
第三范式中,可能存在主属性对候选码的部分函数依赖和传递函数依赖。如下面的例子:
该例子中不存在非主属性对候选码的部分函数依赖和传递函数依赖,满足第三范式。
但是存在主属性对候选码的部分函数依赖(传递函数依赖比较少见),如:
- (店长, 图书)➡书店,因为店长就能决定书店
- (书店, 图书)➡店长,因为书店就能决定店长
随之而来的问题是:
- 数据冗余:对某个书店来说,每增加一种图书就要存储一次店长的名字
- 插入异常:新开一个书店时,还没有图书,所以数据不能插入到表中(主码不完整)
- 删除异常:删除某种图书时,会连同书店和店长信息也删除,如果本来就只有一种图书,那么书店和店长的信息就消失了
- 更新异常:某个书店换店长时,可能要大量修改记录,影响性能
12.4 BC 范式
BC 范式:在第三范式的基础上,如果关系 R 的每一个决定属性都包含候选码,则 R∈BCNF。
BCNF 的特点:
- 所有非主属性对每一个码都是完全函数依赖。
- 所有的主属性对每一个不包含它的码,也是完全函数依赖。
- 没有任何属性完全函数依赖于非码的任何一组属性(完全函数依赖于候选码)。
前一节的例子中,主属性对候选码存在部分函数依赖,如下:
因为 书店➡店长、店长➡书店,意味着店长和书店对候选码存在部分函数依赖,所以先把这两个属性分离出来:
根据 (书店, 图书)➡库存量,分离出以下关系:
剩余一个函数依赖 (店长, 图书)➡库存量,可以舍弃,因为前两个关系中已经将所有属性都包括在内了,库存量这个属性也不再需要主码。
最终分解结果如下:
BC 范式已经消除了插入和删除异常。
12.5 第四范式(基本不考)
12.6 范式总结
题目:
13. 无损连接和保持函数依赖
无损连接:分解后的关系模式通过自然连接能得到原关系中的所有属性。
保持函数依赖:分解后的关系模式能体现原关系中的所有函数依赖。
14. 数据库设计
数据库设计策略:自顶向下、自底向上
数据库设计步骤 / 阶段:
- 需求分析
- 概念设计:对信息进行分析和定义,常用 E-R 图来描述
- 逻辑设计:将 E-R 图转换成关系模式,并进行规范化(消除数据冗余、数据更新异常)
- 物理设计:逻辑模型在计算机中的具体实现,如建立数据库
当各阶段发现不能满足用户需求时,均需返回到前面适当的阶段,进行必要的修正。如此经过不断地迭代和求精,直到各种性能均能满足用户的需求为止。
14.1 需求分析
需求分析阶段:收集用户需求,确定系统边界,文档有:需求说明文档(功能模块图)、数据流程图、数据字典。
14.2 E-R 图
实体用矩形表示,关系用菱形表示,属性用椭圆表示。实体与关系通过无向边连接,并在上面标注联系的类型(1:1,1:n,m:n,m 或 n 也可以写成 *)
(1)两个不同实体集之间的关系
(2)三个不同实体集之间的关系
(3)同一实体集内的关系
属性分为:
- 简单属性和复合属性:简单书信是原子的、不可再分的;复合属性可以分为更小的属性。
- 单值属性和多值属性:一个职工的工号只有一个,则工号是单值属性;一个职工的亲属可能由多个,则亲属是多值属性。
- NULL属性:当实体在某个属性上没有值或属性值未知时,使用 NULL 值。
- 派生属性:可以从其他属性得来的属性。例如,职工有“参加工作时间”和“工作年限”属性,那么“工作年限”可以由当前时间和参加工作时间得到,是一个派生属性。
弱实体:一个实体的存在必须以另一个实体为前提,这类实体称为弱实体。
14.3 概念结构设计
合并局部 E-R 图时,可能会出现冲突:
- 属性冲突:不同 E-R 图中,相同属性的类型、取值范围、数据单位等可能不一致。
- 命名冲突:同一属性在不同 E-R 图中命名不同,或名称相同的属性含义不同。
- 结构冲突:同一实体在不同 E-R 图中属性不同,同一对象在某一分 E-R 图中可能是实体,在另一分 E-R 图中可能是属性,需要统一。
题目:
14.4 逻辑结构设计
逻辑结构的分类:层次模型、网状模型、关系模型(常用)
逻辑结构设计的工作步骤:将 E-R 图转换成关系模式,再进行关系规范化,以求达到更高的范式。
E-R 图不适合计算机处理,需要转换为关系模式 关系名(属性1, 属性2, …)
,通常采用以下方法转换:
(1)一对一联系的转换
(2)一对多联系的转换
(3)多对多联系的转换
题目:
14.5 物理结构设计
在数据库的物理结构中,数据的基本单位是记录,记录是以文件的形式存储的,一条存储记录就对应着关系模式中的一条逻辑记录。在文件中还要存储记录的结构,如各字段长度、记录长度等,增加必要的指针及存储特征的描述。
14.6 数据库的实施和维护
题目:
15. 事务管理
事务的特性:
- 原子性:事务是一系列操作的集合,它们要么都执行,要么都不执行。
- 一致性:事务的执行不能导致数据丢失或不一致。例如,转账操作不能改变系统中总金额。
- 隔离性:事务的执行过程不受其他事务的影响。
- 持久性:事务执行的结果持久化到磁盘。
题目:
16. 数据库的备份与恢复
数据库备份方法:
- 静态转储和动态转储:静态转储是指在转储期间不允许对数据库进行任何存取、修改;动态转储在转储期间允许对数据库进行存取、修改操作。因此,转储和用户事务可并发执行。
- 海量转储和增量转储:海量转储是指每次转储全部数据;增量转储是指每次只转储上次转储后更新过的数据。
- 日志文件:日志中记录了对数据库执行过的操作,一旦发生故障,可以根据日志文件撤销事务对数据库的改变,回退到故障发生前的状态。
事务恢复有以下3个步骤:
- 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。
- 对事务的更新操作执行逆操作。
- 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。
题目:
17. 并发控制
并发控制的主要技术是封锁。基本封锁的类型有排他锁(写锁)和共享锁(读锁):
- 排他锁:若事务 A 对某数据对象加了排他锁,则 A 能够读取和修改该数据对象,其他事务不能再加任何类型的锁。
- 共享锁:若事务 A 对某数据对象加了共享锁,则 A 能够读取但不能修改该数据对象,其他事务也只能加共享锁。
题目:
18. 分布式数据库