前言
前段时间面试,被人问到创建mysql的时候的三大范式是什么?
当时就在想:三大范式?什么鬼?我怎么没听过(毕竟不是科班出身),我创建数据库的时候,不就是一个通过主键相互关联嘛,三大范式什么鬼?
最后面试结束后,才去看了看相关的知识,这时候才明白,原来自己创建表的时候,就已经使用到了三大范式,只不过自己不晓得而已,giao~,那么现在就看看三大范式是什么东西吧!
1、首先要知道三大范式是什么?
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
通过上面的文字可以知道,是为了让设计出来的数据库更加合理,冗余更小
2、其次就是“三大范式的内容”
第一范式:
当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:
如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:
设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF。
看到上面的三条范式,是不是一脸懵逼,我是谁?,我在哪?我干嘛?这是什么东西?下面,我给你翻译一下!
第一范式:
就是属性不可分割。属性是什么?就是表中的字段。
第二范式:
就是要有主键,要求其他字段都依赖于主键。
第三范式:
就是要消除传递依赖,方便理解,可以看做是“消除冗余”。
这样是不是看着就稍微清晰点了,接下来就举一些栗子看看。
3、三大范式详细解释
第一范式:属性不可分割。
首先看反例:
编号 | 姓名 | 性别 | 年龄 | 联系电话 | 地址 |
---|---|---|---|---|---|
1 | 张三 | 男 | 11 | 1571111111 | 河南省开封市朝阳区某某小区 |
2 | 李四 | 女 | 22 | 157222222 | 广州省 广东市白云区天明路某某号 |
3 | 王五 | 男 | 33 | 157333333 | 河南省郑州市二七区大学路 |
4 | 李六 | 女 | 44 | 1574444444 | 河南省郑州市新郑市薛店北街 |
下面是改正后的:
编号 | 姓名 | 性别 | 年龄 | 联系电话 | 省份 | 城市 | 详细地址 |
---|---|---|---|---|---|---|---|
1 | 张三 | 男 | 11 | 1571111111 | 河南 | 开封 | 朝阳区某某小区 |
2 | 李四 | 女 | 22 | 157222222 | 广州 | 广东 | 白云区天明路某某号 |
3 | 王五 | 男 | 33 | 157333333 | 河南 | 郑州 | 二七区大学路 |
4 | 李六 | 女 | 44 | 1574444444 | 河南 | 郑州 | 新郑市薛店北街 |
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能
第二范式:要有主键,要求其他字段都依赖于主键。
首先看反例:
学生表:
学号 | 姓名 | 性别 | 年龄 | 班主任 | 班主任年龄 | 班主任性别 |
---|---|---|---|---|---|---|
20210101 | 张三 | 男 | 11 | 张邻 | 34 | 女 |
20210102 | 李四 | 女 | 22 | 张邻 | 34 | 女 |
20210103 | 王五 | 男 | 33 | 张邻 | 34 | 女 |
20210104 | 李六 | 女 | 44 | 刘鹏 | 45 | 男 |
下面是改正后的:
学生表:
编号 | 姓名 | 性别 | 年龄 |
---|---|---|---|
20210101 | 张三 | 男 | 11 |
20210102 | 李四 | 女 | 22 |
20210103 | 王五 | 男 | 33 |
20210104 | 李六 | 女 | 44 |
学生教师关系表:
编号 | 学号 | 教师编号 |
---|---|---|
1 | 20210101 | 1 |
2 | 20210102 | 1 |
3 | 20210103 | 1 |
4 | 20210104 | 2 |
教师表:
编号 | 姓名 | 年龄 | 性别 |
---|---|---|---|
1 | 张邻 | 34 | 女 |
2 | 刘鹏 | 45 | 男 |
以上就是一个满足范式二的例子,是不是感觉:就这?就这?就这?
第三范式:消除传递依赖,方便理解,可以看做是“消除冗余”。
改正前:
学生表:
编号 | 姓名 | 性别 | 年龄 | 系编号 | 系名称 | 系主任 |
---|---|---|---|---|---|---|
20210101 | 张三 | 男 | 11 | 1 | 计算机信息系 | 张邻 |
20210102 | 李四 | 女 | 22 | 1 | 计算机信息系 | 张邻 |
20210103 | 王五 | 男 | 33 | 1 | 计算机信息系 | 张邻 |
20210104 | 李六 | 女 | 44 | 2 | 中文系 | 王麻子 |
系表:
编号 | 系名称 | 系主任 | 系简介 |
---|---|---|---|
1 | 计算机信息系 | 张邻 | 计算机系成立于。。。。 |
2 | 中文系 | 王麻子 | 中文系成立于。。。。 |
以上信息中的系名称,系主任都属于冗余数据,
下面是改正后的:
学生表:
编号 | 姓名 | 性别 | 年龄 | 系编号 |
---|---|---|---|---|
20210101 | 张三 | 男 | 11 | 1 |
20210102 | 李四 | 女 | 22 | 1 |
20210103 | 王五 | 男 | 33 | 1 |
20210104 | 李六 | 女 | 44 | 2 |
系表:
编号 | 系名称 | 系主任 | 系简介 |
---|---|---|---|
1 | 计算机信息系 | 张邻 | 计算机系成立于。。。。 |
2 | 中文系 | 王麻子 | 中文系成立于。。。。 |