数据库原理与安全笔记:关系数据库设计
该部分为本科期间数据库原理与安全笔记备份。
Normalization 概念
a process for evaluating and correcting table structures to minimize data redundancies, thereby reducing the likelihood of data anomalies.
数据依赖对关系模式的影响
关系模式可能中存在的问题:
- 数据冗余太大:浪费大量的存储空间
- 更新异常(Update Anomalies):数据冗余 ,更新数据时,维护数据完整性代价大。
- 插入异常(Insertion Anomalies):该插的数据插不进去
- 删除异常(Deletion Anomalies):不该删除的数据不得不删
一个“好”的模式应当不会发生插入异常、删除异常,更新异常、数据冗余应尽可能少。
原因:由存在于模式中的某些数据依赖引起的。
解决方法:通过分解关系模式来消除其中不合适的数据依赖。
数据依赖
实体内部各属性之间的联系
是现实世界属性间相互联系的抽象
是数据内在的性质
是语义的体现
主要类型
- 函数依赖(Functional Dependency,简记为FD):给定一个属性的值,另一个属性的值也会确定。
- 多值依赖(Multivalued Dependency,简记为MVD)
规范化理论
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
规范化: 有时候为了控制由于冗余等带来的问题而要求关系模式满足一定的范型,可以通过模式分解来达到,这一过程称之为规范化(Normalization)
规范化目的: 改造不好的关系模式
范式: 关系数据库中的关系模式是要满足一定要求的, 满足不同程度要求的称为不同的范式
第几范式是表示关系的某一种级别, 如果把范式理解成符合某一种级别的关系模式的集合, 则关系模式R为第几范式可以表示成: \(R∈XNF\)
First Normal Form
Domain is atomic if its elements are considered to be indivisible units
A relational schema R is in first normal form if the domains of all attributes of R are atomic
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
但是满足第一范式的关系模式并不一定是一个好的关系模式。
Devise a Theory
Our theory is based on:
- functional dependencies
- multivalued dependencies
key
Superkey:Let R be a relation schema,A subset K is a superkey of R ,if in any legal relation r(R), for all pairs \(t_1\) and \(t_2\) of tuples in r such that \(t_1 \not= t_2\), then \(t_1[K] \not= t_2[K]\).即不能有两个元组在属性集k上有相同的值
K is a superkey:if and only if \(K → R\)
K is a candidate key for R if and only if \(K→R\), and for no \(α⊂K,α→R\).
主属性与非主属性:
- 包含在任何一个候选码中的属性,称为主属性(Prime attribute)
- 不包含在任何候选码中的属性称为非主属性 Nonprime attribute)或非码属性(Non-key attribute)
全码:整个属性组是码,称为全码(All-key)
Functional Dependencies
Constraints on the set of legal relations.
Require that the value for a certain set of attributes determines uniquely the value for another set of attributes.
Let R be a relation schema,\(α⊆R \ and \ β⊆R,α→β\) holds on R if and only if for any legal relations r(R),whenever any two tuples \(t_1\) and \(t_2\) of r agree on the attributes \(α\), they also agree on the attributes \(β\). That is:\(t_1[α]=t_2[α]⇨t_1[β]=t_2[β]\).
注意:
- 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
- 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。而不是根据数据公式推导的。
- 数据库设计者可以对现实世界作强制的规定。
- 若X\(→\)Y,并且Y\(→\)X,则记为X\(⇄\)Y。
- 若Y不是函数依赖于X,则记为X\(\not→\)Y
求候选码方法:
- 如果有属性不在函数依赖集中出现,那么它必须包含在候选码中;
- 如果有属性不在函数依赖集中任何函数依赖的右边出现,那么它必须包含在候选码中;
- 如果有属性只在函数依赖集的左边出现,则该属性一定包含在候选码中
- 如果有属性或属性组能唯一标识元组,则它就是候选码
A functional dependency is trivial(平凡) if it is satisfied by all instances of a relation:
对于任一关系模式,平凡函数依赖都是必然成立的。若不特别声明, 我们总是讨论非平凡函数依赖。
完全函数依赖与部分函数依赖
在关系模式R(U)中,如果X\(→\)Y,并且对于X的任何一个真子集X’,都有Y不函数依赖于X', 则称Y完全函数依赖于X。记作:X\(→^f\)Y。
若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作X\(→^P\)Y。
平凡函数依赖或者是形如X\(→\)X的依赖, 或者是部分函数依赖。
非平凡函数依赖也可能是部分函数依赖。
在关系模式R(U)中,如果X\(→\)Y, Y\(→\)Z ,(X不函数依赖于Y,且Y\(\not⊆\)X),则称Z传递函数依赖于X。
因为:如果Y\(→\)X,则Z直接依赖于X。
2NF
2NF的定义:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
采用投影分解法分解1NF为2NF:
优点:可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题
缺点:将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余
3NF
3NF的定义:关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z \(\not⊆\)Y), 使得X\(→\)Y,X不函数依赖于Y,Y\(→\)Z,成立,则称R<U,F> ∈ 3NF。
Note:
- 如果R∈3NF,则R也是2NF。
- 若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。
- 将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。
causes a violation of BCNF
A relation R is 3NF iff for every non-trivial FD of R, X \(→\) A: X is a superkey for R or A is a key attribute for R.
几范式判断
- 确定码
- 判断是否有部分函数依赖(非主属性对码的部分依赖)
- 判断是否有传递函数依赖(非主属性对码的传递依赖)
BCNF
由Boyce和Codd提出的,比3NF更进了一步。通常认为BCNF是修正的第三范式,所以有时也称为第三范式。
BCNF的定义:设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X\(→\)Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。
换句话说,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
A relation schema R is in BCNF with respect to a set F of functional dependencies if for all functional dependencies in F+ of the form:\(α^+→β\),where \(α⊆R\) and \(β⊆R\), at least one of the following holds:\(α^+→β\) is trivial.\(α\)is a superkey for R.
不允许候选码以外的东西对非主属性起到决定作用。
Decomposing a Schema into BCNF
a schema R and a non-trivial dependency \(α^+→β\) causes a violation of BCNF.
Decompose R into:
- (\(a^+⋃β\))
- (R-(\(β-α\)))
关系模式的规范化
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化。

