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