关系数据库理论之范式

前言

范式应该算是关系数据库中的难点了,难就难在对关系的分解上。最近在学习关系数据库理论,就想着可以利用文章将思路捋捋。本文主要论述的是范式中有关函数依赖的部分,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BC范式(BCNF)。至于基于多值依赖的第四范式暂时不做讨论。本文中的例子举自《数据库原理及应用技术教程》(清华大学出版社)。

这里小小的插一句,如果你对关系、元组、码等这些专用名词(一般在开发中至少我不会这么说)看不惯的话,就比如我,可以参考如下的同义替换。

  • 关系——二维表,也就是我们常说的数据库中的表
  • 元组——表中的记录
  • 码——如果是主码,就是主键的意思;若是外码,就是外键的意思
  • 关系模式——表的定义,也就是我们常写的create table…语句

这四大范式的关系

在正式论述之前,还是有必要了解一下这四大范式之间的关系:随着范式等级的增高,其限制也就越多,对数据库中的数据冗余,插入异常、删除异常等的解决效果也就越好。1NF、2NF、3NF、BCNF的关系可以表示为下图。

函数依赖

概念

函数依赖是这四大范式的基础概念,只有了解了什么是函数依赖,才能明白这四大范式具体是在做什么。
函数依赖中的函数一词,类似我们在数学中常提及的单值函数,例如
y = a x + b y = ax+b y=ax+b
其中,x叫自变量,y叫因变量。对于确定的自变量x,都有唯一的因变量y于其对应。
而函数依赖与其也相似,比如考虑以下关系:

SDC(SNO,SNAME,SAGE,DEPT,MN,CNO,GRADE)
SDC:关系名
SNO:学号
SNAME:姓名
SAGE:年龄
DEPT:系别
MN:系主任姓名
CNO:课程号
GRADE:成绩

我们知道,在学校中,学号是唯一的,一个学生只能在一个系中学习,所以如果SNO确定,则SNAME、SAGE、DEPT也随之唯一确定。我们就可以说(SNAME,SAGE,DEPT)函数依赖于SNO,记为
S N O → S N A M E SNO \rightarrow SNAME SNOSNAME (SNAME函数依赖于SNO。从后往前看,下同)
S N O → S A G E SNO \rightarrow SAGE SNOSAGE
S N O → D E P T SNO \rightarrow DEPT SNODEPT
最后,我们给出函数依赖的定义

设关系模式R(U,F)U是属性全集,FU上的函数依赖集,XYU的子集,如果对于R(U) 的任意一个可能关系r,对于X的每一个具体值,Y都有唯一的具体值与之对应,则称X函数决定Y,或Y函数依赖于X,记作 X → Y X \rightarrow Y XY

分类

函数依赖分为:完全函数依赖、部分函数依赖、传递函数依赖

完全函数依赖

直接来看个例子,还是上面的SDC关系,在这个关系中, S N O ↛ G R A D E SNO \nrightarrow GRADE SNOGRADE,因为一个学生可以选修多门课程。 C N O ↛ G R A D E CNO \nrightarrow GRADE CNOGRADE,因为一门课程会有多个成绩。但是它们的组合就可以决定成绩,即 ( S N O , C N O ) → G R A D E (SNO,CNO) \rightarrow GRADE (SNO,CNO)GRADE。因为学号确定了,课程号也确定了,这个学生的成绩也就唯一确定了。
( S N O , C N O ) → G R A D E (SNO,CNO) \rightarrow GRADE (SNO,CNO)GRADE这个函数依赖关系中,(SNO,CNO)的真子集,也就是SNO、CNO,都不能唯一确定GRADE的值,我们就把这样的函数依赖,称为完全函数依赖。记为 ( S N O , C N O ) → f G R A D E (SNO,CNO)\rightarrow ^ fGRADE (SNO,CNO)fGRADE。这里f就是full(满)的意思。
最后来看定义

设关系模式R(U) , U是属性全集,XYU的子集,如果 X → Y X \rightarrow Y XY,并且对于X的任何一个真子集X’,都有 X ′ ↛ Y X' \nrightarrow Y XY,则称YX完全函数依赖。记作 X → f Y X \rightarrow^f Y XfY

部分函数依赖

还是上面的关系SDC。我们已经知道 S N O → D E P T SNO \rightarrow DEPT SNODEPT,而我们也可以说 ( S N O , C N O ) → D E P T (SNO,CNO) \rightarrow DEPT (SNO,CNO)DEPT。此时,对于(SNO,CNO)的真子集SNO、CNO,有 S N O → D E P T SNO \rightarrow DEPT SNODEPT C N O ↛ D E P T CNO \nrightarrow DEPT CNODEPT。此时,我们可以说DEPT部分函数依赖于(SNO,CNO),记作 ( S N O , C N O ) → p D E P T (SNO,CNO) \rightarrow^p DEPT (SNO,CNO)pDEPT。这里p就是partial(部分的)意思。
最后来看定义

