数仓知识01:数据库第一、二、三范式

在学习数据库相关知识时,或者构建数仓时,我们经常会接触到“范式”这个概念,那么到底什么是“范式”?“第一范式”、“第二范式”、“第三范式”之间又有什么联系和区别呢?期望通过这篇文章能够让大家有初步的认知。

  • 什么是范式?

范式(NF),按照经典教材——王珊的《数据库系统概论》中的定义,范式是 “符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。

比较晦涩难懂,但是简单理解其实就是"一张数据表的表结构所符合的某种设计标准的级别"。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,如符合2NF的关系模式,必定符合1NF。

  • 第一范式(1NF):属性的原子性

1NF的定义为:符合1NF的关系中的每个属性都不可再分。
1NF是所有关系型数据库的最基本要求,在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。也就是说,只要在RDBMS中已经存在的数据表,一定是符合1NF的。

不符合1NF的示例:

符合1NF的示例:

但是仅符合1NF的设计,可能存在数据冗余过大,插入异常,删除异常,修改异常的问题。示例如下:

因此,我们需要提高设计标准,去掉导致上述四种问题的因素,使其符合更高一级的范式(2NF),这就是所谓的“规范化”。

  • 第二范式(2NF):属性完全依赖于主键

简单理解,2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖

这句话中涉及到的四个概念——“函数依赖”“码”“非主属性”、与“部分函数依赖”,详细解释见:数据库第一二三范式到底在说什么?

基于2NF,对示例中的数据库表进行拆解优化,如下:

优化之后,再进一步查看,进行同样的操作,是否还存在着之前的问题?

  1. 李小明转系到法律系
    只需要修改一次李小明对应的系的值即可。——有改进
  2. 数据冗余是否减少了?
    学生的姓名、系名与系主任,不再像之前一样重复那么多次了。——有改进
  3. 删除某个系中所有的学生记录
    该系的信息仍然全部丢失。——无改进
  4. 插入一个尚无学生的新系的信息。
    因为学生表的码是学号,不能为空,所以此操作不被允许。——无改进

所以说,仅仅符合2NF的要求,很多情况下还是不够的,而出现问题的原因,在于仍然存在非主属性系主任对于码学号的传递函数依赖。为了能进一步解决这些问题,我们还需要将符合2NF要求的数据表改进为符合3NF的要求。

  • 第三范式(3NF):数据库表中不包含已在其他表中已包含的非主关键字信息

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

基于3NF,对示例中的数据库表进行拆解优化,如下:

  

结论:
由此可见,符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常 做到2NF或者1NF,但是作为数据库设计人员,至少应该知道,3NF的要求是怎样的。

不过3NF,其实也存在存在着主属性对于码的部分函数依赖与传递函数依赖的问题,想要解决此问题的话,就要使用BCNF范式。详情可以查阅参考资料。

参考资料:

知乎:数据库第一二三范式到底在说什么?

CSDN:数据库 --- 第一范式,第二范式,第三范式,BCNF范式

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值