数据库三大范式
什么是范式:数据库设计对数据的存储性能、开发人员对数据的操作都有很大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。-
第一范式: 当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简称列不可再分
-
第二范式: 如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。简称完全依赖。
-
第三范式: 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。简称没有传递依赖。
第一范式(1NF)
列不可再分
例如(学生信息表):
学生编号 | 姓名 | 性别 | 联系方式 |
---|---|---|---|
20080901 | 张三 | 男 | email:zs@126.com,phone:88886666 |
20080902 | 小红 | 女 | email:zs@163.com,phone:88889999 |
以上的表就不符合,第一范式:联系方式字段可以再分,所以变更为正确的是:
学生编号 | 姓名 | 性别 | 电话 | |
---|---|---|---|---|
20080901 | 张三 | 男 | email:zs@126.com | 010-88886666 |
20080902 | 小红 | 女 | email:zs@163.com | 010-88886666 |
第二范式(2NF)
完全依赖
每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
例如(美团订房订单表):
订单号 | 房间号 | 姓名 | 性别 | 电话 |
---|---|---|---|---|
20080901 | 8002 | 张三 | 男 | 010-88886666 |
20080902 | 8003 | 小红 | 女 | 010-88886666 |
20081013 | 8004 | 小红 | 女 | 010-88886666 |
一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。
如下表
订单号 | 房间号 | 用户编号 |
---|---|---|
20080901 | 8002 | 001 |
20080902 | 8003 | 002 |
20081013 | 8004 | 002 |
用户编号 | 姓名 | 性别 | 电话 |
---|---|---|---|
001 | 张三 | 男 | 010-88886666 |
002 | 小红 | 女 | 010-88886666 |
所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。
第三范式(3NF)
没有传递依赖
数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。
比如Student表
学生编号 | 姓名 | 性别 | 所在院校 | 院校地址 | 院校电话 |
---|---|---|---|---|---|
001 | 张三 | 男 | 湖南大学 | 长沙市 | 0731-34253333 |
002 | 李四 | 男 | 湖南师大 | 长沙市 | 0731-23442222 |
这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
学生编号 | 姓名 | 性别 | 所在院校编码 |
---|---|---|---|
001 | 张三 | 男 | HNDX |
002 | 李四 | 男 | HNSD |
院校编码 | 院校名称 | 院校地址 | 院校电话 |
---|---|---|---|
HNDX | 湖南大学 | 长沙市 | 0731-34253333 |
HNSD | 湖南师大 | 长沙市 | 0731-23442222 |