每周学点测试小知识-数据库三大范式
跟着芒果一起好好学习,天天向上
上周四下午的VIP试听课是由芒果给大家介绍的MySQL的一些基础知识,在这里芒果给大家分享其中的一部分内容——对数据库三大范式做个小介绍:
范式(数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。范式,对于软件的性能、数据库的维护都是我们软件从业人员必须掌握的内容。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了,所以在这里我也就跟大家介绍这三大范式。这六种范式关系如下图所示:
第一范式(1NF)
确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列)。实际上,第一范式是所有关系型数据库的最基本要求。
例:
按照1NF的要求如上图的数据表,它的第三列和第四列明显是不符合原子性的,这两列都可以被分割为两列,要符合第一范式,我们可以将其改为以下形式:
第二范式(2NF)
第二范式依赖第一范式,所以第二范式必须符合第一,然后第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
例:
如上图所示数据表,它的主键为:学号+课程(联合主键),而姓名、系名、系主任都是仅仅依赖于学号,与课程无关,明显不符合第二范式。
对于每一个学生的姓名、系名、系主任信息都重复多次——数据冗余;如果学校新开设一个院系,还未招生,无学号即课程表,则系名跟系主任无法插入表格——插入异常;如果删除某一个系所有学生的成绩信息,那么系名、系主任信息也会随之消失——删除异常;如果修改某个学生的姓名,则表格中多条记录都要进行修改——修改异常。
对于这样的表格,我们肯定要进行修改的,那么要怎么修改才能满足第二范式呢?
我们首先来看表格属性的关系图:
从上图我们可以看出姓名、系名都与学号相关;而系主任与系名相关,间接与学号相关;分数与学号+课程名相关。因此我们可以根据这些关系依赖将表格,拆分为以下两个表格:
这样分割之后,表1的分数与主键(学号+课程)相关,表2的姓名、系名、系主任与主键(学号)相关,而非部分相关,满足第二范式要求。
第三范式(3NF)
在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖)。
上面根据第二范式修改的表格中,在表2中,系主任是通过系名与学号间接相关的,明显不符合第三范式。
并且当一个系有多名学生时(在实际记录中,这是必然情况),系主任信息也会有多条——数据冗余;如果学校新开设一个院系,还未招生,无学号即课程表,则系名跟系主任无法插入表格——插入异常没有解决;如果删除某一个系所有学生的成绩信息,那么系名、系主任信息也会随之消失——删除异常也没有解决。
对于这样的表格,我们肯定要进行修改的,那么要怎么继续修改才能满足第三范式呢?
我们再来看表格属性的关系图:
从上图我们可以看出姓名、系名都与学号直接相关;而系主任与系名直接相关;分数与学号+课程名相关。因此我们可以根据这些关系依赖将上面的表格2,拆分为以下两个表格,具体表格情况如下:
这样就满足了第三范式,而且对于数据冗余、插入异常、删除异常的情况都得到了解决。
好了,今天的学习内容大家掌握的如何呢?欢迎加芒果微信跟芒果一块儿讨论哟~
精益技术 赋能过程