参考:数据库的三范式
什么是范式?
范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。
最常用的三大范式
- 第一范式(1NF):属性不可以分割,每一个属性都是原子项。
- 第二范式(2NF):满足第一范式;且不存在部分依赖,非主属性必须完全依赖于主属性。
- 第三范式(3NF):满足第二范式;且不存在传递依赖。
举个例子
第一范式1NF
属性不可以再分,即表中的列不可以再次拆分。
例如创建一个Student表,包含id name sex connect
primary key(id)
id | name | sex | connect |
---|---|---|---|
001 | 张三 | 男 | 山东省菏泽市_123xxxx1234 |
002 | 李四 | 女 | 山西省太原市_123xxxx2345 |
003 | 王五 | 男 | 河南省保定市_123xxxx3456 |
如果我们需要利用电话号码查询对应的Student,需要将connect拆分成phone_number以及address,这样才符合第一范式
修改后满足第一范式
id | name | sex | phone_number | address |
---|---|---|---|---|
001 | 张三 | 男 | 123xxxx1234 | 山东省菏泽市 |
002 | 李四 | 女 | 123xxxx2345 | 山西省太原市 |
003 | 王五 | 男 | 123xxxx3456 | 河南省保定市 |
判断一个表是否符合第一范式,看列还能不能再分。
第二范式2NF
在满足1NF的前提下,非主键列要完全依赖主键。
创建一个Student表 包含 stu_id cla_id score cla_name
primary key(stu_id,cla_id)
stu_id | cla_id | score | cla_name |
---|---|---|---|
001 | 1111 | 82 | 高数 |
001 | 1122 | 77 | 计算机原理 |
002 | 1111 | 55.9 | 高数 |
由于主键是stu_id于cla_id的联合主键,满足1NF,但cla_name只依赖于_cla_id,与stu_id没有依赖,所以不符合2NF
将原本Student表拆分为两个表,即可满足2NF
成绩表(Score) primary key(stu_id)
stu_id | cla_id | score |
---|---|---|
001 | 1111 | 82 |
001 | 1122 | 77 |
002 | 1111 | 55.9 |
课程表(class) primary key(cla_id)
cla_id | cla_name |
---|---|
1111 | 高数 |
1122 | 计算机原理 |
上面两个表都符合2NF
第三范式3NF
在满足2NF的前提下,不存在传递依赖
如下Student表 primary key(id)
表中sex_desc依赖于sex_code,而sex_code依赖于id,从而知道sex_desc依赖于id,说明此依赖为传递依赖,不符合3NF。
修改之后
Student表
sex表
sex_code | sex_desc |
---|---|
0 | 男 |
1 | 女 |
如上两个表都符合3NF
小结
什么是三范式?
第一范式:列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:表的非主属性不能依赖与 其他表的非主属性 外键约束 且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式 建立第一第二范式上。