数据库三范式
文章目录
1、前言
数据库关系模式可分为第一范式(1NF),第二范式(2NF),第三范式(3NF)和Boyce-Codd范式(BCNF)。这几个规范要求越来越严格,他们之间的关系为 1NF ⊂ 2NF ⊂ 3NF ⊂ BCNF,即,如果满足第二范式一定满足第一范式,满足第三范式一定满足第二范式,以此类推。
2、第一范式
2.1 定义
如果一关系模式r(R)的每个属性对应的域值是不可分的,则称r(R)属于第一范式,记为r(R)⊂1NF。
2.2 案例
如下图所示的关系模式是一个非规范化的关系模式,因为address的值域是可分的。
name | sex | address |
---|---|---|
province | city | street |
将上述关系模式规范化如下图,才是 1NF 关系模式:
name | sex | province | city | street |
---|---|---|---|---|
3、第二范式
3.1 定义
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
第二范式满足两部分内容:一是表必须有一个主键;二是非主键属性必须完全依赖于主键,而不能只依赖于部分主键。
3.2 案例
如表主键为(OrderId,ProductId),Price(价格)和DisCount(折扣)项完全依赖于主键(OrderId,ProductId),而ProductName(产品名字)、Producter(生产商)仅仅依赖于ProductId,即部分主键,因此不符合第二范式,这样会导致数据冗余。可以拆分成如下两个表
4、第三范式
4.1 定义
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
4.2 案例
如图,主键为 OrderId,其余所有属性都完全依赖于这个主键,但是ProductName(产品名字)、Producter(生产商)属性直接依赖于ProductId,ProductId依赖于主键,这就是 通过传递才依赖主键的,不符合3NF。拆分后,满足。
5、第二范式和第三范式
2NF 和 3NF很容易混淆,满足3NF一定满足2NF,总结下就是:
- 2NF:是否存在部分依赖主键
- 3NF:是否存在主键依赖传递
文章作者 Luky116
上次更新 2017-08-29