11-数据库三大范式
概念
- 设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求。设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被 称为不同的范式,各种范式呈递次规范,
越高的范式数据库冗余越小
。
分类
- 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)。
第一范式(1NF)
- 要求表的每个字段(即列)必须是不可分割的独立原子单元。——
列都是不可再分
学生表:(违反第一范式)
student表 | name |
---|---|
张小明|狗娃 |
学生新表:(符合第一范式
)
student表 | name | old_name |
---|---|---|
张小明 | 狗娃 |
第二范式(2NF)
- 在第一范式的基础上,要求每张表只表达一个意思。非码属性必须完全依赖于主码(在1NF基础上消除非码属性对主码的部分函数依赖),也就是表的每个字段都和表的主键有依赖。——
每个表只描述一件事
用户表:(违反第二范式,订单名称与主键没有完全依赖
)
用户编号(主键) | 用户姓名 | 用户账号 | 订单名称 |
---|---|---|---|
11 | xx | yy | zzz |
员工表 & 订单表:(符合第二范式
)
用户编号(主键) | 用户姓名 | 用户账号 |
---|---|---|
11 | xx | yy |
订单编号 | 订单名称 |
---|---|
a001 | zzz |
第三范式(3NF)
- 在2NF基础上,消除传递依赖。即 在第二范式的基础上,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。——
不存在对非主键列的传递依赖
员工表:(符合第二范式,违反第三范式。数据冗余度高,部门编号、部门名称与主键没有直接依赖关系
)
员工编号(主键) | 员工姓名 | 部门编号 | 部门名称 |
---|---|---|---|
11 | xx | 22 | yy |
员工表 & 部门表:(符合第三范式,降低数据冗余
)
员工编号(主键) | 员工姓名 | 部门编号 |
---|---|---|
11 | xx | 22 |
部门编号(主键) | 部门名称 |
---|---|
22 | yy |
【依赖关系】
完全函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。 例如:(学号,课程名称) –> 分数
部分函数依赖:A–>B,如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。 例如:(学号,课程名称) – > 姓名
传递函数依赖:A–>B, B – >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数 依赖于A 例如:学号–>系名,系名–>系主任
码:如果在一张表中,一个属性或属性组,被其他所有属性所
完全函数依赖
,则称这个属性(属性组)为该表的码。例如:该表中码设置为(学号,课程名称)
- 主码:码属性组中的所有属性
- 非码:除主码属性组以外属性
11-数据库三大范式
https://janycode.github.io/2017/06/18/05_数据库/01_MySQL/11-数据库三大范式/