From f2152582b3083e0c68ac4c5062481a12c4754c83 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 22 Mar 2018 10:34:45 +0800 Subject: [PATCH] auto commit --- notes/数据库系统原理.md | 267 ++++++++++++++++++++-------------------- 1 file changed, 135 insertions(+), 132 deletions(-) diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 719415a1..81e1a7f2 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -10,16 +10,17 @@ * [封锁粒度](#封锁粒度) * [封锁协议](#封锁协议) * [四、隔离级别](#四隔离级别) +* [五、关系数据库设计理论](#五关系数据库设计理论) + * [函数依赖](#函数依赖) + * [异常](#异常) + * [范式](#范式) * [五、数据库系统概述](#五数据库系统概述) * [基本术语](#基本术语) * [数据库的三层模式和两层映像](#数据库的三层模式和两层映像) * [六、关系数据库建模](#六关系数据库建模) * [ER 图](#er-图) * [约束](#约束) -* [七、关系数据库设计理论](#七关系数据库设计理论) - * [函数依赖](#函数依赖) - * [异常](#异常) - * [范式](#范式) +* [七、](#七) * [参考资料](#参考资料) @@ -163,13 +164,13 @@ lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(c)...unlock(C)... **3. 可重复读(REPEATABLE READ)**
-保证在同一个事务中多次读取同样的记录结果是一致的。 +保证在同一个事务中多次读取同样数据的结果是一样的。 **4. 可串行化(SERIALIXABLE)**
强制事务串行执行。 - **5. 总结**
+ **四个隔离级别的对比**
| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | | :---: | :---: | :---:| :---: | @@ -178,6 +179,133 @@ lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(c)...unlock(C)... | 可重复读 | NO | NO | YES | | 可串行化 | NO | NO | NO | +# 五、关系数据库设计理论 + +## 函数依赖 + +记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。 + +如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。 + +对于 W->A,如果能找到 W 的真子集 W',使得 W'-> A,那么 W->A 就是部分函数依赖,否则就是完全函数依赖; + +## 异常 + +以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。 + +| Sno | Sname | Sdept | Mname | Cname | Grade | +| :---: | :---: | :---: | :---: | :---: |:---:| +| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 | +| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 | +| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 | + +不符合范式的关系,会产生很多异常,主要有以下四种异常: + +1. 冗余数据,例如学生-2 出现了两次。 +2. 修改异常,修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。 +3. 删除异常,删除一个信息,那么也会丢失其它信息。例如如果删除了课程-1,需要删除第二行和第三行,那么学生-1 的信息就会丢失。 +4. 插入异常,例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。 + +## 范式 + +范式理论是为了解决以上提到四种异常。高级别范式的依赖于低级别的范式。 + +

+ +### 1. 第一范式 (1NF) + +属性不可分; + +### 2. 第二范式 (2NF) + +每个非主属性完全函数依赖于键码。 + +可以通过分解来满足。 + + **分解前**
+ +| Sno | Sname | Sdept | Mname | Cname | Grade | +| :---: | :---: | :---: | :---: | :---: |:---:| +| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 | +| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 | +| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 | + +以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖: + +- Sno, Cname -> Sname, Sdept, Mname +- Son -> Sname, Sdept +- Sdept -> Mname +- Sno -> Manme +- Sno, Cname-> Grade + +Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。 + +Sname, Sdept 和 Manme 都函数依赖于 Sno,而部分依赖于键码。当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。 + + **分解后**
+ +关系-1 + +| Sno | Sname | Sdept | Mname | +| :---: | :---: | :---: | :---: | +| 1 | 学生-1 | 学院-1 | 院长-1 | +| 2 | 学生-2 | 学院-2 | 院长-2 | + +有以下函数依赖: + +- Sno -> Sname, Sdept, Mname +- Sdept -> Mname + +关系-2 + +| Sno | Cname | Grade | +| :---: | :---: |:---:| +| 1 | 课程-1 | 90 | +| 2 | 课程-2 | 80 | +| 2 | 课程-1 | 100 | + +有以下函数依赖: + +- Sno, Cname -> Grade + +### 3. 第三范式 (3NF) + +非主属性不传递依赖于键码。 + +上面的关系-1 中存在以下传递依赖:Sno -> Sdept -> Mname,可以进行以下分解: + +关系-11 + +| Sno | Sname | Sdept | +| :---: | :---: | :---: | +| 1 | 学生-1 | 学院-1 | +| 2 | 学生-2 | 学院-2 | + +关系-12 + +| Sdept | Mname | +| :---: | :---: | +| 学院-1 | 院长-1 | +| 学院-2 | 院长-2 | + +### 4. BC 范式(BCNF) + +所有属性不传递依赖于键码。 + +关系 STC(Sname, Tname, Cname, Grade) 的四个属性分别为学生姓名、教师姓名、课程名和成绩,它的键码为 (Sname, Cname, Tname),有以下函数依赖: + +- Sname, Cname -> Tname +- Sname, Cname -> Grade +- Sname, Tname -> Cname +- Sname, Tname -> Grade +- Tname -> Cname + +存在着以下函数传递依赖: + +- Sname -> Tname -> Cname + +可以分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。 + # 五、数据库系统概述 ## 基本术语 @@ -280,132 +408,7 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。 比如大小约束,数量约束。 -# 七、关系数据库设计理论 - -## 函数依赖 - -记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。 - -如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。 - -对于 W->A,如果能找到 W 的真子集 W',使得 W'-> A,那么 W->A 就是部分函数依赖,否则就是完全函数依赖; - -## 异常 - -以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。 - -| Sno | Sname | Sdept | Mname | Cname | Grade | -| :---: | :---: | :---: | :---: | :---: |:---:| -| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 | -| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 | -| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 | - -不符合范式的关系,会产生很多异常,主要有以下四种异常: - -1. 冗余数据。 -2. 修改异常,修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。 -3. 删除异常,删除一个信息,那么也会丢失其它信息。例如如果删除了课程-1,因为学生和课程共同组成了键码,那么学生-1 数据也就不能存在,因此也需要删除。 -4. 插入异常,比如新插入一个学生的信息,而这个学生还没选课,那么就无法插入该学生。 - -## 范式 - -范式理论是为了解决以上提到四种异常。高级别范式的依赖于低级别的范式。 - -

- -### 1. 第一范式 (1NF) - -属性不可分; - -### 2. 第二范式 (2NF) - -每个非主属性完全函数依赖于键码。 - -可以通过分解来满足。 - - **分解前**
- -| Sno | Sname | Sdept | Mname | Cname | Grade | -| :---: | :---: | :---: | :---: | :---: |:---:| -| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 | -| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 | -| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 | - -以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖: - -- Sno, Cname -> Sname, Sdept, Mname -- Son -> Sname, Sdept -- Sdept -> Mname -- Sno -> Manme -- Sno, Cname-> Grade - -Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。 - -Sname, Sdept 和 Manme 都函数依赖于 Sno,而部分依赖于键码。当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。 - - **分解后**
- -关系-1 - -| Sno | Sname | Sdept | Mname | -| :---: | :---: | :---: | :---: | -| 1 | 学生-1 | 学院-1 | 院长-1 | -| 2 | 学生-2 | 学院-2 | 院长-2 | - -有以下函数依赖: - -- Sno -> Sname, Sdept, Mname -- Sdept -> Mname - -关系-2 - -| Sno | Cname | Grade | -| :---: | :---: |:---:| -| 1 | 课程-1 | 90 | -| 2 | 课程-2 | 80 | -| 2 | 课程-1 | 100 | - -有以下函数依赖: - -- Sno, Cname -> Grade - -### 3. 第三范式 (3NF) - -非主属性不传递依赖于键码。 - -上面的关系-1 中存在以下传递依赖:Sno -> Sdept -> Mname,可以进行以下分解: - -关系-11 - -| Sno | Sname | Sdept | -| :---: | :---: | :---: | -| 1 | 学生-1 | 学院-1 | -| 2 | 学生-2 | 学院-2 | - -关系-12 - -| Sdept | Mname | -| :---: | :---: | -| 学院-1 | 院长-1 | -| 学院-2 | 院长-2 | - -### 4. BC 范式(BCNF) - -所有属性不传递依赖于键码。 - -关系 STC(Sname, Tname, Cname, Grade) 的四个属性分别为学生姓名、教师姓名、课程名和成绩,它的键码为 (Sname, Cname, Tname),有以下函数依赖: - -- Sname, Cname -> Tname -- Sname, Cname -> Grade -- Sname, Tname -> Cname -- Sname, Tname -> Grade -- Tname -> Cname - -存在着以下函数传递依赖: - -- Sname -> Tname -> Cname - -可以分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。 +# 七、 # 参考资料