1 范式的基本概念

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。没有冗余的数据库未必是最好的数据库, 有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。各范式之间的联系如下:

满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。


函数依赖

比如描述一个学生的关系,可以有学号(Sno),姓名(Sname)、系名(Sdept)等几个属性。由于一个学号对应一个学生,一个学生只在一个系学习。因此,学号确定以后,学生的姓名和其所在的系的值 也就被唯一的确定了。这种属性间的依赖关系,类似于数学中的 y=f(x),自变量x确定以后,相应的函数值y也就唯一确定了。

也就是 Sname=f(Sno),Sdept=f(Sno),即Sno函数决定Sname,Sno函数决定Sdept。或者说,Sname和Sdept函数依赖于Sno。记作 Sno→Sname,Sno→Sdept。

X→Y,Y→Z,则称为Z对X传递函数依赖。记为

X→Y,但则称X→Y是非平凡的函数依赖。如:关系R(Sno, Cno),依赖关系(Sno, Cno)→Sno(Sno, Cno)→Cno都是平凡函数依赖。

X→Y,但则称X→Y是平凡的函数依赖。如:关系R(Sno, Cno, Grade),依赖关系(Sno, Cno)→Grade是非平凡函数依赖。

完全函数依赖:每一个非主属性,函数依赖于主键中的全部属性,而不能仅依赖主键一部分的属性。因为主键可能有多个属性构成,比如主键有三个属性,某个非主属性仅依赖主键的三个属性中的两个,那么就不能被称为完全函数依赖。

部分函数依赖:X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。


码(key)

关系模式R<U,F>。关系名R,一组属性U,属性组U上的一组数据依赖F。

K为R中的属性或属性组合。若U完全函数依赖于K,则称K为R的候选码。候选码可能多于一个,则选定其中一个为主码(主键)

例如一个学生,身份证可以唯一表示一个学生,学号也可以唯一标识一个学生,(身份证,学号)这个集合可以唯一标识一个学生。我们可以选学号来作为这个学生的主键,那么学号、(身份证、学号)就是候选码

包含在任何一个候选码中的属性,称为主属性。不包含在任何码中的属性称为非主属性或非码属性

最简单的情况,单个属性是码。最极端的情况,整个属性组U是码,称为全码

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码


第一范式(1NF)

定义:数据库表的每一列(也称为属性)都是不可分割的原子数据项,不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。


第二范式(2NF)(在1NF基础上,消除 非码属性 对码的部分函数依赖)

定义:在1NF基础上,每一个的非码属性(不在主键中的列),都必须完全函数依赖于候选码。在1NF基础上,消除 非码属性 对码的部分函数依赖,也就是让非码属性 函数依赖于 候选码中的全部属性)。不能有任何一列与主键没有关系。即一个表只描述一件事情。

举个例子,若有一数据表为(学号, 课程名称,姓名, 年龄, 成绩, 学分)。假设(学号, 课程名称) 是主键,就可能有如下依赖关系:

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

可以看出,姓名和年龄不依赖于课程即 非主属性 不完全依赖于主属性因此,该主码不满足第二范式的要求。


