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,属性之间是多对多关系,无函数依赖。
+# 七、
# 参考资料