设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。一般来说,数据库只需满足第三范式(3NF)就行了。
1、第一范式(1NF):
保证每个字段的原子性,不可以分割
例:
一个用户表user
id name age address
1 小美 23 广东省广州市XX村
以上的address的字段可以在继续分割为其他字段,如省-province、市-city、地区街道-address,改造如下:
id name age province city address
1 小美 23 广东省 广州市 XX村
2、第二范式(2NF):
满足第一范式的前提下再满足以下两个条件
- 表中的每一行都具有唯一可区别的特性(不能出现完全一样的记录)
- 不能有部分依赖
解决办法,加一个主键的字段(id)就可以区分。
什么叫做依赖?
如果确定表中的某个字段A,就能确定该表的另一个字段B,那么我们就说,B依赖于A
很显然,所有的非主键字段都依赖于主键!
但是,主键可以是单一字段,也可以是几个字段一起的组合主键,当主键是一个组合主键的时候,就容易出现部分依赖!
什么叫做部分依赖?
假如一张表的主键是一个组合主键(A,B),其他的字段都应该依赖于(A,B)字段,但是,如果此时有一个字段C,只要A确定了,C也就确定了,这种情况就叫做部分依赖!
学生 | 性别 | 籍贯 | 课程名称 | 学分 | 成绩 |
鸣人 | 男 | 木叶 | 色诱术 | 2 | 100 |
鸣人 | 男 | 木叶 | 螺旋丸 | 4 | 100 |
上面的表,主键应该是什么?
应该是:学生+课程名称
虽然,该表满足了第一范式和第二范式的第1个要求,但是,我们还是能明显的感觉到数据的冗余!
原因就是该表没有消除部分依赖!
其中,性别和籍贯只依赖于学生字段,而学分和成绩只依赖于课程名称字段!
此时应对表进行拆分,把部分依赖的字段单独的提取出来
3、第三范式(3NF):
第三范式就是在满足第二范式的基础之上消除传递依赖
什么是传递依赖?
如果一个表中有某个字段不直接依赖于主键,而是依赖于其他字段,就叫作传递依赖
在满足第二范式的前提下,保证每条记录只记录一种类型的数据,减少数据的冗余
4、逆范式
范式是一种理想的规范,也是判断一个数据库设计的优不优秀的的重要标准,但不是强制的规范要求,一般可以作为重要的参考依据,但是有时候我们在设计数据表的时候,为了使用方便,我们要适当违反三范式,我们把这个过程称之为逆范式。