目录
1.什么是范式
2.为什么使用范式
3.数据库范式类型
4.第一范式
5.第二范式
6.第三范式
1.什么是范式
一些约束、规范、规则 来优化数据库表的设计和存储,这些规则就称为范式。
2.为什么使用范式
遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
3.数据库范式类型
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般来说,数据库只需满足第三范式(3NF)就行了。
4.第一范式
第一范式(1NF):数据库表的每一列都是不可分割的原子项。
假设有一张用户信息表,上面除了用户编号、姓名之外,还会记录地址信息:
在这里面,地址信息一栏就是不符合第一范式(1NF),因此,应该拆分为:
5.第二范式
第二范式(2NF):就是在第一范式的基础上所有列完全依赖于主键列。
完全依赖是指不能存在仅依赖主键一部分的列,第二范式要求每个表只描述一件事情,确保表中的每列,都和主键相关。
以一个订单表为例,通常在淘宝上下单时会产生包含多个商品的订单,如下:
该订单表符合了第一范式,不符合第二范式。第二范式首先要求的是存在一个唯一的主键,因为表中[商品名称]、[价格]是必须依赖于[订单号]和[商品号]这两个属性的,[订单号]或[商品号]都不能作为主键,必须将[订单号]和[商品号]作为一个复合主键才能满足唯一主键要求。并且这样设定后表中所有列完全依赖于主键列。我们增加一个[商品类别]的属性:
一般[商品类别]属性只与[商品号]相关,即仅仅是依赖于主键的一部分。违反了第二范式中"其他属性必须完全依赖于主键"的规则,因此需要将该属性分离到商品信息表(其它表)中。
从上述中可以知道,当表中存在一个复合主键包含多个主键列的时候,才会发生不符合第二范式的情况。比如有一个主键有两个列,不能存在这样的属性,它只依赖于其中一个列,这就是不符合第二范式。
6.第三范式
第三范式(3NF):数据表中的非主键列都和主键直接相关,而不能间接相关。
同样,第三范式也需要建立在第二范式的基础之上。
用户id为主键列,这张表符合1NF、2NF,但不符合第三范式,因为存在间接的传递决定关系:id->sheng->shi、people。这里的[shi]、[people]属性都仅仅依赖于用户所在的城市,而不是用户id。
符合第三范式的设计是将城市相关的属性分离到一个城市信息表中。将这张表拆分成用户信息表和城市信息表,sheng作为前者的外键,后者的主键。