关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库主要有以下几种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、以及更高的范式(4NF、5NF、6NF)等等。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式依次类推,如下图。一般说来,数据库只需满足3NF或者BCNF就行了。
要真正的理解、甚至掌握数据库设计的范式并不是件容易的事情。我们所看到的书籍对于数据库各种范式的介绍往往比较抽象,不好理解,也难以记忆。下面主要是本人这段时间学习数据库范式后的一些理解,虽然不一定很准确,但是在这里写出来跟大家分享。另外的目的也是便于记忆和以后回顾这个知识点,当然,我相信这对于像我这样的初学者来说会有一定的帮助。下面进入正题:
1、第一范式(1NF):
首先,让我们了解一个概念:原子域。如果某个域的元素被认为是不可分的单元,那么这个域就是原子的。
定义:如果一个关系模式R的所有属性域都是原子的,那么称关系模式R属于第一范式(1NF)。也即是属性不可分割。
多值属性和复合属性,都具有非原子的域。举个简单的例子:有一个关系为people如下表,假如其中name属性可以设计成一个包含first、middle和last的复合属性,此时,name属性作为一个复合属性将不具备原子性;再如将属性telephone设计成包含mobile和office两种电话的多值属性,很明显,像这类多值属性也不具备原子性。
people:
编号 | 姓名 | 电话 | |||
first | middle | last | 移动 | 固定 | |
001 | Jeff | Mike | Jordon | 13564892411 | 82346025 |
002 | Xiaoming |
| Wang | 15026487412 | 83341154 |
2、第二范式(2NF):
定义:满足1NF,并且非主属性完全依赖于码。
一个候选码中可能有一个或多个属性,称为主属性,其余属性称为非主属性。非主属性完全依赖于码,即是候选码决定一个非主属性,但是不存在候选码的任何一个真子集可以决定此非主属性。下面举一个例子:
学生信息:
学号 | 姓名 | 年龄 | 性别 | 课程 | 学分 | 系别 | 系地址 | 系电话 | 成绩 |
083010 | 李涛 | 19 | 男 | 《离散数学》 | 3 | 计算机 | 东区 | 82346025 | 85 |
083122 | 陈建 | 20 | 男 | 《数据结构》 | 3.5 | 软件 | 西区 | 83341154 | 91 |
存在这样的依赖关系:
(学号)→(姓名, 年龄,性别,系别,系地址,系电话)
(课程)→ (学分)
(学号,课程)→ (成绩)
由以上依赖关系可以知道(学号,课程)是此关系表的码,虽然非主属性都依赖于码,但是存在像(学号)→(姓名, 年龄,性别,系别,系地址,系电话),(课程) → (学分)这样的非主属性不完全依赖(即是部分依赖)于码,所以此关系表不满足2NF。
假如将上面关系表分解为如下三个关系表,那么情况又会是怎样的呢?
学生:
学号 | 姓名 | 年龄 | 性别 | 系别 | 系地址 | 系电话 |
083010 | 李涛 | 19 | 男 | 计算机 | 东区 | 82346025 |
083122 | 陈建 | 20 | 男 | 软件 | 西区 | 83341154 |
课程:
课程 | 学分 |
《离散数学》 | 3 |
《数据结构》 | 3.5 |
成绩:
学号 | 课程 | 成绩 |
083010 | 《离散数学》 | 85 |
083122 | 《数据结构》 | 91 |
以上三个表的码依次是(学号)、(课程)和(学号,课程),依然存在上面所提到的依赖关系。此时每一个依赖关系都不存在部分依赖(完全依赖于码),所以以上多分解出来的关系表均满足2NF。
3、第三范式(3NF):
定义1:关系模式R具有函数依赖集F,F+中所有形如α→β的函数依赖(其中α和β包含于R)中至少有以下条件之一成立:
①α→β是一个平凡的函数依赖;
②α是R的一个超码;
③β-α中的每个属性都包含在R的一个候选码中。
定义1所表达的内容相对比较抽象,但是仔细琢磨一下,理解起来也不难。条件①和②相对比较好理解,一般情况下可以很快的判断出来。而条件③所需要注意的是β-α的属性有哪些,并且R的候选码有哪些。
例如对于上面“学生”这个关系表,存在(学号,系别)→(系地址,系电话)这样的依赖关系,首先,这并不是一个平凡的 依赖,所以不满足条件①;
其次,很明显也存在(系别)→(系地址,系电话)这样的依赖关系,但是(系别)并不是此关系表的一个超码,所以不能满足条件②;
最后,我们来看一看它能不能使得条件③成立。此时有α=(系别),β=(系地址,系电话),则β-α=(系地址,系电话),而(系地址,系电话)并没有包含在此关系的任何一个候选码中,所以条件③也不成立。
定义2:满足2NF,并且消除传递依赖。
即不存在码X、属性组Y和非主属性Z(Z不属于Y),使得X→Y,Y不决定X,Y→Z成立。根据定义2,我们通过另外一个角度来判断“学生”这个表是否满足3NF:
此关系表中存在这样的关系依赖:(学号)→(系别),而(系别)→(系地址,系电话),那么根据传递律,有(学号)→(系地址,系电话),显然并没有消除类似于这样的传递依赖,所以此关系表不属于3NF。
将此表分解为以下两个表:
学生2:
学号 | 姓名 | 年龄 | 性别 | 系别 |
083010 | 李涛 | 19 | 男 | 计算机 |
083122 | 陈建 | 20 | 男 | 软件 |
系信息:
系别 | 系地址 | 系电话 |
计算机 | 东区 | 82346025 |
软件 | 西区 | 83341154 |
经过分解后,以上两个表都能够满足3NF。
4、Boyce-Codd范式(BCNF):
定义1:关系模式R具有函数依赖集F,F+中所有形如α→β的函数依赖(其中α和β包含于R)中至少有以下条件之一成立:
①α→β是一个平凡的函数依赖;
②α是R的一个超码;
从这个定义可以看到BCNF比3NF要更加严格。
类似于3NF,以“学生”关系表为例。
学号 | 姓名 | 年龄 | 性别 | 系别 | 系地址 | 系电话 |
083010 | 李涛 | 19 | 男 | 计算机 | 东区 | 82346025 |
083122 | 陈建 | 20 | 男 | 软件 | 西区 | 83341154 |
存在(学号,系别)→(系地址,系电话)这样的依赖关系,首先,这并不是一个平凡的 依赖,所以不满足条件①;其次,很明显也存在(系别)→(系地址,系电话)这样的依赖关系,但是(系别)并不是此关系表的一个超码,所以不能满足条件②;因此不能满足BCNF。
定义2:满足3NF,主属性不依赖于主属性。
与定义1相比,定义2更加好容易理解。我们看一看“成绩”这个关系表:
成绩:
学号 | 课程 | 成绩 |
083010 | 《离散数学》 | 85 |
083122 | 《数据结构》 | 91 |
存在(学号,课程)→(成绩)的依赖关系,(学号)和(课程)都是此关系表的主属性,但是存在(学号)→(课程)的依赖关系,即是存在主属性(课程)依赖于另外一个主属性(学号),所以不能满足条件,次关系表不属于BCNF。
5、第四范式(4NF):
定义1:函数依赖和多值依赖集为D的关系模式R,对于D+中所有形如α→→β的多值依赖(α和β均属于R),至少有以下之一成立:
①α→→β是一个平凡的多值依赖;
②α是模式R的超码。
定义2:即删除了同一关系表内的多对多关系。
总结:
以上主要介绍了数据库关系的1NF、2NF、3NF和BCNF,其中1NF和2NF都比较容易理解,但是3NF和BCNF比较抽象,特别是定义1都比较难理解,不过通过一些例子,理解起来应该不是问题。因为这是本人最近学习数据库范式的一些理解,我是一个菜鸟级的初学者,如果以上内容有什么不正确的欢迎批评指点。