关系型数据库范式详解
数据库的范式就是数据库开发设计过程中的规范,由满足条件逐渐提升规范类别,有1NF到6NF级别划分,较高级别是在满足较低级别规范的情况下上升的。这种数据库的规范利于数据库的简洁、逻辑清晰明确。
第一范式 无重复的列
第一范式的要求是同一列中不能有多个值,属性不可以重复比如:
名称 | 类型 | |
颜色类型 | 品种类型 | |
苹果 | 红色 | 红富士 |
橘子 | 橙色 | 柑桔 |
第二范式 非主属性依赖于主键
在满足第一范式的基础上,第二范式是为了每条数据可以被某列值唯一的区分,通常可以使用id来作为每一条数据的唯一标识。例如以上的表中可能包含很多种水果,加入我们使用name作为唯一的主码,而我们如果增加了多条不同的苹果数据,那么我们查询或者删除都无法定位到具体的数据,所以我们需要给每一条数据增加一个id,用来区分每一条数据。
Id | 名称 | ||
颜色类型 | 品种类型 | ||
1 | 苹果 | 红色 | 红富士 |
2 | 橘子 | 橙色 | 柑桔 |
第三范式 属性不依赖于其它非主属性
在满足前两个范式的基础上,第三范式要求属性不依赖于其它非主属性,假设给上述表添加字段品种产地,品种特色,那么就构成了 id ->品种 ->品种产地,品种特色,就会发现品种产地以及品种特色都会依赖于品种类型,这种设计会造成后续的更改,删除等异常错误,正确的做法是新建一个品种表:
品种类型 | 品种产地 | 品种特色 |
红富士 | 土耳其 | 干脆 |
柑桔 | 浙江 | 酸甜 |
第四范式 不存在多对多关系
在以上的品种表中,一个品种名可以对应多个生产地,比如柑桔生产于南方多个省市,那么这里就构成了一对多的关系,而品种特色可以有多种特色,比如可以有干脆、脆甜、肉质饱满等,这里就出现了多对多的关系,故品种表不符合第四范式,解决方法就是拆分成多个表即分为 品种名:品种产地 和品种名:品种特色两张表。