范式定义:符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度
形象化理解:一张数据表的表结构所符合的某种设计标准的级别
关系与关系模式:
关系“是”关系模式“的一个实例,你可以把”关系”理解为一张带数据的表,而“关系模式”是这张数据表的表结构。
1NF
1NF的定义为:符合1NF的关系中的每个属性都不可再分。
三种关系完整性约束
实体完整性:关系中的码所包含的任意一个属性都不能为空,所有属性的组合也不能重复。
(根据实体完整性的要求,主属性不能为空。)
2NF
2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
在拆分的过程中,要达到更高一级范式的要求,这个过程叫做”模式分解“。
仍然存在非主属性系主任对于码学号的传递函数依赖。
3NF(第三范式,third normal form)
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
定义:考虑具有函数依赖集F的关系模式R,对于F+中所有形如α→β的函数依赖(α⊆R且β⊆R),如果以下至少一项成立:
-
α→β是平凡的函数依赖(i.e. β⊆α);
-
α是模式R的一个超码。
-
β - α中的每个属性A都包含于R的一个候选码中。(候选码:最小的超码)
则关系模式R属于3NF。
如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。
(至少要有三个属性才可能存在传递函数依赖关系)
符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。
BCNF(Boyce-Codd范式,Boyce-Codd Normal Form)
在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
可消除所有基于函数依赖能够发现的冗余。
定义:考虑具有函数依赖集F的关系模式R,对F+中所有形如α→β的函数依赖(α⊆R且β⊆R),如果以下至少一项成立:
-
α→β是平凡的函数依赖(i.e. β⊆α);
-
α是模式R的一个超码。
则关系模式R属于BCNF。
函数依赖(Functional dependencies)
考虑关系模式r(R),属性集α⊆R,属性集β⊆R。
如果对于给定一个r(R)的实例中所有元组对t1和t2总满足“若t1[α]=t2[α],则t1[β]=t2[β]”,则这个实例满足(satisfy)函数依赖α→β。
-
平凡的函数依赖(Trivial Functional Dependency):如果β⊆α,则形如α→β的函数依赖是平凡的。
-
非平凡的函数依赖(Non-Trivial Functional Dependency)
如果在r(R)的每个合法实例都满足函数依赖α→β,则该函数依赖在模式r(R)上成立(hold)。
闭包(closure):令F为一个函数依赖集,F的闭包是被F逻辑蕴含的所有函数依赖的集合,称为F+。
Armstrong公理(Armstrong’s axiom):可找出给定F的全部F+
-
自反律(reflexivity rule):给定属性集α和β,若β⊆α,则α→β成立;
-
增补律(augmentation rule):给定属性集α、β和γ,若α→β成立,则γα→γβ成立。(γα表示γ∪α)
-
传递律(transitivity rule):给定属性集α、β和γ,若α→β成立且β→γ成立,则α→γ成立。
三条扩展规则:(简化计算)
-
合并律(union rule):给定属性集α、β和γ,若α→β成立且α→γ成立,则α→βγ成立。
-
分解律(composition rule):给定属性集α、β和γ,若α→βγ成立,则α→β成立且α→γ成立。
-
伪传递律(pseudotransitivity rule):给定属性集α、β、γ和δ,若α→β成立且γβ→δ成立,则αγ→δ成立。
属性集的闭包
α的闭包α+:函数依赖集F下被α函数确定的所有属性的集合
计算属性闭包α+的高效算法:
分解(decomposition)
无损连接分解(lossless-join decomposition)即为无损分解
- 如果用两个关系模式r1(R)和r2(R)替代r(R)时没有信息损失,则我们称该分解是无损分解(lossless decomposition)
依赖保持(Dependency preservation)
保持依赖的分解(dependency-preserving decomposition)
- 如果分解是保持依赖的,则给定一个数据库更新,所有的函数依赖都可以由单独的关系进行验证,无须计算分解后的关系的连接。
- 3NF是保持依赖并且可以满足无损分解的最高范式
BCNF分解算法(BCNF decomposition algorithm)
首先令reslut = {R}
接着计算一下F的函数闭包F+(计算函数闭包还是挺麻烦的,所以在下面判断的时候挑一个函数依赖,判断一下是否被F逻辑蕴含即可)
然后判断结果集result中是否还存在哪个模式不满足BCNF范式,如果都满足,则直接跳到步骤5,如果存在某个模式 Ri ∈ result,不满足BCNF范式,则执行步骤4
选择一个在Ri上成立的非平凡函数依赖 α→β,并且 α→β 属于 F+,并且α∩β=∅。然后将模式Ri分解成两个模式,分别为 (Ri - β) 和 (α, β)。并且将Ri从result中移除,江新得到的两个模式添加到result中。接着回到步骤3继续判断
分解完成,输出结果
一定无损,但不一定保持依赖
3NF分解算法(3NF decomposition algorithm)
正则覆盖(Canonical Cover):极小函数依赖集
- 如果去除函数依赖中的一个属性不改变函数依赖集的闭包,则称该属性是无关的(extraneous)
首先求出F的正则覆盖Fc(实际上就是利用Amstrong公式化简原来的函数依赖集的过程)
接着将Fc中的每一个函数依赖单独分解成一个模式,得到一个模式列表S = {R1, R2, ..., Ri}
如果上述模式列表S中的任意一个模式包含模式R的候选码,则跳到步骤5,否则执行步骤4
选取R的任意一个候选码,组成一个新的模式R', 将R'添加到模式列表S中
(可选)如果模式列表中存在冗余(即某个模式被其他模式包含),则可以删除这个模式
输出S
该分解算法可以保持依赖,并且是无损分解