设关系模式R(U) , U是属性全集,XYU的子集,如果对X的某个真子集X’ X ′ → Y X' \rightarrow Y XY,则称Y对X部分函数依赖,记作 X → p Y X \rightarrow^p Y XpY

只有当决定因素是组合属性时,讨论部分函数依赖才有意义,当决定因素是单个属性时,只能是完全函数依赖。

传递函数依赖

还是上面的关系SDC。 S N O → D E P T SNO \rightarrow DEPT SNODEPT,因为一名学生只能在一个系中上课。且 D E P T → M N DEPT \rightarrow MN DEPTMN,因为一个系只能有一个系主任。所以在这里SNO与DEPT就是传递函数依赖的关系,记作 S N O → t M N SNO \rightarrow^t MN SNOtMN。这里t是transitive(可传递的)意思。
最后是定义

设关系模式R(U) , U是属性全集,XYZU的子集,若 X → Y X \rightarrow Y XY,但 Y ↛ X Y \nrightarrow X YX,而 Y → Z Y \rightarrow Z YZ( Y ∉ X Y\notin X Y/X Z ∉ Y Z \notin Y Z/Y),则称ZX传递函数依赖,记作 X → t Z X \rightarrow^t Z XtZ

主属性与非主属性

在一个关系中,如果一个属性或者几个属性能够唯一标识一个元组,我们就把它称为候选码。在众多候选码中,我们选择其中的一个为主码。
包含在任何一个候选码中的属性,称为主属性不包含在任何中的属性,称为非主属性

注:下面范式中,在定义里出现的,均指候选码主码。若候选码只有一个,那么候选码=主码=码。

范式

第一范式

如果关系模式R,其所有的属性均为简单的、不可再分的,则称R属于第一范式。

第一范式是对关系数据库最起码的要求。

例如我们在上面提及的SDC关系,它就满足第一范式

但是,在SDC关系中,存在着非主属性对码的部分函数依赖,比如
( S N O , C N O ) → p D E P T (SNO,CNO) \rightarrow^p DEPT (SNO,CNO)pDEPT
这就会导致数据冗余等问题(对于系别信息来说需要存储多次,有多少个学生就要存储几次),于是我们就需要第二范式。

第二范式

在关系模式满足1NF的基础上,且每个非主属性都完全函数依赖于R的码,则称R属于第二范式

对于SDC关系,(SNO,CNO)的关系组合为这个关系的候选码,也是主码,因为它能唯一标识一个学生的记录。SNO、CNO为主属性,SNAME、SAGE、DEPT、MN、GRADE为非主属性。通过上面的论述,我们知道在这个关系中存在着部分函数依赖
( S N O , C N O ) → p D E P T (SNO,CNO) \rightarrow^p DEPT (SNO,CNO)pDEPT
其中,DEPT为非主属性,且它部分函数依赖于(SNO,CNO),所以这个SDC关系就不满足第二范式的定义。
究其原因,是因为在SDC(SNO,SNAME,SAGE,DEPT,MN,CNO,GRADE)关系中,描述了不止一件事。它从大体上描述了两个个实体:学生的基本信息、学生的选课和成绩信息。
为了消除部分函数依赖,我们尽量做到一个关系就描述一个实体。在SDC关系中,我们可以拆分为三个实体
学生与系别关系:
SD(SNO,SNAME,SAGE,DEPT,MN)
学生选课关系
SC(SNO,CNO,GRADE)
在SD关系中,SNO为主码,决定因素,也为主属性,SNAME,SAGE,DEPT,MN为非主属性。上面我们提过,如果决定因素为单属性,只能是完全函数依赖。所以SD关系满足第二范式的定义。
在SC关系中,(SNO,CNO)为主属性,GRADE为非主属性。然而,(SNO,CNO)的真子集SNO、CNO都不能唯一确定GRADE的值,因为一个学生可以选修多门课程,而一门课程也可以由多个学生选修,它们之间是多对多的关系。根据完全函数依赖的定义,GRADE完全函数依赖于(SNO,CNO)。所以关系SC满足第二范式的定义。

不难看出,在关系SD中,非主属性MN与主属性SNO存在传递依赖,这也会导致一定的数据冗余,插入异常等问题,这时就要引入第三范式。
在第二范式中,存在着以下两条结论:

  • 从1NF关系中消除非主属性对码的部分函数依赖,则可以得到2NF关系。
  • 如果R的码为单属性,或R的全体属性均为主属性,则R属于2NF。

第三范式

