数据库设计范式

来源:互联网 发布:edius软件下载 mac 编辑:程序博客网 时间:2024/06/05 07:09
 

关系数据库中的关系必须满足一定的要求,即满足不同的范式。

目前关系数据库主要有以下几种范式:第一范式(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都比较难理解,不过通过一些例子,理解起来应该不是问题。因为这是本人最近学习数据库范式的一些理解,我是一个菜鸟级的初学者,如果以上内容有什么不正确的欢迎批评指点。

原创粉丝点击