还在为理解关系数据库的三范式而困惑,这篇文章用实例场景带你快速了解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而烦心吗?这篇文章解决你的困扰