第三范式(3NF)(在2NF基础上,消除非码属性对候选码的传递函数依赖

定义:在2NF基础上,每个非主属性 不依赖于 其它非主属性(在2NF基础上,消除非码属性对候选码的传递函数依赖)。也就是说,任何非主属性都直接依赖于主属性,不能传递依赖于主属性。即 表中的每一列 只与主键直接相关,而不是间接相关,(表中的每一列只能依赖于主键)。每一个非码属性既不部分依赖于码,也不传递依赖于码

简而言之,第三范式(3NF)要求:一个关系中不包含 已在其它关系中包含的非主关键字信息。

例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后,就不能再将部门名称、部门简介等 与部门有关的信息,加入到员工信息表中。(减少了冗余)。

假设:“部门名称”加入到员工信息表

员工信息表(员工ID,姓名,部门编号,部门名称)

会出现,员工ID→部门编号→部门名称,的情况。

即 部门名称(非主属性) 传递依赖于 员工ID(主属性)。

非主属性“部门编号” 依赖于 非主属性“部门名称”

这既不符合每个非主属性 不依赖于 其它非主属性,也不符合任何非主属性都直接依赖于主属性,不能传递依赖于主属性

综上,员工信息表(员工ID,姓名,部门编号,部门名称),不符合第三范式。

还有就是,如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,不然就会有大量的数据冗余。

区分1NF、2NF、3NF:第二范式是说一张表中包含了多种不同的实体属性,那么要必须分成多张表。(一张表只表示一个实体)

第三范式是要求已经分成了多张表,那么一张表中只能有另一张表中的id(外键),而不能有其他的任何信息(其他的信息一律用该外键在另一表查询)。


巴斯-科德范式(BCNF,Boyce-Codd Normal Form):在3NF基础上,消除主属性(候选码中的属性)对候选码的部分函数依赖传递函数依赖

在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题。BCNF由Boyce与Codd提出,通常被认为是修正的第三范式。

在3NF基础上,消除主属性(候选码中的属性)对候选码的部分函数依赖传递函数依赖

定义:关系模式R<U,F>∈1NF,若X→Y 且Y不是X的子集时 X必含有码,则R<U,F>∈BCNF。也就是说,关系模式R<U,F>中,若每一个决定因素都包含码,则R<U,F>∈BCNF。

由BCNF的定义可以得到结论,一个满足BCNF的关系模式有:

-所有非主属性对每一个码都是完全函数依赖。

-所有主属性对每一个不包含它的码也是完全函数依赖。

-没有任何属性 完全函数依赖于 非码的任何一组属性。

若R∈BCNF,按定义排除了任何属性对码的传递依赖与部分依赖,所以R∈3NF。

注意:若R∈BCN,则R∈3NF。 若R∈3NF,R不一定属于BCNF!


多值依赖

多值依赖是属性之间的一对多关系,记为K→→A。

函数依赖事实上是单值依赖,所以不能表达属性值之间的一对多关系。(有人称函数依赖为多值依赖的特例)

平凡的多值依赖:全集U=K+A,一个K可以对应于多个A,即K→→A。此时整个表就是一组一对多关系。

非平凡的多值依赖:全集U=K+A+B,一个K可以对应于多个A,也可以对应于多个B,A与B互相独立,即K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独立的属性集合。


第4范式(4NF)

当关系R的属性集合X是非平凡多值依赖的域,它就包含关系R的键。则 

在BCNF的基础上,消除非平凡且非函数依赖的多值依赖。4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。4NF所允许的多值依赖实际上是函数依赖。

不严谨地说,只要两个独立的1:N联系出现在一个关系中,那么就有可能出现多值依赖。

例如:

一个表中存在三个数据:“课程、学生、先修课”。假设2019级的计算机专业学生想要学习JAVA课程,那么他们需要先学习VB、C#、BS三门课,才可以选择进行JAVA课程。存在关系:

课程→学生

课程→先修课

两个均是1:N的关系,当出现在一张表的时候,会出现大量的冗余。所以就我们需要分解它,减少冗余。分解后如下:

       


第五范式(5NF)

如果关系模式R中的每一个连接依赖均由R的候选码所隐含,则称此关系模式符合第五范式。(在4NF的基础上,消除不是由候选码所蕴含的连接依赖

第五范式有以下要求:必须满足第四范式;表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。

函数依赖是多值依赖的一种特殊的情况,而多值依赖实际上优势连接依赖的一种特殊情况。但连接依赖不像函数依赖和多值依赖可以由语义直接导出,而是在关系连接运算时才反映出来。存在连接依赖的关系模式仍可能遇到数据冗余及插入、修改、删除异常等问题。


总结

规范化过程
1NF
消除非主属性对码的部分函数依赖
2NF
↓ 消除非主属性对码的传递函数依赖
3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
↓ 消除不是由候选码所蕴含的连接依赖
5NF

2 范式的应用实例

下面以一个学校的学生系统为例分析说明,这几个范式的应用。

第一范式(1NF)

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程名称、课程学分、系别、学科成绩,系办地址、系办电话等信息。为了简单我们暂时只考虑这些字段信息。我们对于这些信息,所关心的问题有如下几个方面。

学生有那些基本信息?

学生选了那些课,成绩是什么?

每个课的学分是多少?

学生属于那个系,系的基本信息是什么?

第二范式(2NF)

首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

问题分析:

姓名和年龄不依赖于课程不完全依赖于主属性,因此不满足第二范式的要求,会产生如下问题:

1.数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

2.更新异常

(1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。

(2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。

3.删除异常 :假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

解决方案

把选课关系表SelectCourse改为如下三个表:

学生:Student(学号,姓名,年龄,性别,系别,系办地址、系办电话);

课程:Course(课程名称,学分);

选课关系:SelectCourse(学号,课程名称,成绩)。

第三范式(3NF)

接着看上面的学生表Student(学号,姓名,年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:

(学号)→ (姓名,年龄,性别,系别,系办地址、系办电话)

但是还存在下面的决定关系:

(学号) → (系别)→(系办地点,系办电话)

即存在非关键字段"系办地点"、"系办电话"对关键字段"学号"的传递函数依赖。

它也会存在数据冗余、更新异常、插入异常和删除异常的情况。

根据第三范式把学生关系表分为如下两个表就可以满足第三范式了:

学生:(学号,姓名,年龄,性别,系别);

系别:(系别,系办地址、系办电话)。

上面的数据库表就是符合1NF,2NF,3NF的,消除了数据冗余、更新异常、插入异常和删除异常。


BCNF的例子

要了解 BCNF 范式,那么先看这样一个问题:

若:

  1. 某公司有若干个仓库;
  2. 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;
  3. 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?

已知,

函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量

(管理员,物品名)(仓库名,物品名)

主属性:仓库名、管理员、物品名

非主属性:数量

因为 不存在 非主属性 对码的部分函数依赖和传递函数依赖,所以 此关系模式属于3NF。

基于此关系模式的关系(具体的数据)可能如图所示:

好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?

我们来看以下几种操作:

  1. 先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。
  2. 某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。
  3. 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。

从这里我们可以得出结论,在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题,仍然不是 ”好“ 的设计

造成此问题的原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在 主属性【仓库名】对于 码【(管理员,物品名)】的部分函数依赖。因为【仓库名】依赖于【管理员】,而不依赖于【物品名】。)

解决办法就是拆分成两个表,要在 3NF 的基础上,消除主属性【仓库名】对于【(管理员,物品名)】的部分与传递函数依赖。

将原来的仓库(仓库名,管理员,物品名,数量)

修改为:

仓库(仓库名,管理员)
库存(仓库名,物品名,数量)

这样,之前的插入异常,修改异常与删除异常的问题就被解决了。


3 参考文献:

王珊 萨师煊.《数据库系统概论》第四版

数据库范式

数据库的三大范式以及五大约束

如何解释关系数据库的第一第二第三范式?

数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)

关系数据库范式(1NF,2NF,3NF,BCNF,4NF,5NF)全解析相关推荐

  1. 数据库六种范式详解(1NF/2NF/3NF/BCNF/4NF/5NF)

    目录 数据库的基本概念 函数依赖 函数依赖的定义 函数依赖与属性的关系 六种范式 第一范式(1NF) 第二范式(2NF) 第三范式(3NF) 巴斯-科德范式(BCNF,Boyce-Codd Norma ...

  2. 【数据库】范式理解:1NF,2NF,3NF,BCNF,4NF详析

    数据库入门(一)范式理解:1NF,2NF,3NF,BCNF,4NF详析 引言 范式种类 第一范式(1NF) 符合1NF的关系中的每个属性都不可再分 存在问题 第二范式(2NF) 在1NF基础上消除了非 ...

  3. 【转】关系型数据库的设计范式 1NF 2NF 3NF BCNF

    本文转载自:https://www.cnblogs.com/langdashu/p/5924082.html 一.缘由: 要做好DBA,就要更好地理解数据库设计范式.数据库范式总结概览: 为了更好地理 ...

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

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

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

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

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

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

  7. 数据库范式1NF 2NF 3NF详细阐述

    范式:关系数据库中的关系是要满足一定要求的,满足不同程度要求的不同范式.满足最低要求的叫第一范式,简称1NF ,在第一范式中满足进一步要求的为第二范式,其余以此类推.通俗来说是满足数据库关系表中的一套 ...

  8. 1NF,2NF,3NF,BCNF范式(学习笔记)

    前言:2NF必须在1NF的前提下,3NF必须在2NF的前提下,如果前提都不满足当然不是此阶级范式 1NF 只需要满足:在数据库表中每一个属性(列)都不可以再进行拆分(记住它就行) 例如 学生姓名就不可 ...

  9. 数据库规范化 (1NF, 2NF, 3NF, BCNF)

    先记录几个概念 超键: 超键类似主键, 通过"超键", 我们可以一次性定位到某一条准确的数据上; 候选键: 候选, 即"主键"的候选; 超键是可以由多个属性来组 ...

  10. 1NF,2NF,3NF,BCNF

    消除部分依赖,可以从1NF转换为2NF 消除函数依赖,可以从2NF转换为3NF BCNF 在3NF基础上,消除主属性对键的部分依赖,传递依赖,则称它符合BCNF 关系模式R<U,F>中,对 ...

最新文章

  1. c语言模拟考试题目,10道C语言笔试模拟题
  2. 关于初学Go的一些总结
  3. 【es】Elasticsearch:inverted index,doc_values及source
  4. ES5和ES6类的知识
  5. MySQL的主从复制与读写分离技术实例(一)主从复制
  6. Java中居然有一个存在十几年的bug...
  7. java 500错误页面模板_模板详细错误
  8. 《物联网IoT解决方案》(Unity+SteamVR+云技术+5G+AI+物联网+IoT+人机交互+万物互联+物物互联+射频识别+全球定位系统+实时采集+智能化感知+识别+管理+立钻哥哥+==)
  9. 配置和google浏览器版本一直的webdriver
  10. tf.keras.losses.LogCosh 双曲余弦 损失函数 示例
  11. 智慧农业,绿色农业智慧管理平台
  12. 研究心得:调研文献“快而全“的三步
  13. 使用matlab对图像进行傅里叶变换
  14. WaitForSingleObject 返回值为 WAIT_ABANDONED 的情况
  15. 知道创宇区块链安全实验室|Meter.io 攻击事件分析
  16. 【C语言】用C语言实现最大公约数和最小公倍数【超详细讲解】
  17. 日常工作,完全无需付费软件(Windows除外)
  18. Game Develope(二)
  19. ## 【第8题】这是一道排列组合题
  20. Vista优化大师更新历史:

热门文章

  1. xml在线格式化工具
  2. 车载异构网络接入matlab,车载移动异构无线网络架构及关键技术
  3. 《大话数据结构》总结一下
  4. PDF删除页面技巧介绍
  5. ps去除图片中的文字、图层锁定不能解开问题
  6. C++包扩展_Netgear 网件 EAX80 AX6000规格 无线扩展器 开箱拆解评测
  7. Spring Boot 五种热部署方式
  8. SkyEye天目全数字实时仿真软件功能介绍
  9. 以太坊 2.0 中的验证者经济模型,Part-1
  10. 滴水逆向3期笔记与作业——01汇编