57、【数据库技术】【MySQL】数据库范式

1、概述

  • 数据库范式是关系型数据库理论中比较重要的概念。“范式”可以理解成是“规则”、“规范”,数据库范式就是设计、构造数据库(严格的说是“关系型数据库中的‘关系’或表”)所遵循的规则。

  • 关系型数据库范式,是有一套严谨的理论,更多的内容需要参考其他更多的资料,在这里只是用较为通俗的语言去阐述。

  • 范式是一种比较理论化的东西,而在现实的实践中,会有一些不遵守范式的实践,通过这些“反范式”来达到像“提高数据库查询效率”等的目的。合理的“反范式”是允许的而且在实际的实践当中是常见的。

2、数据库范式(Normal Form)基础理论

  • 根据王珊、萨师煊所著的《数据库系统概论(第5版)》中,共有6种范式。分别是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd 范式(BCNF)、第四范式(4NF)、第五范式(5NF)。

  • 最低要求是第一范式(1NF),然后由低到高依次是 2NF、3NF、BCNF、4NF、5NF。BCNF 范式一般认为是对 3NF 的扩充。高范式必须建立在其前面的低范式的基础上,即想要达到高范式,就必须先达到低范式。比如,要想达到 2NF 需要先达到 1NF,达到 3NF 需要先达到 2NF。

  • 在现实的实践中,一般只需要达到 3NF 即可。并不是范式越高越好,过高的范式并不利于实践。即使说“一般要达到 3NF”,实践中也会存在“反范式”的设计。数据库设计方面,一些实践所积累的经验是优于理论的。

2.1、1NF

  • 关系型数据库范式的最低要求,原子性。

  • 通俗解释:表中的列(字段、属性)所代表的意义必须具有原子性,即意义单一、不可被拆分。

  • 下面的例子,违反 1NF:

违反 1NF

表中的列“信息”所表示的意义不是单一的(表中有表),因为“信息”可以包括很多东西“班级”、“姓名”等等,是可以被再细化的。

2.2、2NF

  • 理论化定义:在满足 1NF 的基础上,每一个非主属性完全函数依赖于任何一个候选码。或者说,不存在非主属性对候选码的部分函数依赖。

  • 通俗解释:一张表只描述一件事。

  • 下面的例子,违反 2NF:

违反 2NF

在这张表中,对于每一行由属性 id(学号,不是“行号”,如果是“行号”,就无法继续展开)和属性 course 联合能够能够区别每一行,所以是候选码。但是,只通过 id 能够得出 name 和 sex。

—>

—>

“候选码”的简单理解是,通过候选码能够得出剩余所有属性,所以候选码是。

和通过便可以得到,所以和是部分函数依赖于候选码,只有是完全函数依赖于候选码,因为和缺少哪一个,都无法得出的。

综上:违反 2NF

  • 违反 2NF 的情况一般可以通过“拆表”解决,让一张表就描述一件事。

2.3、3NF

  • 理论化定义:在满足 2NF 的基础上,不存在非主属性对候选码的传递函数依赖。或者说非主属性不函数依赖于其他的非主属性(组)。

  • 通俗解释:表中的属性不能由非主键的属性或属性组推导得出。

  • 下面的例子,违反 3NF:

违反 3NF

上面这张表,在生活中是很常见的,逛超市的购物小票就是这种形式。
如果从关系型数据库的角度来看,违反 3NF。
先看是否满足 2NF,2NF 先找候选码,“候选码”能够彻底对每一行进行区分,在这个表中,只通过 No(可以认为是行号)这一个属性就可以区分每一行,所以满足 2NF,因为对于候选码只有一个属性的时候,一定不会存在部分函数依赖
非主属性 totalprice 是可以由非主属性 number 和非主属性 price 推导得出的,也就是存在传递函数依赖(两个非主属性 number 和 price 完全函数依赖于候选码,而非主属性 totalprice 完全函数依赖于两个非主属性 number 和 price,形成传递函数依赖)。
综上:违反 3NF。

  • 违反 3NF 情况一般也可以通过“拆表”解决。

你可能感兴趣的:(57、【数据库技术】【MySQL】数据库范式)