Advertisement

数据库原理及应用 规范化设计(关系数据库理论)

阅读量:

基本概念

1.函数依赖

函数依赖是关系模式中属性之间的一种逻辑依赖关系。

设关系R中的属性子集分别为X和Y,在相同的一个X值下必定对应唯一的Y值(即对于任意两个元组t₁和t₂属于R),就有t₁[Y]=t₂[Y]),则我们称这种关系为函数依赖...;或者换句话说,在这种情况下我们说...记作_X→_ Y_._
若存在函数依赖_X→_ Y_其中当_Y不是_X的一个子集时,则该函数依赖被定义为非平凡的._

复制代码
    如果一个关系模式设计得不好,说明在它的某些属性之间存在“不良”的函数依赖。
    
    
      
    
    AI写代码
2.完全函数依赖

设关系R中的属性子集分别为X和Y,则当存在函数依赖关系X→Y时,
若对于任意一个包含于X但不等于X的真子集X',
都不满足函数依赖性(即有 X' ↛ Y),
则称此情况为Y完全函数依赖于X。
记作:
x\overset{f}{\rightarrow}y

X’→Y ,则称Y 部分函数依赖 于X。
记作:x\overset{p}{\rightarrow}y

3.传递函数依赖

设关系R中的属性X、Y、Z分别表示某种实体及其相关的两个子实体。如果存在函数依赖关系使得属性值由其他一组值唯一确定时,则称该组被确定的属性为被确定的实体。特别地,在这种情况下:

  • 属性集合{ Y }并不包含在{ X }之内;
  • 同时满足以下条件:
    • 属性集{ Z }也不包含在{ Y }之内;
    • 并且存在另一种函数依赖关系使得{ Z }也被唯一确定。
      此时我们称{ Z } 传递地函数依赖 于{ X }。
复制代码
    如果Y→X,则X↔︎Y,这时称Z对X直接函数依赖,而不是传递函数依赖。
    
    
      
    
    AI写代码

规范化设计

规范化的基本思想是消除 关系模式中的数据冗余 ,解决 数据插入、更新、删除时发生异常 的现象。这就要求关系数据库设计出来的关系模式满足规范的模式。

关系的规范化 :按照一定规范设计关系模式,将结构复杂的关系分解成结构简单的关系,从而把不好的关系数据库模式转变为好的关系数据库模式。

规范化又可以根据不同的要求而分成若干级别。
把关系数据库的规范化过程中为不同程度的规范化要求设立的不同标准称为 范式(Normal Form)

复制代码
    1NF⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF
    
    
      
    
    AI写代码

在最基础的关系模式中规定了一条原则:所有关系中的每个属性都必须是单一、不可分割的基本元素。

所有符合规范关系的数据表均属于第一范式。通过将各个属性统一表示为不可分割的数据项,经过处理后的数据表自然满足第一范式的标准。

称关系模式R的所有属性均为不可分的单值域,则该模式遵循第一范式的规范,并被简称为1NF。

⚠️数据依赖对关系模式的影响

复制代码
>      [例1]建立一个描述学校教务的数据库:
>       学生的学号(Sno)、所在系(Sdept)
>       系主任姓名(Mname)、课程号(Cno)
>       成绩(Grade)
>  
>  
>       
>       
>       
>       
>  
>     AI写代码

单一的关系模式:Student <U,F>
其中:

  • U = {Sno,Sdept,Mname,Cname,Grade};
  • 属性组U上的函数依赖集F为:
    F = {Sno→Sdept,Sdept→Mname,(Sno,Cno)→Grade}。
在这里插入图片描述

⚠️ 关系模式Student<U, F>存在的主要问题是:

1. 数据冗余严重: 会导致大量存储空间的浪费。
例如:同一个系主任的名字会在多个学生记录中反复出现

2. 更新异常(Update Anomalies): 更新数据时维护数据完整性会遇到较大困难。
例如:当某个系更换系主任时,系统必须修改与该系所有学生相关的元组信息`【即所有学生的记录都要更新

解决方法: 分解关系模式

将这个单一模式划分为三个关系模式:
学生S(Sno,Sdept,Sno→Sdept);
选课SC(Sno,Cno,Grade,(Sno,Cno)→Grade);
系D(Sdept,Mname→Mname);
这解决了之前存在的问题,并使学生、成绩和系这三个相对独立的实体更加清晰地划分开来。

第二范式(Second Normal Form)

当关系模式R属于第一范式(1NF)时,并且每一个非主键属性都完全函数依赖于每一个候选键,则称该关系模式R属于第二范式(2NF),记作R∈2NF。

详细步骤如下:
(1) 将涉及部分函数依赖关系的决定因素以及非主属性从原关系模式中分离出来。
(2) 将剩余属性与候选键结合以形成一个新的关系模式。

应用投影分解技术将一个满足第一范式(1NF)的关系转换为多个满足第二范式(2NF)的关系:
此方法能在一定程度上缓解原1NF关系所存在的插入异常、删除异常以及数据冗余的问题,并有助于减少修改复杂度。
该方法无法彻底消除所有关系模式中的异常情况以及数据冗余的问题。

[例2]关系模式 S-L-C(Sno, Sdept, Sloc, Cno, Grade)
Sloc为学生住处,假设每个系的学生住在同一个地方

函数依赖包括:
(Sno, Cno)\overset{p}{\rightarrow}Grade
Sno → Sdept
(Sno, Cno)\overset{p}{\rightarrow} Sdept
Sno → Sloc
(Sno, Cno)\overset{p}{\rightarrow} Sloc
Sdept → Sloc

在这里插入图片描述

⚠️S-L-C不是一个好的关系模式
(1) 插入异常
新生入学:假设Sno=95102,Sdept=IS,Sloc=N的学生还未选课,>因课程号是主属性,因此该学生的信息无法插入SLC。
(2) 删除异常
假定某个学生本来只选修了3号课程这一门课。现在因身体不适,他连>3号课程也不选修了。因课程号是主属性,此操作将导致该学生信息的整个元组都要删除。
(3) 数据冗余度大
如果一个学生选修了10门课程,那么他的Sdept和Sloc值就要重复存储>了10次。
(4) 修改复杂
例如学生转系,在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元>组中全部Sdept、Sloc信息。

  • 原因
    Sdept、 Sloc部分函数依赖于码。
  • 解决方法
    S-L-C分解为两个关系模式,以消除这些部分函数依赖
复制代码
               S-L(Sno, Sdept, Sloc)
               SC(Sno, Cno, Grade)
    
    
      
      
    
    AI写代码
在这里插入图片描述
在这里插入图片描述
第三范式(Third Normal Form)

下面给出定义:对于一个关系模式 R 若属于第二范式(2NF),并且每个非主属性都不传递依赖于其所在的关系模式的任何候选键,则称这样的关系模式 R 属于第三范式(3NF),简称 3\text{NF} ,并记作 R \in 3\text{NF}

若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。

例如,在2NF的关系模式S-L(Sno, Sdept, Sloc)中,
其函数依赖关系为:
Sno函数决定(determines)了Sdept;
而此处不存在反向的依赖关系(即不满足reverse dependency);
同时还有另一个重要的依赖关系:
即Sdep t(这里可能是笔误应为 dept)也决定了(determines)了Sl oc。

在这里插入图片描述
  • 解决策略
    采用投影分解法将其分为两个关系模式以消除传递函数依赖性:
    S-D(Sno\ Sdept)\\ D-L(Sdept\ Sloc)
在这里插入图片描述

分别以Sno作为键值对D-L的关系模式的码进行区分,并基于此进行属性划分。
经过分析可知该关系模式遵循2NF规范。
进一步确定该关系模式遵循3NF规范。
其中关系模式S-D也符合这一规范化要求。
通过分解处理后可确保两个新的关系模式间已消除传递依赖性。

BCNF(Boycee Codd Normal Form,巴斯范式)

Definition: If all attributes (both primary and non-primary attributes) of a relation schema do not transitively depend on any candidate key of R, then R is said to meet the BCNF condition, denoted as R ∈ BCNF.

等价于:每一个决定属性的因素都包含码。

若R∈BCNF:

所有非主属性对每一个码都是完全函数依赖
所有的主属性对每一个不包含它的码,也是完全函数依赖
没有任何属性完全函数依赖于非码的任何一组属性

复制代码
    如果R∈3NF,且R只有一个候选码:
    
    
      
    
    AI写代码

R∈BCNF

在这里插入图片描述

R∈3NF

复制代码
    
    
      
    
    AI写代码

[例5] 关系模式C(Cno,Cname,Pcno)
C属于第三范式,并且达到Boyce-Codd范式

[例6] 关系模式S(Sno,Sname,Sdept,Sage)
假定关系模式有两个候选码:Sno和 Sname
该关系模式满足属于第三范式的要求
同时也满足Boyce-Codd范式的条件

[例7] 关系模式SJ P(S,J,P)
函数依赖包括:(S,J)决定P以及(J,P)决定 S
注意到(S,J)与(J,P)都可以作为候选键,并且两键之间存在交集
因此该关系模式SJ P属于第三范式,并且也满足Boyce-Codd范式的条件

[例8] 在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程.
描述如下所示的函数依赖关系:(1)(S,J)决定T;(2)(S,T)决定J;(3) T决定 J
在该关系模式中,两个候选键分别是(S,J)与(S,T),它们之间存在共同属性
因此STJ不仅属于第三范式,同时也满足Boyce-Codd范式的条件

在这里插入图片描述

解决方法:将STJ分解为二个关系模式:
ST(S,T) ∈ BCNF, TJ(T,J)∈ BCNF

在这里插入图片描述
小结

关系模式规范化的主要目的在于建立合理的结构并消除存储异常问题,并减少数据冗余的同时支持高效的插入、删除和更新操作。其主要原则是遵循‘一事一地’的原则,在描述多个实体或联系时,则需将其分离出来。规范化的实质就是实现概念的单一化,在这种情况下一个关系仅表示一个实体。

⚠️注意

规范化的优点是减少了数据冗余,节约了存储空间,同时加快了增、删、改的速度,但在数据查询方面,需要进行关系模式之间的连接操作,因而影响查询的速度。

因此,并不一定要求全部模式都达到BCNF,有时故意保留部分冗余可能更方便数据查询。

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~