前言:

关于数据库范式,时常有听说过,一直没有详细去了解。一般数据库书籍或数据库课程会介绍范式相关内容,范式也经常出现在数据库考试题目中。不清楚你是否对范式有比较清晰的了解呢?本篇文章我们一起来学习下数据库范式吧。

1.数据库范式简介

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

范式的英文名称是 Normal Form ,简称 NF 。它是英国人 E.F.Codd 在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。

目前关系型数据库有六种常见范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。

2.常用范式详解

在设计数据库时,会参考范式要求来做,但是并不是说遵循的范式等级越高越好,范式过高虽然具有对数据关系有更好的约束性,但是也会导致表之间的关系更加繁琐,从而导致每次操作的表会变多,数据库性能下降。通常,在关系型数据库设计中,最高也就遵循到 BCNF ,普遍还是 3NF 。即一般情况下,我们使用前三个范式已经够用了。下面我们来详细了解下常用的前三个范式。

第一范式(1NF)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。简单的讲第一范式就是每一行的各个数据都是不可分割的,同一列中不能有多个值,如果出现重复的属性就需要定义一个新的实体。

示例:假设一家公司要存储其员工的姓名和联系方式。它创建一个如下表:

两名员工(Jon&Lester)拥有两个手机号码,因此公司将他们存储在同一表格中,如上表所示。那么该表不符合 1NF ,因为规则说“表的每个属性必须具有原子(单个)值”,Jon&Lester员工的 emp_mobile 值违反了该规则。为了使表符合 1NF ,我们应该有如下表数据:

第二范式(2NF)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

+----------+-------------+-------+| employee | department  | head  |+----------+-------------+-------+| Jones    | Accountint  | Jones || Smith    | Engineering | Smith || Brown    | Accounting  | Jones || Green    | Engineering | Smith |+----------+-------------+-------+

上表描述了被雇佣者,工作部门和领导的关系。我们把能够唯一表示数据库中表的一行的数据成为这个表的主键。表中 head 列不和主键相关。 因此,该表是不符合第二范式的,为了使上面的表符合第二范式,需要将它拆分为两个表:

-- employee 为主键+----------+-------------+| employee | department  |+----------+-------------+| Brown    | Accounting  || Green    | Engineering || Jones    | Accounting  || Smith    | Engineering |+----------+-------------+-- department 为主键+-------------+-------+| department  | head  |+-------------+-------+| Accounting  | Jones || Engineering | Smith |+-------------+-------+

第三范式(3NF)

满足 2NF 的前提下,非主键外的所有字段必须互不依赖,即需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

3.关于反范式

范式的优点是明显的,它避免了大量的数据冗余,节省了存储空间,保持了数据的一致性。范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快。那么是不是只要把所有的表都规范为 3NF 后,数据库的设计就是最优的呢?这可不一定。范式越高意味着表的划分更细,一个数据库中需要的表也就越多,用户不得不将原本相关联的数据分摊到多个表中。稍微复杂一些的查询语句在符合范式的数据库上都可能需要至少一次关联,也许更多,这不但代价昂贵,也可能使一些索引策略无效。

所以我们在进行数据库设计时,并不会完全按照范式要求来做,有时候也会进行反范式设计。通过增加冗余或重复的数据来提高数据库的读性能,减少关联查询时,join 表的次数。

参考:

  • https://segmentfault.com/a/1190000037544475
  • https://www.zhihu.com/question/24696366
  • https://en.wikipedia.org/wiki/Database_normalization

从第一范式(2nf)到第二范式(3nf)_啥是数据库范式相关推荐

  1. oracle 第一范式,数据库范式之第一范式

    数据库范式(Database Normalization) 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余 ...

  2. 第一范式(1NF)、第二范式(2NF)和第三范式(3NF)

    第一范式(1NF):   列1唯一确定列2, 列3, 列4, ...,即列2, 列3, 列4, ...不能再分裂出其它列.   假设有关系模式列1: 订单名; 列2: 商品.一个订单下可以有多个商品, ...

  3. 三张图搞透第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的区别

    第一范式(1NF):   列1唯一确定列2, 列3, 列4, ...,即列2, 列3, 列4, ...不能再分裂出其它列.   假设有关系模式列1: 订单名; 列2: 商品.一个订单下可以有多个商品, ...

  4. 数据库范式(1NF、2NF、3NF、BCNF)

    关系数据库设计之时是要遵守一定的规则的.尤其是数据库设计范式 现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五范式留到以后再介绍. 在你设计数据库之时 ...

  5. 数据库范式解析(1NF 2NF 3NF BCNF)

    数据库设计范式是关系型数据库的设计准则.其目的在于通过规划设计使得数据库结构合理,尽量减少数据冗余,消除存储异常,方便数据的插入.更新和删除操作.目前常用范式包括1NF(第一范式).2NF(第二范式) ...

  6. 数据库范式1NF 2NF 3NF BCNF

    设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合.构造数据库必须遵循一定的规则.在关系数据库中,这种规则就是范式.关系数据库中的关系必须满足一定的要求,即满足不同的范 ...

  7. 数据库范式(1NF 2NF 3NF BCNF)详解

    数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟,不仅给 ...

  8. 数据库范式 1NF, 2NF, 3NF的问题与细解

    转自https://www.jianshu.com/p/94a274ef35a9 一. 关于数据冗余与异常 数据库的规范化 数据库规范化是一种在数据库中组织数据的技术. 规范化是消除冗余(重复)和不良 ...

  9. 数据库范式1NF 2NF 3NF BCNF通俗讲解

    1NF(第一范式) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数 ...

最新文章

  1. python学习--第三天 粗略介绍人脸识别
  2. omnet++ : could not be resolved 或error: coreexception 的解决
  3. openAL在mac下播放音源结束时判断处理
  4. Web应用开发技术(3)-html
  5. Android判断应用或Activity是否存在
  6. 第三章 表单与表单元素
  7. Java基本类型占用字节数(或 bit数)
  8. android 学习之SurfaceView
  9. 2022年6月25日PMP考试通关宝典-1
  10. python + opencv 中值滤波器、最大值滤波器和最小值滤波器
  11. 1688商品类目API接口-(item_cat_get-获得1688商品类目接口)
  12. 三角波电流与梯形波电流的分析
  13. 机器学习考试 ppt
  14. python导入自定义模块_python引入不同文件夹下的自定义模块方法
  15. 使用单链表制作电子通讯录
  16. 微信公众号网页授权登陆
  17. python中复数类型的实部和虚部都是浮点数_Python合集之Python数据类型(一)
  18. 30多种免费的高级WordPress主题,适用于令人惊叹的照片,教育和房地产网站
  19. 华硕主板更改UEFI安全启动项
  20. 【优化】WIN10 打开文件卡半秒 解决方案

热门文章

  1. EV: Using Git Bash
  2. 动态规划——骨牌平铺问题
  3. 归并排序与快速排序比较
  4. mi max android 8.1,小米这款手机可以升级安卓 8.1 了!
  5. java url工具_UrlTool官方版|UrlTool (java Url转换工具)下载v1.1-乐游网软件下载
  6. python数据可视化雷达图程序_Python数据可视化之matplotlib
  7. hhvm php5.6,PHP_5.5_/_PHP5.6_/_PHP-NG_和_HHVM_哪个性能更好?
  8. MySQL 8.0 数据字典有哪些变化?
  9. 源码编译安装PostgresSQL(11.5)
  10. 推陈出新:12C 推进 SCN 新方法实践