规范化的基本思想:逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”,即采用“一事一地”的模式设计原则,让一个关系描述一个概念、一个实体或者实体间的一种联系。若多于一个概念就把它“分离”出去。因此所谓规范化实质上是概念的单一化。
Note: 不能说规范化程度越高的关系模式就越好。在设计数据库模式结构时,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式。这也就是说,上面的规范化步骤可以在其中任何一步终止。
数据依赖的公理系统
逻辑蕴含:对于满足一组函数依赖F的关系模式R <U,F>,其任何一个关系r,若函数依赖X→Y都成立(即r中任意两元组t,s,若t[X]=s[X],则 t[Y] = s[Y]),则称F逻辑蕴含X →Y。 (logically implied by F)
公理系统:
- 函数依赖的一个有效(sound)而完备(complete)的公理系统
- 模式分解算法的理论基础
- 用途:
- 从一组函数依赖求得蕴含的函数依赖
- 求给定关系模式的码
U为属性集总体,F是U上的一组函数依赖, 于是有关系模式R <U,F >。对R <U,F> 来说有以下的推理规则:
- 自反律:Y \(⊆\) X \(⊆\) U,则X\(→\)Y为F所蕴含。其实就是自己推出自己的一部分。
- 增广律(Augmentation):若X→Y为F所蕴含,且Z \(⊆\) U,则XZ→YZ为F所蕴含。
- 传递律(Transitivity):若X→Y及Y→Z为F所蕴含,则X→Z为F所蕴含。
推论:
- 合并规则:由X→Y,X→Z,有X→YZ
- 伪传递规则:由X→Y,WY→Z,有XW→Z
- 分解规则:由X→Y及Z\(⊆\)Y,有X→Z
- X→\(A_1 A_2…A_k\)成立的充分必要条件是X→\(A_i\)成立(i=l,2,…,k)
函数依赖闭包
闭包:在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作F的闭包,记为\(F^+\)
属性集X关于函数依赖集F的闭包:设F为属性集U上的一组函数依赖,X\(⊆\)U, \(X_{F}^+ = {A|X→A能由F根据Armstrong公理导出}\),\(X_{F}^+\)称为属性集X关于函数依赖集F的闭包。
关于闭包的引理:设F为属性集U上的一组函数依赖,X,X\(⊆\)U,X\(→\)Y能由F根据Armstrong公理导出的充分必要条件是Y\(⊆X_{F}^+\)。
用途:将判定X\(→\)Y是否能由F根据Armstrong公理导出的问题,就转化为求出\(X_{F}^+\) ,判定Y是否为\(X_{F}^+\)的子集的问题。

