设计范式(NF = Normal Format)
范式:规范的格式。
范式是设计关系数据库必须遵守的规则。
如果我们满足了设计范式的要求,则数据库会简洁,结构清晰。
反之,会出现数据冗余,还有插入、删除、修改数据出现异常。
设计范式种类:1NF、2NF、3NF、BCNF(巴德斯科范式)、4NF、5NF(完美范式)。
1NF是最宽松的,依次递增限制越大。
一般数据库只需要满足到3NF就可以了。
1、1NF(第一范式):字段的原子性
要求:数据是二维表,每一列都不能在分割,属性不能再分割,字段保证原子性。
不满足1NF的数据库,则为非关系型数据库。
不满足1NF的2个例子:
name | tel | age |
小明 |
13988774444,011-15945612 |
1 |
小红 | 16812314725 | 0 |
name | 手机,座机 | age |
小明 | 13988774444,011-15945612 | 1 |
小红 | 16812314725,无 | 0 |
解决办法:
name | 手机 | 座机 | age |
小明 | 13988774444 | 011-15945612 | 1 |
小红 | 16812314725 | 无 | 0 |
2、2NF(第二范式):消除部分(不完全)依赖
要求:满足1NF的前提下,消除字段对主键的部分依赖,从而完全依赖于主键。
依赖:如果字段A一旦确定,则可以指出B字段的值。
部分(不完全)依赖:依赖其中某个部分的值。
不满足2NF的例子:
学生 |
课程 |
老师姓名 |
老师学历 |
课程教材 |
上课教室 |
上课时间 |
小明 | 二年级语文上 | 张三 | 研究生 | 二年级语文上册 | 102 | 8:00 |
小红 | 五年级数学上 | 李四 | 博士 | 五年级数学上册 | 306 | 16:00 |
一个课程,一定指定了某个教材,一年级语文上肯定用的是《一年级语文上册》,那么就有课程推出教材。课程决定了教材,这就叫做部分依赖。
解决办法,拆分成二个或者若干个表:
学生 | 课程 | 老师 | 老师学历 | 上课教室 | 上课时间 |
小明 | 二年级语文上 | 张三 | 研究生 | 102 | 8:00 |
小红 | 五年级数学上 | 李四 | 博士 | 306 | 16:00 |
课程 |
教材 |
二年级语文上 | 二年级语文上册 |
五年级数学上 | 五年级数学上册 |
3、3NF:消除传递依赖
要求:满足2NF的前提下消除传递依赖。
当表里存在不只一类独立实体,数据也可能存在冗余,在插入、修改、删除、时可能出现混乱的情况。
↓解决办法:拆分成3个表,利用主键建立关系。
学生学号 |
学生姓名 |
学生课程 |
教师 |
110 | 小明 | 001 | 578 |
911 | 小红 | 005 | 561 |
课程ID |
课程名称 | 教材名称 |
001 |
二年级语文上 |
二年级语文上册 |
005 |
五年级数学上 |
五年级数学上册 |
教师ID |
老师姓名 |
老师学历 |
578 | 张三 | 研究生 |
561 | 李四 | 博士 |
4、BC范式(BCNF):符合3NF,并且主属性不依赖于主属性。
若关系模式属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。
通常:BC范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。
BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。
还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。
一般,一个数据库设计符合3NF或BCNF就可以了。在BC范式以上还有第四范式、第五范式。
5、第四范式:要求把同一表内的多对多关系删除。
6、第五范式:从最终结构重新建立原始结构。