目录
一、前言
欢迎大家来到权权的博客~ 欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进哦~
博客主页链接点这里-->:权权的博客主页链接
二、三大范式
设计数据库的时候需要遵从的一些规范,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
一般情况下满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。
2.1概念
范式描述的是数据关系模型,一对一关系。一对多关系,多对多关系
2.2第一范式(1NF)
关系型数据库的一个基本的要求,不满足第一范式就不可以被称为关系型数据库
即表里的字段不可再分。
举例:设置一个学生表:
2.3第二范式(2NF)
在满足第一范式的基础上,不存在非主键字段对任意候选键的部分函数依赖。(存在于复合主键的情况下)
即在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的,而且所有非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。
正例:
反例 :
学生选修课的成绩表:
学号 | 学生姓名 | 课程 | 学分 | 成绩 |
---|---|---|---|---|
3 | 小肖 | MySQL | 3 | 100 |
上面这个表可以用学号跟课程作为复合主键来确定同学当前选修课的成绩。
学生的姓名跟课程没有关系 ,也就是说学生的姓名只依赖于学号,不依赖于课程。
学分与学号没有关系 ,也就是说学分依赖于课程,不依赖于学号。
对于由两个或者多个关键字段决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么这种就说她存在部分函数依赖 。
如果有这样子的情况就说明这个表不满足第二范式。
学生选修课的成绩表:
学号 | 学生姓名 | 课程 | 学分 | 成绩 |
---|---|---|---|---|
1 | 小肖 | MySQL | 3 | 100 |
2 | 小王 | MySQL | 3 | 90 |
3 | 小强 | JAVA | 2 | 80 |
4 | 小苏 | JAVA | 2 | 85 |
不满足第二范式会出现的问题(看上表):
1.数据冗余:
学生姓名、课程、学分都重复出现,造成了大量的数据冗余。
2.更新异常:
如果需要调整JAVA的学分,那么就需要更新所有记录关于JAVA的记录,如果一旦某些记录更新成功,某些更新失败,就会造成数据中某一课程学分不一致的情况,表现为数据不一致。
3.插入异常:
(学校新开了一门课,已经定义好了学分,但是学校里面没有任何关于这门课的记录)目前这样的设计,每一门课与同学的考试是对应关系,只有同学进行考试之后才会生成一条关于这门课的成绩记录,这条记录保存了课程的学分,也就是说在学生考试之前在数据库中是没有相应记录的,因为插入的课程信息如果学生的成绩记录为空,没有学生会愿意看到他的成绩是空的,所以是没有意义的,这就是插入异常。
4.删除异常
学生毕业之后,把毕业的同学考试记录全部都删除之后,删除记录的同时,也可能把课程对应的学分全部删除,导致一段时间内,数据库中没有课程和学分的相关信息。
2.3第三范式(3NF)
在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
两个强相关关系存在传递现象,这种传递关系称为传递依赖。比如学生表中拿到学号,可以根据学号拿到学校,根据学校又可以拿到学院等信息。
反例:
学生表:
学号 | 学生姓名 | 学院 | 学院地址 | 学院电话 |
---|---|---|---|---|
2023 | 小肖 | 信科院 | 中国 | 1069 |
因为现在要描述的是一个学生表,所以可以看出来学号是一个主键。
在这个表中学生姓名跟学号具有强关系,学院地址跟学院电话是与学院强相关的。
可以看出来,这条记录中出现了两种强相关关系,这两个强相关关系存在传递现象 :
学生姓名-->学号-->学院-->学院地址-->学院电话
这样的一个传递关系,称为传递依赖 ,这种设置不满足第三范式,因为存在传递依赖。
正例 :
根据学生与与学院的关系,拆分成两个表即可。
学生表:
学号 | 学生姓名 | 学生年龄 | 学院编号 |
---|---|---|---|
2023 | 小肖 | 20 | 0052 |
学院表:
学院编号 | 学院地址 | 学院电话 |
---|---|---|
0052 | 长沙 | 0735 |
两张表都依赖于自己表中的主键,学生表可以通过外键与学院之间建立关联关系,第三范式可以解决数据冗余,更新异常,插入异常,删除异常的问题。
欧耶!!!我学会啦!!!