还在为理解关系数据库的三范式而困惑,这篇文章用实例场景带你快速了解1NF 2NF 3NF BCNF的特点和区别

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还在为理解关系数据库的三范式而困惑,这篇文章用实例场景带你快速了解1NF 2NF 3NF BCNF的特点和区别相关的知识,希望对你有一定的参考价值。

关系数据库三范式详解

声明与简介

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。常见的范式有1范式、2范式、3范式。

1范式

字段原子不可分

1范式要求字段是原子的,即可不分的。So,咋理解?直接上个例子。

比如学校的计算机社团招聘了,需要我们填写些基本信息,比如学号、姓名、邮箱、系名、系主任,我们记做表stu。

可能是因为填写规则没说清楚的原因,有的同学把邮箱写了2个,而一般我们只需要填写一个常用邮箱即可。

重点来了这里的列只能对应一个不可再分的“内容”即对应1NF。

如果非要填写2个邮箱呢?那么表得定义清晰,比如邮箱变成两个字段:常用邮箱、备用邮箱。

2范式

消除局部依赖

2范式是在满足1范式的基础上,消除字段间的部分(局部)依赖。还是有点绕口,这次我们结合上述的情景并以图片的形式来理解。

众所周知上例的表stu的学号是唯一,即一个学号只能有一个名字、邮箱、系主任、系主任。反过来即:比如一个名字只能隶属于一个学号。

有人会说名字可以重复啊,比如俺们班就有俩张三呢。那我们看看这两位重名的同学,他们的学号重复吗?!显然不是,所以这里说的名字是具体的人而不是抽象的名字。

局部依赖又是啥?

先插入个场景,比如学校规定今年6月28号放假,而班主任看同学们这学期学习太辛苦了。他说不用理会学校的规定,咱们班6月26号就可以收拾收拾走了。学生自然很开心,于是遵从了班主任的建议提前回家了。这就是局部依赖,回到我们的例子来:

这里列系主任不依赖于学号,而不是依赖于列系名。一言不合,分家:

好了,满足2范式了,咱们继续前行。

3范式

消除传递依赖

这时我们的重点围绕在第二张表上。此时系主任依赖于系名,而系名依赖于学号,这就是构成了传递依赖。再拆:

BCNF范式

完全依赖

1)所有的非主属性对每一个码都是完全函数依赖。

2)所有的主属性对每一个不包含它的码也是完全函数依赖。

3)没有任何属性完全函数依赖于非码的任何一组属性。

比如有个快递分拣的表,一个快递点对应一个分拣员,该站点会有很多货品,货品有不同的数量。

针对上述表,我们不难发现快递点货品、数目和快递点、分拣员在一个表里不合适。

1)插入:如果我们新建个快递点3,没有任何货品时怎么操作当前表呢,货品写啥呢?

2)删除:如果只是舍弃(删除)某个货品,那么同时我们会把快递点、分拣员的信息都删了。

3)更新:如果我们想更新分拣员宋五的名字,以当前示例,至少得更新2条。

究其原因是主属性快递点部分依赖于分拣员、货品、数目。

那该怎么做,这里需要分离,即快递点和分拣员一组,货品、数目一组。即:

以上是关于还在为理解关系数据库的三范式而困惑,这篇文章用实例场景带你快速了解1NF 2NF 3NF BCNF的特点和区别的主要内容,如果未能解决你的问题,请参考以下文章

python黑科技:还在为没有wifi而烦心吗?这篇文章解决你的困扰

MySQL-- 数据库的三范式

一文搞定Java集合类,你还在为Java集合类而烦恼吗?

你是否还在为你的开发效率低而困惑,看完本文,让你的开发效率提升10倍!

数据库的三大范式?

科研数据挖掘实战专题研讨会(北京)