[ 数据库原理 ] 数据库范式概念:1NF、2NF、3NF、BCNF详解及其应用总结
一、数据库范式概念
数据库范式:Normal form,缩写(NF)。按照经典教材——《数据库系统概论》中的定义:范式是 “符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。对没错,这就是天书级别的解释,讲中文翻译成白话中文可以理解为:
范式是用来衡量一组数据表是否符合某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。
数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。
满足最低要求的称为 1NF,在 1NF 的基础上进一步满足一些新要求的称为 2NF,以此类推,满足高级范式的一定满足低级范式,但满足低级范式的不一定满足高级范式。注意敲黑板化重点此处考试要考
二、第一范式(1NF)
设 R
为任一给定关系,若果 R
中每个列与行的交点处的取值都是不可再分的基本元素,则 R
为第一范式。
简单的说,强调的是列的原子性,即列不能够再分成其他的几列。
第一范式是一个关系型数据库的最低标准,如果不满足第一范式,那么这个数据库就不是关系型数据库(划重点)。
2.1 第一范式示例
来一个不符合第一范式的举例:
可以看出"图书列"有两个值图书号
,书名
两列,很明显这两个值可以再进行拆分,所以不满足第一范式。如果将该表规范到1NF可以拆分成如下表:
Redis
是非关系型数据库,因为他的一个字段值可以是一个Map,其中存在key、value。key可以是字符型,value可以是日期型。故其不满足1NF,也就不能是关系型数据库了。
三、第二范式(2NF)
设 R
为任一给定关系,若 R
为 1NF,且其所有非主属性都完全函数依赖于候选关键字,则 R
为第二范式。
简单的说,第二范式要满足以下的条件:
- 要满足第一范式,
- 每个非主属性要完全函数依赖于候选键,或者是主键(主码)。
根据定义可以总结出:**只有在复合字段作主键时,才可能出现不满足2NF的情况。**第2范式告诉我们,不能使用组合键(联合主键/复合键),要使用唯一主键。
3.1 第二范式示例
针对1NF中的例子,假设例子中的主表主键为:读者号、图书号、借阅日期时,
非主属性姓名,单位号只依赖于读者号,和非主属性书名只依赖于图书号,即与关键码(读者号,图书号,借阅日期)存在部分函数依赖。故不属于 2NF,最高属于 1NF。
如若更改其满足2NF,则需拆分成如下表:
R1(读者号,姓名,单位号,单位名)
R3(图书号,书名)
R4(读者号,图书号,借阅日期,还书目期)
3.2 不满足第2范式可能出现的问题
- 数据冗余:若《周易》本书被同一个单位的人借 100 次,那么这个单位的单位名被重复记录100 次,造成大量数据冗余。
- 更新异常:若图书号对应的图书名字要变更,则需要将表中所有数据更新,不然可能会造成
- 插入异常:若《论语》这本书还没有被借出,那么这本书的基本信息将无法存储到这个关系中去,就会出现插入异常的问题。
- 删除异常:删除读者借阅图书信息时可能把读者的基本信息也删除了。
四、第三范式(3NF)
设 R
为任一给定关系,若 R
为 2NF,且其每一个非主属性都不传递函数依赖于候选关键字,则 R
为第三范式。
简单的说,第三范式要满足以下的条件:
- 首先要满足第二范式,
- 非主属性之间不存在函数依赖。
由于满足了第二范式,表示每个非主属性都函数依赖于主键。如果非主属性之间存在了函数依赖,那么非主属性与主属性之间就存在传递依赖
,这样就不满足第三范式考试要考
。
4.1 第三范式示例
下面针对第三范式进行一个举例:
从上表中可以看出,非主属性单位号
和单位名
存在依赖关系,那么,单位名称
和读者号
就存在传递依赖
。故不符合3NF。
如果需要修改上图表满足3NF,则需拆分成如下表:
R1(读者号,姓名,单位号)
R2(单位号,单位名)
R3(图书号,书名)
R4(读者号,图书号,借阅日期,还书目期)
五、巴斯-科德范式(BCNF)
设 R
为任一给定关系, X
、 Y
为其属性集, F
为其函数依赖集,若 R
为 3NF,且其 F
中所有函数依赖 X→Y
(Y 不属于 X)中的 X
必包含候选关键字,则 R
为 BCNF
。
简单的说,BCNF 是第三范式的补充,且要满足以下的条件:
- 满足前面的所有低级范式要求
- 主码(主键)之间不存在依赖
就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
5.1 BCNF 范式示例
该例子候选键为:(学生,老师)和(学生课程),如果上述例子,设定主属性(主键)为:学生
和老师
两列为复合主键,那么该例子满足3NF(因为不存在传递依赖)。
六、总结(考试要考)
范式 | 作用 | 特点 |
---|---|---|
1NF: | 满足原子性,字段不可再分割 | 字段都是单一属性 |
2NF: | 满足完全依赖,消除部分子函数依赖(列不能混着用) | 要求我们使用唯一主键 |
3NF: | 消除非主属性传递依赖 | 非主属性之间不能存在函数依赖 |
BCNF: | 消除主属性传递依赖 | 主码(主键)之间不存在依赖 |
只要是关系型数据库的表,都满足第一范式。第一范式本质更多的是对关系型数据库的一个限定。
第二、第三范式更多的是对数据库表合理设计的一个要求,理解第二、第三范式能够更好的帮助我们设计数据库表。
- 点赞
- 收藏
- 关注作者
评论(0)