第一范式(1NF)
第一范式(1NF):每一个列不可再分
理解:不能有可以被继续拆分的列
比如:
不满足第一范式(1NF)
姓名 | 班级 |
---|---|
张三 | 计科1903 |
拆分列后满足第一范式(1NF)
姓名 | 专业 | 班号 |
---|---|---|
张三 | 计科 | 1903 |
第二范式(2NF)
第二范式(2NF):在第一范式的基础上,每一个行的非主属性依赖于主属性
理解:每一行必须有一个主键,并且存在多对多关系时必须拆分开
比如:
不满足2NF:
订单编号 | 商品编号 | 商品名称 | 商品数量 | 商品价格 | 客户姓名 | 客户电话 |
---|---|---|---|---|---|---|
0001 | 1 | 面包 | 10 | $5 | 张三 | 130-2483-4321 |
0001 | 2 | 火腿 | 20 | $3 | 张三 | 130-2483-4321 |
0002 | 2 | 火腿 | 5 | $3 | 李四 | 155-1341-4521 |
原因分析:
表中选用(订单编号, 商品编号)联合作为联合主键。
但是我们发现,不是所有属性字段都完全依赖联合主键的,它们或许只依赖主键中的一部分,这种部分依赖的关系是不满足2NF的!
这里的例子中,商品名称、商品价格这两个字段都是只依赖于(商品编号)这个字段的,也就是说它们只依赖于联合主键中的一部分。因此我们需要进行拆表!
1.订单信息表
订单编号 | 客户姓名 | 客户电话 |
---|---|---|
0001 | 张三 | 130-2483-4321 |
0002 | 李四 | 155-1341-4521 |
2.订单商品数量表
订单编号 | 商品编号 | 商品数量 |
---|---|---|
0001 | 1 | 10 |
0001 | 2 | 20 |
0002 | 2 | 5 |
(商品数量是同时依赖于订单编号和商品编号的, 在这个表中,订单编号和商品编号仍然是作为联合主键)
3.商品信息表
商品编号 | 商品名称 | 商品价格 |
---|---|---|
1 | 面包 | $5 |
2 | 火腿 | $3 |
第三范式(3NF)
第三范式(3NF):消除间接依赖
理解:每一行数据除了可以存储其他表的主键不能存储非主键列
比如:
不满足第三范式(3NF)
姓名 | 专业 | 班号 | 课程编码 | 课程名称 | 教师 |
---|---|---|---|---|---|
张三 | 计科 | 1903 | 001 | 计算机 | 王五 |
李四 | 生化 | 5903 | 003 | 物化 | 赵六 |
拆分后满足第三范式(3NF)
姓名 | 专业 | 班号 | 课程编码 |
---|---|---|---|
张三 | 计科 | 1903 | 001 |
李四 | 生化 | 5903 | 003 |
课程名称 | 课程名称 | 教师 |
---|---|---|
001 | 计算机 | 王五 |
003 | 物化 | 赵六 |