乐趣区

关于数据库:关系型数据库设计三大范式

作者:郑龙飞

范式定义

百度百科: 设计关系数据库时,听从不同的标准要求,设计出正当的关系型数据库,这些不同的标准要求被称为不同的范式,各种范式呈递次标准,越高的范式数据库冗余越小。

人类语言: 范式能够了解为设计一张数据表的表构造,合乎的规范级别、标准和要求。

而通常咱们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是本文要讲的“三大范式”。

范式的长处

采纳范式能够升高数据的冗余性。

为什么要升高数据的冗余性?

  1. 十几年前,磁盘很贵,为了缩小磁盘存储。
  2. 以前没有分布式系统,都是单机,只能减少磁盘,磁盘个数也是无限的。
  3. 一次批改,须要批改多个表,很难保证数据一致性。

范式的毛病

范式的毛病是获取数据时,须要通过 Join 拼接出最初的数据。

目前范式的分类

目前业界范式有:第一范式 (1NF)、第二范式 (2NF)、第三范式 (3NF)、巴斯 - 科德范式 (BCNF)、第四范式 (4NF)、第五范式 (5NF)。

什么是函数依赖?

百度百科: 函数依赖简略点说就是:某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。

人类语言: 以上面表格为例,通俗易懂的解释,什么是函数依赖。

学号 姓名 系名 系主任 科名 分数
001 张三 计算机系 李雷 高等数学 87
001 张三 计算机系 李雷 大学英语 88
001 张三 计算机系 李雷 数据库设计 89
002 李四 计算机系 李雷 高等数学 86
002 李四 计算机系 李雷 java 程序设计 90
002 李四 计算机系 李雷 大学英语 98
003 王五 财务系 韩梅梅 高等数学 96
003 王五 财务系 韩梅梅 财务根底 95

齐全函数依赖

官网定义: 设 X,Y 是关系 R 的两个属性汇合,X’是 X 的真子集,存在 X→Y,但对每一个 X’都有 X’!→Y,则称 Y 齐全函数依赖于 X。

人类语言: 比方通过,(学号,课程) 推出分数,然而独自用学号推断不进去分数,那么就能够说:分数 齐全依赖于 (学号,课程)。

总结: 即:通过 A B 能得出 C,但 是 A B 独自得不出 C,那么说 C 齐全依赖于 AB。

局部函数依赖

官网定义: 如果 Y 函数依赖于 X,但同时 Y 并不齐全函数依赖于 X,那么咱们就称 Y 局部函数依赖于 X。

人类语言: 比方通过,(学 号,课程) 推出姓名,因为其实间接能够通过,学号推出姓名,所以:姓名 局部依赖于 (学号,课程)。

总结: 通过 AB 能得出 C,通过 A 也能得出 C,或者通过 B 也能得出 C,那么说 C 局部依赖于 AB。

传递函数依赖

官网定义: 传递函数依赖:设 X,Y,Z 是关系 R 中互不雷同的属性汇合,存在 X→Y(Y !→X),Y→Z,则称 Z 传递函数依赖于 X。

人类语言: 比方:学号 推出 系名,系名 推出 系主任,然而,系主任推不出学号,系主任次要依赖于系名。这种状况能够说:系主任 传递依赖于 学号。

总结: 即:通 过 A 得 到 B,通 过 B 得 到 C,但 是 C 得不到 A,那 么说 C 传递依赖于 A。

三范式的区别

第一范式

第一范式 1NF 外围准则:属性不可切割。

举例说明:

学号 姓名 系名 系主任 科名 分数 学籍信息
001 张三 计算机系 李雷 高等数学 87 本科,大二
002 李四 计算机系 李雷 大学英语 88 研究生, 研三

很显著下面表格设计是不合乎第一范式的,学籍信息列中的数据不是原子数据项,是能够进行宰割的,因而对表格进行批改,让表格合乎第一范式的要求,批改后果如下图所示:

学号 姓名 系名 系主任 科名 分数 学历 所在年级
001 张三 计算机系 李雷 高等数学 87 本科 大二
002 李四 计算机系 李雷 大学英语 88 研究生 研三

实际上,1NF 是所有关系型数据库的最根本要求 , 你在关系型数据库管理系统(RDBMS),例如 SQL Server,Oracle,MySQL 中创立数据表的时候,如果数据表的设计不合乎这个最根本的要求,那么操作肯定是不能胜利的。也就是说,只有在 RDBMS 中曾经存在
的数据表,肯定是合乎 1NF 的。

第二范式

第二范式 2NF 外围准则:不能存在“局部函数依赖”。

举例说明:

学号 姓名 系名 系主任 科名 分数
001 张三 计算机系 李雷 高等数学 87
001 张三 计算机系 李雷 大学英语 88
001 张三 计算机系 李雷 数据库设计 89
002 李四 计算机系 李雷 高等数学 86
002 李四 计算机系 李雷 java 程序设计 90
002 李四 计算机系 李雷 大学英语 98
003 王五 财务系 韩梅梅 高等数学 96
003 王五 财务系 韩梅梅 财务根底 95

以上表格显著存在,局部依赖。比 如,这张表的主键是 (学号,课名),分数的确齐全依赖于 ( 学号,课名),然而姓名并不齐全依赖于 ( 学号,课名), 让表格合乎第二范式的要求,批改后果如下图所示:

学号 科名 分数
001 高等数学 87
001 大学英语 88
001 数据库设计 89
002 高等数学 86
002 java 程序设计 90
002 大学英语 98
003 高等数学 96
003 财务根底 95
学号 姓名 系名 系主任
001 张三 计算机系 李雷
002 李四 计算机系 李雷
003 王五 财务系 韩梅梅

以上合乎第二范式,去掉局部函数依赖依赖。

第三范式

第三范式 3NF 外围准则:不能存在传递函数依赖。

举例说明:

学号 姓名 系名 系主任
001 张三 计算机系 李雷
002 李四 计算机系 李雷
003 王五 财务系 韩梅梅

在下面这张表中,存 在传递函数依赖:学号 -> 系 名 -> 系主任,然而系主任推不出学号。

下面表须要再次拆解:

学号 姓名 系名
001 张三 计算机系
002 李四 计算机系
003 王五 财务系
系名 系主任
计算机系 李雷
计算机系 李雷
财务系 韩梅梅

反三范式

没有冗余的数据库未必是最好的数据库,有时为了进步运行效率,就必须升高范式规范,适当保留冗余数据。具体做法是:在概念数据模型设计时恪守第三范式,升高范式规范的工作放到物理数据模型设计时思考。升高范式就是减少字段,缩小了查问时的关联,进步查问效率,因为在数据库的操作中查问的比例要远远大于 DML 的比例。然而反范式化肯定要适度,并且在本来已满足三范式的根底上再做调整的。

总结

援用知乎大佬对范式的了解:

数据库设计应该也是分为三个境界的:

第一个境界,刚入门数据库设计,范式的重要性还未深刻理解。这时候呈现的反范式设计,个别会出问题。

第二个境界,随着遇到问题解决问题,慢慢理解到范式的真正益处,从而能疾速设计出低冗余、高效率的数据库。

第三个境界,再通过 N 年的锤炼,是肯定会察觉范式的局限性的。此时再去突破范式,设计更正当的反范式局部。

退出移动版