在满足第二范式的基础上,如果关系模式R的每个非主属性都不传递依赖R的码,则称R属于第三范式。

在第二范式中,我们将SDC关系分解成了SD和SC两个关系,但是在关系SD中,SNO为主码,同时也为主属性,DEPT为非主属性,存在 S N O → D E P T SNO \rightarrow DEPT SNODEPT,且 D E P T → M N DEPT \rightarrow MN DEPTMN,而 D E P T ↛ S N O DEPT \nrightarrow SNO DEPTSNO S N O → t M N SNO \rightarrow^t MN SNOtMN。也就是说MN传递依赖与SNO,所以关系SD不满足第三范式的定义。
究其原因,是因为在关系SD中,我们还分得不够细,在关系SD(SNO,SNAME,SAGE,DEPT,MN)中,还描述了两个实体,即学生和系别。
所以我们把它在进行分解:
学生关系:
S(SNO,SNAME,SAGE)
系别关系:
D(DEPT,MN)
在S关系中,SAME,SAGE均与SNO不存在传递依赖。
在D关系中,MN不与DEPT存在传递依赖。
故S关系与D关系满足第三范式定义。

显然,在SC关系中GRADE不会传递依赖于(SNO,CNO)
所以,SC满足第三范式定义。

一般来说,在进行关系分解时,分解到3NF就足够了。
但是2NF、3NF都只限制了非主属性对码的依赖关系,而没有限制主属性之间对码的依赖关系,这依然可能存在着数据冗余等问题,所以要引入BC范式。

BC范式

如果关系模式R属于1NF,且所有的函数依赖 X → Y X \rightarrow Y XY( Y ∉ X Y\notin X Y/X),决定因素X都包含了R的一个候选码,则称R属于BC范式。

说白了,BCNF是指无论是主属性还是非主属性,都不能传递或部分函数依赖与关系R的码。最明显的特征是决定因素或其子集都包含了候选码。

定义看着很晕,对吧,不怕,我们来看一个例子。

设关系模式
SNC(SNO,SNAME,CNO,GRADE)
SNO:学号
SNAME:学生姓名
CNO:课程号
GRADE:成绩

假设这里不存在重名现象
不难看出,要想唯一标识这个关系中的一个元组,只要确定SNO、CNO的值或者SNAME、CNO的值就可以了。因为不存在重名现象,一旦SNO确定,SNAME也随之确定,而一个学生可以选修多门课程,一门课程只有一个成绩,所以CNO也应该纳入范围。
在这个关系中,有两个候选码(SNO,CNO)和(SNAME,CNO)
在这个关系中,主属性为SNO、SNAME、CNO,非主属性为GRADE
所以,函数依赖关系如下:
( S N O , C N O ) → G R A D E (SNO,CNO) \rightarrow GRADE (SNO,CNO)GRADE
( S N A M E , C N O ) → G R A D E (SNAME,CNO) \rightarrow GRADE (SNAME,CNO)GRADE
非主属性GRADE,对(SNO,CNO)以及(SNAME,CNO)都为完全函数依赖,且不存在传递依赖,所以SNC属于第三范式
我们现在着重看主属性,由于SNO与SNAME是一对一的关系,所以存在着以下部分函数依赖
( S N A M E , C N O ) → p S N O (SNAME,CNO) \rightarrow^p SNO (SNAME,CNO)pSNO
( S N O , C N O ) → p S N A M E (SNO,CNO) \rightarrow^p SNAME (SNO,CNO)pSNAME
也就是说,在一个关系的主属性中,存在这部分函数依赖,这就不满足BC范式的定义。

BCNF的规范化是指把3NF关系模式通过投影分解转换成BCNF关系模式的集合
注意:前提要是这个关系已经是3NF

在SNC关系中,我们描述了两个实体,这两个实体是学生关系和选课关系,我们把它们加以分解,就可以消除上面说的主属性之间的函数依赖。
学生关系:
S(SNO,SNAME)
选课关系:
SC(SNO,CNO,GRADE)
在S关系中,SNO为主属性,且是单一的,不存在主属性之间的部分函数依赖。非主属性SNAME也与SNO不存在部分、传递函数依赖。
在SC关系中,SNO、CNO为主属性,它们之间也不存在部分函数依赖。非主属性GRADE与(SNO,CNO)也不存在部分、传递函数依赖。
所以,它们都满足BCNF。
最后说一说BCNF的性质:

  • 满足BCNF的关系减消除任何属性(包括主属性与非主属性)对码的部分函数依赖和传递函数依赖。也就是说,如果 R ∈ B C N F R\in BCNF RBCNF,则R也是3NF。
  • 如果 R ∈ 3 N F R\in 3NF R3NF,则R不一定是BCNF。
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值