diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md
index 7f42cdf0..f1f02f28 100644
--- a/notes/数据库系统原理.md
+++ b/notes/数据库系统原理.md
@@ -294,26 +294,30 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
## 异常
-以下关系中,Sno 表示学号,Sname 表示学生姓名,Sdept 表示学院,Cname 表示课程名,Mname 表示院长姓名。函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname}。
+以下的学生课程关系的函数依赖为 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. 删除异常
-4. 插入异常,比如如果新插入一个学生的信息,而这个学生还没选课,那么就无法插入该学生。
+1. 冗余数据。
+2. 修改异常,修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
+3. 删除异常,删除一个信息,那么也会丢失其它信息。例如如果删除了课程-1,因为学生和课程共同组成了键码,那么学生-1 数据也就不能存在,因此也需要删除。
+4. 插入异常,比如新插入一个学生的信息,而这个学生还没选课,那么就无法插入该学生。
## 范式
-范式理论是为了解决以上提到四种异常。
+范式理论是为了解决以上提到四种异常。高级别范式的依赖于低级别的范式。
-高级别范式的依赖基于低级别的范式。
+
### 1. 第一范式 (1NF)
-属性不可分。
+属性不可分;
### 2. 第二范式 (2NF)
@@ -323,57 +327,95 @@ Entity-Relationship,有三个组成部分:实体、属性、联系。
**分解前**
-
+| 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 |
+| 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)
非主属性不传递依赖于键码。
-上述 S1 存在传递依赖,Mname 依赖于 Sdept,而 Sdept 又依赖于 Sno,可以继续分解。
+上面的关系-1 中存在以下传递依赖:Sno -> Sdept -> Mname,可以进行以下分解:
-
+关系-11
+
+| Sno | Sname | Sdept |
+| :---: | :---: | :---: |
+| 1 | 学生-1 | 学院-1 |
+| 2 | 学生-2 | 学院-2 |
+| 2 | 学生-2 | 学院-2 |
+
+关系-12
+
+| Sdept | Mname |
+| :---: | :---: |
+| 学院-1 | 院长-1 |
+| 学院-2 | 院长-2 |
+| 学院-2 | 院长-2 |
### 4. BC 范式(BCNF)
所有属性不传递依赖于键码。
-关系模式 STC(Sname, Tname, Cname, Grade),其中四个属性分别为学生姓名、教师姓名、课程名和成绩。有以下函数依赖:
+关系 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,属性之间是多对多关系,无函数依赖。
+可以分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。
# 参考资料
- 史嘉权. 数据库系统概论[M]. 清华大学出版社有限公司, 2006.
- 施瓦茨. 高性能MYSQL(第3版)[M]. 电子工业出版社, 2013.
-- [MySQL 乐观锁与悲观锁 ](https://www.jianshu.com/p/f5ff017db62a)
- [Transaction isolation levels](https://www.slideshare.net/ErnestoHernandezRodriguez/transaction-isolation-levels)
- [Concurrency Control](http://scanftree.com/dbms/2-phase-locking-protocol)
- [The Nightmare of Locking, Blocking and Isolation Levels!](https://www.slideshare.net/brshristov/the-nightmare-of-locking-blocking-and-isolation-levels-46391666)
diff --git a/pics/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png b/pics/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png
new file mode 100644
index 00000000..84b2898b
Binary files /dev/null and b/pics/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png differ