Uses of Attribute Closure:
- Testing for superkey
- Testing for candidate key
函数依赖集等价定义
如果\(G^+=F^+\),就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
\(G^+=F^+\)的充分必要条件是\(F⊆ G^+\) ,和\(G ⊆ F^+\)
Redundancy of FDs
Sets of functional dependencies may have redundant dependencies that can be inferred from the others
虽然函数依赖集不一样,但是\(f^+=g^+\),所以有必要对函数依赖集进行一些规范化。消除了一些函数依赖的冗余。
Testing if an Attribute is Extraneous:
- Consider a set F of functional dependencies and the functional dependency \(α → β\) in F.
- To test if attribute \(A ∈ α\) is extraneous in \(α\):
- compute \(({α} – A)^+\) using the dependencies in F
- check that \(({α} – A)^+\) contains all attributes of \(β\); if it does, A is extraneous
- To test if attribute \(A ∈ β\) is extraneous in \(β\):
- compute \(α^+\) using only the dependencies in \(F' = (F – {α → β}) ∪ {α →(β – A)}\)
- check that \(α^+\) contains A; if it does, A is extraneous
Canonical Cover(正交集)
A canonical cover for F is a set of dependencies \(F_c\) such that:
F logically implies all dependencies in \(F_c\), and \(F_c\) logically implies all dependencies in F, and no functional dependency in \(F_c\) contains an extraneous attribute, and Each left side of functional dependency in \(F_c\) is unique.
To compute a canonical cover for F:
- repeat:
- Use the union rule to replace any dependencies in F: \(α_1 → β_1\) and \(α_1 → β_2\) with \(α_1 → β_1β_2\)
- Find a functional dependency \(α → β\) with an extraneous attribute either in \(α\) or in \(β\)
- If an extraneous attribute is found, delete it from \(α → β\)
- until F does not change
F的最小依赖集\(F_m\)不一定是唯一的,它与对各函数依赖\(FD_i\) 及\(X→A\)中X各属性的处置顺序有关。
模式的分解
关系模式的规范化过程是通过对关系模式的分解来实现的
- 把低一级的关系模式分解为若干个高一级的关系模式的方法并不是唯一的
- 在这些分解方法中,只有能够保证分解后的关系模式与原关系模式等价的方法才有意义
将一个关系模式R<U,F>分解为若干个关系模式\(R_1<U_1,F_1>,R_2<U_2,F_2>,…,R_n<U_n,F_n>\)
- \(U=U_1∪U_2∪…∪U_n\),且不存在\(U_i⊆U_j\)
- \(F_i\)为F在\(U_i\)上的投影
- 意味着相应地将存储在一个二维表t中的数据分散到若干个二维表\(t_1,t_2,… ,t_n\)中去(其中\(t_i\)是t在属性集\(U_i\)上的投影)
函数依赖集的投影
输入:关系R和模式分解计算得到的关系R1,以及在R成立的FD集合S
输出:在R1中成立的FD集合
- 令T为最终输出的FD集合,初始化T为空
- 对于R1的属性集合的每一个子集X,计算\(X^+\)。该计算依据FD集合S,可能会涉及一些在R中但不在R1中的属性。对于所有在\(X^+\)且属于R1的属性A,将所有非平凡的FD,X—>A添加到T中
- T是在R1中成立的FD基本集。对T进行改造成为最小化基本集
Lossless-join
具有无损连接性的模式分解
For the case of R = (\(R_1, R_2\)), we require that for all possible relations r on schema R:\(r=∏_{R_1}(r)⋈∏_{R_2}(r)\)
- 只有具有无损连接性的分解才能够保证不丢失信息
- 无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
Preserve dependency
保持函数依赖的模式分解
Let \(F_i\) be the set of dependencies \(F^+\) that include only attributes in \(R_i\):
- A decomposition is dependency preserving,if \((F_1 ∪ F_2 ∪ … ∪ F_n )^+ = F^+\)
- If it is not, then checking updates for violation of functional dependencies may require computing joins, which is expensive.
判断对关系模式的一个分解是否与原关系模式等价的标准:
- 分解具有无损连接性:如果一个分解具有无损连接性,则它能够保证不丢失信息。
- 分解要保持函数依赖:如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况。
- 分解既要保持函数依赖,又要具有无损连接性:具有无损连接性的分解不一定能够保持函数依赖。同样,保持函数依赖的分解也不一定具有无损连接性。
Lossless-join Decomposition
A decomposition of R into \(R_1\) and \(R_2\) is lossless join if and only if at least one of the following dependencies is in \(F^+\):\(R_1∩R_2=R_1,R_1∩R_2=R_2\)
In other words, if \(R_1 ∩ R_2\) forms a superkey of either \(R_1\) or \(R_2\), the decomposition of R is a lossless-join decomposition.
BCNF Decomposition

Testing for BCNF
Simplified test: To check if a relation schema R is in BCNF, it suffices to check only the dependencies in the given set F for violation of BCNF, rather than checking all dependencies in \(F^+\).
- If none of the dependencies in F causes a violation of BCNF, then none of the dependencies in \(F^+\) will cause a violation of BCNF either.

BCNF is not dependency preserving
3NF Decomposition

- 计算最小函数依赖集\(F_c\)
- 对于Fc中的每一个函数依赖\(α→β\) ,将\(R_i:=αβ\)作为分解出的某个关系模式
- 如果第二步分解出的模式都不包括R的候选码,则增加一个关系,其模式为R的任何候选码
Above algorithm ensures:
- each relation schema \(R_i\) is in 3NF
- decomposition is dependency preserving and lossless-join
Comparison of BCNF and 3NF
It is always possible to decompose a relation into a set of relations that are in 3NF such that:
- the decomposition is lossless
- the dependencies are preserved
It is always possible to decompose a relation into a set of relations that are in BCNF such that:
- the decomposition is lossless
- it may not be possible to preserve dependencies.

浙公网安备 33010602011771号