通过E-R图转换得出一组关系模式后
**选择1:**把一些关系模式合并为更大的关系 —— 会产生过多的数据冗余

inst_dept(ID, name, salary, dept_name, building, budget)

如果通过E-R模型转换得出如下两个关系模式

sec_class(sec_id, building, room_number) and
section(course_id, sec_id, semester, year)

那么在逻辑设计中,可以将上述两个关系合并为如下关系

section(course_id, sec_id, semester, year, building, room_number)

上述关系模式不会产生数据冗余

设计选择2:更小的模式?
如果通过E-R模型转换得出inst_dept关系模式,那么在逻辑设计中,我们可以将其分解为两个关系模式

instructor(ID, name, salary, dept_name)
department(dept_name, building, budget)
# 从而避免(building, budget)的数据冗余

如何知道该合并或分解关系模式呢?

  1. 可以通过保持如下一条规则:dept_name确定(building, budget)数据,即保持函数依赖:dept_name → building, budget
  2. 由于dept_name在inst_dept关系中不是主码,因此需要将其拆分为更小的关系模式

并不是所有的关系模式拆分是有益的
将employee(ID, name, street, city, salary)分解为


employee_attr1(ID, name)
employee_attr2(name, street, city, salary)

name无法作为employee_attr2关系的主码,有可能会重名
无法通过分解出的employee_attr1和employee_attr2重建(自然连接)得出原始关系
我们称无法通过自然连接重建原始关系元组的分解为有损分解 (lossy decomposition)

无损分解

R = ( A , B , C ) R = (A, B, C) R=(A,B,C)的分解
R 1 = ( A , B ) R 2 = ( B , C ) R1 = (A, B) \ R2 = (B, C) R1=(A,B) R2=(B,C)

KaTeX parse error: Undefined control sequence: \join at position 18: …= \Pi_{A,B}(r) \̲j̲o̲i̲n̲ ̲\Pi_{B,C)(r)和 R ( A , B , C ) R(A,B,C) R(A,B,C)等价

函数依赖

假设 r ( R ) r(R) r(R)是一个关系模式, α ⊆ R \alpha \sube R α⊆R, β ⊆ R \beta \sube R β⊆R, 模式R上的函数依赖
α → β \alpha\rightarrow \beta α→β

成立的条件是:如果对于任意关系实例r中任意两个元组t1 和t2,如果两者的属性(集) α \alpha α取值相同, 那么它们的属性(集) β \beta β取值也相同。也就是
t 1 [ α ] = t 2 [ α ] ⇒ t 1 [ β ] = t 2 [ β ] t1[\alpha] = t2 [\alpha] \Rightarrow t1[\beta ] = t2 [\beta ] t1[α]=t2[α]⇒t1[β]=t2[β]

称之为 α \alpha α函数确定 β \beta β, β \beta β函数依赖于 α \alpha α

假设r(A,B) 有如下关系实例

1 4
1 5
3 7

A → B A\rightarrow B A→B不成立,反之成立

函数依赖和码

➢ 超码:在某关系中,若一个或多个属性的集合 { A 1 , A 2 , … , A n } \{A_1, A_2,…, A_n\} {A1​,A2​,…,An​}函数决定该关系中的其它全部属性,则称该属性为该关系的超码
✓若属性组K满足K → R,则K 是关系模式R的超码

➢ 候选码:若集合 { A 1 , A 2 , … , A n } \{A_1, A_2,…, A_n\} {A1​,A2​,…,An​}的任何真子集均不能函数决定该关系中的其它属性,则此时 { A 1 , A 2 , … , A n } \{A_1, A_2,…, A_n\} {A1​,A2​,…,An​}是最小的超码,即候选码
✓ K → R 且不存在 α ⊂ K \alpha \sub K α⊂K, 满足 α → R \alpha → R α→R

➢ 外码:若关系模式R中属性或属性组X是另一关系模式的主码,则称X是R的外码

S(Sno,Sname,Sdept,Sage)
SC(Sno,Cno,G)

函数依赖允许我们表达超码不能表达的约束。考虑下面的模式:
i n s t d e p t ( I D ‾ , n a m e , s a l a r y , d e p t _ n a m e , b u i l d i n g , b u d g e t ) . inst_dept (\underline{ID}, name, salary, dept\_name, building, budget). instd​ept(ID​,name,salary,dept_name,building,budget).

超码函数依赖
ID → name, salary, dept_name, building, budget

函数依赖在关系实例和关系模式上的体现区别:

  1. 如果关系实例r在函数依赖集F上合法,则称r满足F
  2. 如果模式R上的所有合法关系实例都满足函数依赖集F,我们说F在关系模式R上成立

notice:即使函数依赖并没有对关系模式r®的所有合法实例成立,这个关系模式的其中一个具体实例r可能满足函数依赖

相关术语

有些函数依赖被称为平凡(trivial)的,因为它们在所有关系中都是满足的
• name → name
• ID, name → ID

如果 β ⊆ α \beta\sube \alpha β⊆α, α → β \alpha \rightarrow \beta α→β是平凡的函数依赖
β ⊈ α \beta\not\subseteq \alpha β​⊆α, α → β \alpha \rightarrow \beta α→β则这个是非平凡的函数依赖
α → β \alpha \rightarrow \beta α→β 则 α \alpha α是决定因素

函数依赖 α → β \alpha \rightarrow \beta α→β 称为部分依赖的条件是:存在 α \alpha α的真子集γ,
使得 γ → β γ→ \beta γ→β

闭包

从给定函数依赖集F能够推导出的所有函数依赖的集合,我们称之为F集合的闭包
A → B , B → C A\rightarrow B, B\rightarrow C A→B,B→C
推出 A → C A\rightarrow C A→C
我们用 F + F^+ F+来表示函数依赖集F的闭包,是F的超集

  1. 给定关系模式r( R ),如果r( R ) 的每个满足F的 实例也满足某个函数依赖,则R上的函数依赖f逻辑蕴含(logically imply)于r上的函数依赖集F
  2. 已知关系R上的函数依赖集T、F,如果对于该关系中满足F的每一个关系实例都满足T,称函数依赖集F 逻辑蕴含 函数依赖集T
  3. 若F蕴含于T,且T蕴含于F,则函数依赖集T和F是等价的,记为T≡F

推理规则

Armstrong公理:

  1. 如果 β ⊆ α \beta\sube \alpha β⊆α, , 则有 α → β \alpha \rightarrow \beta α→β (自反律)
  2. 如果 α → β \alpha \rightarrow \beta α→β, 则有 γ α → γ β \gamma\alpha \rightarrow \gamma\beta γα→γβ (增补律)
  3. 如果 α → β \alpha \rightarrow \beta α→β及 β → γ \beta \rightarrow \gamma β→γ, 则有 α → γ \alpha \rightarrow \gamma α→γ (传递律)

有效的:它们不会产生错误的函数依赖
完备的:对一个给定函数依赖集F,它们能产生整个F+

函数依赖证明(A → H):
已知A → B,根据函数依赖定义,可得:

对于任意元组t1, t2,如果t1[A] = t2[A],那么 t1[B]=t2[B]
已知B → H,同理可得:如果t1[B] = t2[B],那么 t1[H]=t2[H]
综上可得:如果t1[A] = t2[A],那么t1[H] = t2[H],即A → H得证

计算函数依赖集F的闭包算法:

repeatfor each F +中的函数依赖 f在f上应用自反律和增补律将结果加入到F +中for each F +中一对函数依赖f1和 f2if f1 和 f2 可以使用传递律结合起来将结果加入到F +中
until F + 不再发生变化

附加定理:
若有 α → β \alpha \rightarrow \beta α→β 及 α → γ \alpha \rightarrow \gamma α→γ, 则有 α → γ β \alpha \rightarrow \gamma\beta α→γβ (合并律)
若有 α → γ β \alpha \rightarrow \gamma\beta α→γβ, 则有 α → β \alpha \rightarrow \beta α→β 及 α → γ \alpha \rightarrow \gamma α→γ (分解律)
若有 α → β \alpha \rightarrow \beta α→β及 β γ → δ \beta\gamma \rightarrow \delta βγ→δ, 则有 α γ → δ \alpha\gamma \rightarrow \delta αγ→δ (伪传递律)

给定属性集 α \alpha α, 我们称在函数依赖集F下由 α \alpha α函数确定的所有属性集合为F下 α \alpha α的闭包,记为 α + \alpha^+ α+

算法

result := α;
while (result发生变化) dofor each 函数依赖 β → γ in F dobeginif β ⊆  result then result := result ∪ γend

闭包用途

属性闭包算法有多个用途:

  1. 超码的判断:

    • 判断α 是不是超码,通过计算α+,看α+ 是否包含R中的所有属性
  2. 验证函数依赖:
    • 要检验函数依赖α → β是否成立 (换句话说,是否在F +中), 只需要检验是否β ⊆ α+
    • 也就是说,我们用属性闭包计算α+ ,看它是否包含β
    • 是一个简单快速的验证方法,但是很有用
  3. 计算F的闭包:
    • 对任意的γ ⊆ R, 我们找出闭包γ+;对任意的S ⊆ γ+, 我们输出一个函数依赖γ → S

规范化(Normalization)

一个数据库的描述对象包括:学生(Sno),系(Sdept)、系负责人(Name)、课程(Cname)和成绩(G)

U ={Sno, Sdept, Name, Cname, G}
FD ={ Sno->Sdept,Sdept->Name,(Sno,Cname)->G }建立关系模式:S(Sno, Sdept, Name, Cname, G)

存在问题:
➢ 数据冗余
➢ 需要用空值来表示某些信息

可以将S分解为三个关系模式:

 S(Sno, Sdept)SG(Sno, Cname, G)Dept(Sdept, Name)

假设R是关系模式,具有函数依赖集F
在关系模式不是“好”的模式的情况下,将其分解成
关系模式集 { A 1 , A 2 , … , A n } \{A_1, A_2,…, A_n\} {A1​,A2​,…,An​}

  1. 每个关系模式都是好的模式:无数据冗余(符合一定范式,例如BCNF)
  2. 分解是无损连接分解
  3. 最好的是,分解是保持依赖的(p225)

各种范式之间包含关系如下
1 N F ⊃ 2 N F ⊃ 3 N F ⊃ B C N F ⊃ 4 N F ⊃ 5 N F 1NF \supset 2NF \supset 3NF \supset BCNF \supset 4NF \supset 5NF 1NF⊃2NF⊃3NF⊃BCNF⊃4NF⊃5NF
某一关系模式R最高属于第n范式,可简记为R∈nNF

第一范式

如果某个域的元素被认为是不可分的单元,那么这个域就是原子的

✓非原子域的例子:
• 复合属性(E-R模型)
• 类似于CS101的ID(只要数据库应用没有将CS标识号拆开并解析为系的缩写,那么可认为是原子的)

如果一个关系模式R的所有属性域都是原子的,我们称关系模式R属于第一范式
非原子的值会造成复杂存储及数据冗余

第二范式

例: 关系模式 SLC(S#, SD, SL, C#, G)
SL为学生住处,假设每个系的学生住在同一个地方
SD为学生所在系,假设每个学生属于一个系

若存在如下函数依赖
{ ( S # , C # ) → f G ; ( S # , C # ) → P S D ; S D → S L ; ( S # , C # ) → P S L } \{ (S\#,C\#) \mathop{\rightarrow}\limits^{f}G; (S\#,C\#) \mathop{\rightarrow}\limits^{P}SD; SD\rightarrow SL; (S\#,C\#) \mathop{\rightarrow}\limits^{P}SL \} {(S#,C#)→fG;(S#,C#)→PSD;SD→SL;(S#,C#)→PSL}

SLC (S#, SD, SL, C#, G)分解为
两个关系模式:
S C ( S # ‾ , C # ‾ , G ) S L ( S # ‾ , S D , S L ) SC(\underline{S\#}, \underline{C\#}, G) SL(\underline{S\#}, SD, SL) SC(S#​,C#​,G)SL(S#​,SD,SL)

2NF的定义
若关系模式R∈1NF,且在F+中每一个非主属性完全函数依赖于候选码,则R∈2NF

Boyce-Codd范式 BCNF

具有函数依赖集F的关系模式R属于BCNF的条件是:对所有F+中形如 α → β \alpha \rightarrow \beta α→β的函数依赖( β ⊆ R \beta \subseteq R β⊆R且 α ⊆ R \alpha \subseteq R α⊆R ),下面至少有一个成立:

  1. α → β \alpha \rightarrow \beta α→β是平凡函数依赖
  2. α \alpha α是模式R的一个超码

不属于BCNF的模式的例子:

i n s t _ d e p t ( I D ‾ , n a m e , s a l a r y , d e p t _ n a m e , b u i l d i n g , b u d g e t ) inst\_dept (\underline{ID}, name, salary, dept\_name, building,budget) inst_dept(ID​,name,salary,dept_name,building,budget)
因为 dept_name → building, budget 在inst_dept上成立,但是 dept_name 不是超码

另一个判定标准:
另一个判定准则:在关系模式R(U, F)中,如果F+中的每一个非平凡 函数依赖的 决定属性集都包含候选码(即为超码),则
r ( R ) ∈ B C N F r(R)∈BCNF r(R)∈BCNF

BCNF范式:排除了任何属性(包括主属性和非主属性)对候选码的部分依赖传递依赖,也排除了主属性之间传递依赖

例子

  1. r( R)=r(A,B,C), F={ A->B,B->C }.
    r( R)的候选码为A
    r ( R ) ∉ B C N F r(R) ∉ BCNF r(R)∈/​BCNF
  2. r( R)=r(A,B,C),F={ AB->C,C->A }.
    r( R)的候选码为AB和BC
    r ( R ) ∉ B C N F r(R) ∉ BCNF r(R)∈/​BCNF
  3. r( R)=r(A,B,C),F={ AB->C,BC->A }.
    r( R)的候选码为AB和BC
    r ( R ) ∈ B C N F r(R) ∈ BCNF r(R)∈BCNF

假设有模式R,及其一个非平凡依赖 α → β \alpha \rightarrow \beta α→β 不属于BCNF,那么我们可以将R分解成:
( a ∪ β ) 和 ( R − ( β − α ) ) (a\cup \beta) 和 (R-(\beta - \alpha)) (a∪β)和(R−(β−α))
inst_dept的例子中

α = dept_name
β = building, budget

inst_dept 被以下两个模式取代

 ( dept_name, building, budget )( ID, name, salary, dept_name )

有可能分解完之后仍有关系模式不符合BCNF,那么continue

保持依赖

检查包括各种约束(码、check子句、函数依赖、断言等)的开销是很大的,但是如果只涉及到单个关系,检查约束的开销相对较低

然而,BCNF分解会妨碍某些函数依赖的高效检查

如果F上的每一个函数依赖都在其分解后的一个关系上成立,那么这个分解是保持依赖的

因为通常无法同时实现BCNF和保持依赖,因此我们考虑另外一种范式,它比BCNF宽松,允许我们保持依赖,称为第三范式

第三范式

具有函数依赖集F的关系模式R属于第三范式(3NF)的条件是:对F+ 中所有形如 →  的函数依赖中,至少有以下之一成立

  1. α → β \alpha \rightarrow \beta α→β 是一个平凡的函数依赖
  2. α 是R的一个超码
  3. β - α 中的每个属性A都包含在R的候选码中
    (注意: 每个属性也许包含在不同的候选码中

➢ 第三个条件是BCNF的一个最小放宽:即允许存在主属性对候选码的传递依赖和部分依赖,在函数依赖集F中用来满足保持某些函数依赖

等价定义
关系模式R(U, F)中,若不存在这样的码X、属性组Y及非主属性Z( Z ⊈ Y Z\not\sube Y Z​⊆Y)使得 X → Y X\rightarrow Y X→Y( Y ↛ X , Y ↛ X , Y → Z Y\not\rightarrow X, Y\not\rightarrow X, Y\rightarrow Z Y​→X,Y​→X,Y→Z),则称
R ( U , F ) ∈ 3 N F R(U,F)\in 3NF R(U,F)∈3NF

具有属性依赖集F的关系模式R属于3NF,则R张任何非主属性A不部份依赖与码也不传递依赖于R的码


在关系模式SJP(S,J,P)中,S表示学生,J表示课程, P表示名次。存在函数依赖集F:{(S,J)→P,(J,P)→S}
候选码: (S,J), (J,P)
S, J, P都是主属性

因为: 没有非主属性部份依赖或传递依赖于候选码
所以: STJ ∈ 3NF因为:对于F任意一个 X → Y,X都是候选码
所以:STJ ∈ BCNF

例:在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。存在如下函数依赖:

每一教师只教一门课;某一学生选定某门课,就确定了一位授课教师;某个学生选修某个教师的课就确定了所选课的名称(假设)F={T→J,(S,J)→T,(S,T)→J}

∵ (S,J)和(S,T)都是候选码
∴ S、T、J都是主属性∵ 没有非主属性部分依赖或传递依赖于候选码
∴ STJ∈3NF∵ T→J,T是决定属性集,T不是候选码
∴ STJ \not ∈ BCNF

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

原始函数依赖(S,J)→T,(S,T)→J 在该符合BCNF的关系模式中无法保持

BCNF足够优秀吗?

考虑一个关系模式
inst_info (ID, child_name, phone)
其中,一个instructor可以有多个children和多个phone
由于该关系模式中只有平凡的函数依赖关系存在,因此其属于BCNF

然而该BCNF模式仍存在由多值依赖(p238)造成的信息冗余:如果需要为99999教师增加一个电话号码981-992-3443,那么需要增加两条元组,如下

(99999, David, 981-992-3443)
(99999, William, 981-992-3443)

可以将inst_info关系模式分解为两个关系模式
inst_child(ID, child_name)
inst_phone(ID, phone)

因此,需要更为严格的范式来规范关系模式,如4NF

函数依赖理论

正则覆盖

函数依赖集可能存在冗余依赖(这些依赖可以从其他依赖中推导出来)
在 {A → B, B → C, A→C }中A → C是冗余的

函数依赖集的一部分也可能是冗余的
如: {A → B, B → C, A → CD }
可以简化成 {A → B, B → C, A → D }
如: {A → B, B → C, AC → D }
可以简化为 {A → B, B → C, A → D }

直观上,F的正则覆盖 F c F_c Fc​没有任何冗余依赖或存在冗余部分的依赖
F c F_c Fc​具有和F相同的函数依赖集闭包。其意义在于:验证 F c F_c Fc​比验证F更加容易、3NF算法必备

无关属性

如果去除函数依赖中的一个属性不改变该函数依赖集的闭包,则称该属性是无关属性(extraneous)

形式化定义:考虑函数依赖集F及F中函数依赖 α → β

  • 如果A ∈ α并且F逻辑蕴涵(F – {α→ β}) ∪ {(α – A)→β},则属性A在α 中是无关的
  • 如果A ∈ β并且函数依赖集(F – {α→β}) ∪ {α→(β–A)} 逻辑蕴涵F,则属性A在β中是无关的

eg: 给定 F = {A → C, AB → C}

  • B 是AB → C中的无关属性,因为 {A → C, AB → C}逻辑蕴涵A → C (即从 AB → C中去掉B后的结果)

eg: 给定 F = {A → C, AB → CD}

  • C是AB → CD中的无关属性

验证方法

考虑函数依赖集F及F中的函数依赖α → β.
验证属性A ∈ α 是不是多余的

  1. 使用F中的函数依赖计算属性集闭包 ( α – A ) + (\alpha –A)^+ (α–A)+
  2. 验证 ( α – A ) + (α –A)^+ (α–A)+ 是否包含β;如果包含,那么A 是多余属性

验证属性A ∈ β 在 β 中是否多余

  1. 使用函数依赖集F’= (F –{α → β}) ∪ {α →(β–A)}计算 α + \alpha^+ α+
  2. 验证 α + \alpha^+ α+ 是否包含A;如果包含,那么A 在α中是多余属性

正则覆盖

计算F的正则覆盖算法:首先,初始化Fc= F;
repeat使用合并律将Fc中的形如α1 → β1 及 α1 → β2 的依赖替换为 α1 → β1β2在Fc中找出 在α或中含无关属性的函数依赖α → β/* 注意:使用Fc而不是F检验无关属性*/若发现无关属性则将它从Fc中的α → β中删除
until Fc 不再发生变化

注意:在删除了某些无关属性后可能需要使用合并律,因此合并律会重复应用

F的正则覆盖Fc是一个函数依赖集 ,具有如下特性:

  • F 逻辑蕴涵Fc中的所有函数依赖
  • Fc逻辑蕴涵F中的所有函数依赖
  • Fc中任何函数依赖都不含无关属性
  • Fc中函数依赖的左半部都是不同
R = (A, B, C)
F = { A → BC,B → C,A → B,AB → C }✓合并 A → BC 和 A → B ,形成 A → BC修改Fc1为{ A → BC, B → C, AB → C }✓A在AB → C中是无关属性利用Fc1检验(AB-A)+是否包含C包含,则修改Fc2为{ A → BC, B → C }✓C在A → BC中是无关属性计算F’{A → B, B → C}下A+闭包是否包含C包含,则修改Fc3为{A → B, B → C}

正则覆盖是
A → B B → C A\rightarrow B\\ B\rightarrow C A→BB→C

无损分解

对于R = (R1, R2), 我们要求模式R上的所有可能关系r都有
r = Π R 1 ( r ) ⋈ Π R 2 ( r ) r=\Pi_{R1}(r) \Join \Pi_{R2}(r) r=ΠR1​(r)⋈ΠR2​(r)

如果下面的依赖中至少有一个属于 F + F^+ F+,那么将R分解成 R1 和R2 是无损分解连接:
R 1 ∩ R 2 → R 1 R 1 ∩ R 2 → R 2 R1 \cap R2 → R1\\ R1 \cap R2 → R2 R1∩R2→R1R1∩R2→R2
即 R1 ∩ R2 是R1或R2的超码

上述函数依赖测试只是无损连接分解的一个充分条件;只有当所有约束都是函数依赖时,它才是必要条件(某些情况下,即使不存在函数依赖的情况下,仍可保证一个分解是无损分解)

eg

R = ( A, B, C )
F = { A → B, B → C }
//  可以通过两种方式分解 1.R1 = (A, B), R2 = (B, C) 无损连接分解: R1 ∩ R2 = { B }B→ BC2.
R1 = (A, B), R2 = (A, C)无损连接分解: R1 ∩ R2= { A }A → AB

保持依赖

F为模式R上的一个函数依赖集,R1,R2, … , Rn为R的一个分解。F在Ri上的限定是 F + F^+ F+中所有只包含Ri中属性的函数依赖的集合Fi

方法一(图8-10):令 F ’ = F 1 ∪ F 2 ∪ … ∪ F n F’ = F_1 \cup F_2 \cup … \cup F_n F’=F1​∪F2​∪…∪Fn​。 F’ 是模式R上的一个函数依赖集

  • 如果下面的式子成立,那么分解是保持依赖的
    ( F ’ ) + = F + (F’ )^+ = F^+ (F’)+=F+
  • 称具有性质 ( F ’ ) + = F + (F’ )^+ = F^+ (F’)+=F+的分解为保持依赖的分解

方法二(充要条件):当R分解成R1, R2, …, Rn后,应用以下算法,验证F中每一个函数依赖α → β 是否被保持:

result = α
while (result发生变化) dofor each 分解后的Rit =((result ∩ Ri)^+) ∩ Riresult = result ∪ t
  • 如果result 包含β中的所有属性,那么函数依赖 α → β 被保持
  • 可以将这个验证应用到所有F中的依赖,来验证这个分解是否保持依赖
  • 方法的好处:没有计算F在Ri上的限定并使用它计算result 的属性闭包,而是使用F上(result ∩ Ri)上的属性闭包得到一个相同的结果`

eg

R = (A, B, C)
F = {A → B, B → C}
// 可以通过两种方式分解R1 = (A, B), R2 = (B, C)
无损连接分解: 保持依赖R1 ∩ R2 = {B} and B → BCR1 = (A, B), R2 = (A, C)
无损连接分解: 不保持依赖
R1 ∩ R2 = {A} and A → AB(不计算R1 \Join R2, 无法验证B →C)

分解算法

对于 F + F^+ F+中非平凡依赖 α → β \alpha\rightarrow \beta α→β验证是否违反BC范式

  1. 计算 α + \alpha^+ α+
  2. 检验是否包含R的所有属性,验证是否是R的超码

检查R是否属于BCNF,检查F的函数依赖是否违反BCNF(如果F中没有违反BCNF的函数依赖,那么F+中也不会有违反BCNF的函数依赖)

在检测由关系R分解后的关系Ri是否满足BCNF范式时,只使用F是不正确的

R = (A, B, C, D, E), F = { A → B, BC → D}
• 将R 分解成R1 = (A,B) 和 R2 = (A,C,D, E)
• F中没有一个依赖仅包含来自(A,C,D,E)的属性,所以我们可能误认为R2满足BCNF
• 事实上,F+中有一个函数依赖AC → D,这表明R2不属于BCNF

检查R分解后的关系Ri是否属于BCNF

  • 使用F在Ri上的限定检测 R i R_i Ri​是否满足BCNF (即, F + F^+ F+中只包含 R i R_i Ri​中的属性的FD)
  • 使用R中成立的原来的依赖集F 进行以下测试
    • 对每个属性集 α ∈ R i \alpha \in R_i α∈Ri​, 确保 α + \alpha^+ α+(在F下的)要么不包含 R i − α R_{i} - \alpha Ri​−α的任何属性,要么包含 R i R_i Ri​的所有属性
    • 如果F中的某些函数依赖 α → β \alpha\rightarrow \beta α→β违反了该条件,那么
      如下函数依赖出现在F+中: α → ( α + − α ) ∩ R i \alpha\rightarrow (\alpha^+-\alpha) \cap R_i α→(α+−α)∩Ri​则Ri违反了BCNF

      我们将关系模式R分解成:
  • ( α ∪ β ) (\alpha \cup \beta ) (α∪β)
  • ( R − ( β − α ) ) ( R - ( \beta - \alpha ) ) (R−(β−α))

α \alpha α = dept_name
β \beta β = building, budget

inst_dept

  • ( α ∪ β ) (\alpha \cup \beta ) (α∪β) = ( dept_name, building, budget )
  • ( R − ( β − α ) ) ( R - ( \beta - \alpha ) ) (R−(β−α)) = ( ID, name, salary, dept_name )

example

class (course_id, title, dept_name, credits, sec_id, semester, year, building, room_number, capacity, time_slot_id)# 函数依赖
course_id → title, dept_name, credits
building, room_number → capacity
course_id, sec_id, semester, year → building, room_number, time_slot_id候选码{course_id, sec_id, semester, year}.

分析:
course_id→ title, dept_name, credits 不符合BCNF要求
但是 {building, room_number} 不是class-1的超码
拆成三部分

R = (J, K, L )
F = {JK → L, L → K }

两个候选码:JK 和JL
✓R 不满足BCNF
✓R 满足3NF
✓R 的任何分解都不可能保持
J K → L JK → L JK→L
✓这意味着要验证 JK → L 需要连接操作

✓BCNF分解可能无法做到保持依赖
✓能够有效的验证更新是否违反函数依赖很重要
解决方法:采用一个稍弱的范式,第三范式

  1. 允许冗余(会引起问题)
  2. 但是函数依赖可以在不进行连接操作的情况下在单个关系上检验
  3. 总是能够在无损连接及保持依赖的情况下分解成3NF

关系dept_advisor:
dept_advisor (s_ID, i_ID, dept_name)
F = { s_ID, dept_name → i_ID, i_ID → dept_name }

  1. 两个候选码: s_ID, dept_name, 和 i_ID, s_ID
  2. R 是3NF
  • s_ID, dept_name → i_ID

    • s_ID,dept_name 是超码
  • i_ID → dept_name
    • β − α \beta - \alpha β−α= dept_name 在一个候选码中

冗余覆盖

➢ 信息重复

  1. R中( l1, k1)
  2. dept_advisor中(i_ID, dept_name)

➢ 需要使用空值

  1. R中没有对应l2, k2的J值.
  2. dept_advisor (s_ID,i_ID, dept_name) 没有学生信息时

cust_banker_branch = (customer_id, employee_id, branch_name, type)函数依赖是:
1. customer_id, employee_id → branch_name, type
2. employee_id → branch_name
3. customer_id, branch_name → employee_id

计算正则覆盖

✓ 1
st 依赖中是branch_name多余的
✓ 没有其他冗余属性,所以得到 FC =customer_id, employee_id → typeemployee_id → branch_namecustomer_id, branch_name → employee_id产生下面的3NF模式:
(customer_id, employee_id, type) <- primary key(c_id, e_id)
(employee_id, branch_name) <- primary key(e_id)
(customer_id, branch_name, employee_id)<-  primary key(c_id, b_name)

(customer_id, employee_id, type ) 包含了原模式的一个候选码,因此没有其他关系模式需要添加

检测并删除类似(employee_id, branch_name)的模式,这个模式是其它模式的子集

由此产生的简化3NF模式为:

(customer_id, employee_id, type)
(customer_id, branch_name, employee_id)

BC和3的比较

BCNF和3NF的比较
➢ 总能够把一个关系分解为多个满足3NF的关系,并且:
✓分解是无损的
✓保持依赖
✓可能存在信息冗余
➢ 总能够把一个关系分解为多个满足BCNF的关系,并且:
✓分解是无损的
✓可能不满足保持依赖

➢ 关系数据库设计目标:
✓BCNF
✓无损
✓保持依赖
➢ 如果不能同时达到上述三个目标,选择接受下面的其中一个
✓缺少保持依赖
✓使用3NF,可能带来冗余
➢ 除了可以通过用主码外,SQL不提供指定函数依赖的途径.
特殊的FD可以使用断言,但是测试代价太高(目前不被大多
数数据库所支持)
➢ 即使我们能够得到保持依赖的分解,使用SQL 还是不能有效
地测试一个左边不是主码的函数依赖

review
➢什么是有损分解、无损分解?
➢什么是原子域和第一范式?
➢什么是函数依赖?
➢什么是BCNF和3NF?
➢什么是逻辑蕴含?函数依赖集的闭包、属性集
的闭包、正则覆盖?
➢如何将一个关系模式分解为属于BCNF、3NF
的关系模式

数据库理论 05 关系数据库设计——基于《数据库系统概念》第七版相关推荐

  1. 【数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取】

    数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取 数据库大黑书获取配套SQL文件 最后在数据库运行SQL文件即可 数据库大黑书获取配套SQL文件 ...

  2. 数据库系统概念第六版 第四章练习题 12 14 18

    数据库系统概念第六版 第四章练习题 12 14 18 4.12 对于图中的数据库,写出一个查询来找到那些没有经理的雇员.注意一个雇员可能只是没有列出其经理或者可能有null经理.使用外连接书写查询,然 ...

  3. 数据库系统概念第六版 第五章练习题 2 4

    数据库系统概念第六版 第五章练习题 2 4 5.2 写一个使用JDBC元数据特性的JAVA函数,该函数用ResultSet作为输入参数,并把结果输出为用合适的名字作为列名的表格形式. (对JAVA不太 ...

  4. mysql图书管理数据库的三个关系模式_数据库 考虑如下关于图书馆的关系模式,用关系代数写出查询(数据库系统概念第六版6.14)...

    贝尔梅尔娜美 2019.03.15 采纳率:60%    等级:39 已帮助:91565人 数据库系统的基本概念 数据:实际上就是描述事物的符号记录. 数据的特点:有一定的结构,有型与值之分,如整型. ...

  5. 数据库系统概念-第六版 - charter 1 - 笔记

    <1>数据库系统(Database System,DBS) 由一个相互关联的数据的集合和一组用以访问这些数据的程序组成:这个数据集合通常被称作数据库(Database): DBS的主要目标 ...

  6. 数据库系统概念 | 第七章:使用E-R模型的数据库设计 | ER图设计| ER图转化为关系模型 | 强实体和弱实体

    文章目录

  7. 关系数据库规范化理论(关系数据库设计理论)

    学习网址 :中国大学MOOC https://www.icourse163.org/spoc/learn/ZZULI-1207222804?tid=1450316458#/learn/content? ...

  8. 数据库系统概念 第六版 大学数据库代码

    官网 create table classroom(building varchar(15),room_number varchar(7),capacity numeric(4,0),primary ...

  9. 数据库系统概念第六版笔记

    Abraham Siberschatz Henry E Korth S.Sudarshan 杨冬青 李红艳 唐世渭等译. 华章一套书的标志性语言是: 文艺复兴以降,源远流长的科学精神和逐步形成的学术规 ...

最新文章

  1. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)解决方法
  2. 关于Ant与Maven(一)
  3. jsp压缩html,使用HtmlCompressor压缩JSP编译的Html代码
  4. 在控制台输出九九乘法表
  5. 串口之GetCommTimeouts、SetCommTimeouts函数详解
  6. java的mysql语句规范_常用的标准SQL 语句
  7. CentOS 7 修改IP地址
  8. idea 调试java技巧_Intellij IDEA Debug 调试技巧
  9. 线段树模板--单点更新+区间求和
  10. 一段经典的 Java 风格程序 ( 类,包 )
  11. java中的时间戳sssss,Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。...
  12. tcpip详解卷一 pdf_清华大牛爆肝分享网络底层/网络协议/TCP/IP协议详解卷一
  13. 深入理解SSIM(两图像结构相似度指标)(附matlab代码)
  14. win10重装系统教程【图文并茂】
  15. 高通SDM439平台使能sensor hub的auto detect模式
  16. 计算机热启动方法,关于电脑热启动的介绍
  17. linux系统文件名颜色含义
  18. ubuntu自动安装显卡驱动
  19. android程序突然崩溃如何调试,Android应用开发android 调试崩溃Unable to instantiate application的解决方法...
  20. 在ArcGIS中快速搭建三维场景教程(从数据获取到软件制作)

热门文章

  1. HTMLCSS的语法与使用
  2. Excel甘特图 Gantt Chart
  3. 数据归一化 minmax_scale()函数解析
  4. crash日志学习(初步)
  5. PHP字体间距设置,wps字间距怎么调整
  6. 小程序转uni-app——动态转换样式
  7. 小程序转uni-app——引入组件显示问题
  8. 登录显示服务器端校验不通过,SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.57 SMTP;...
  9. 初中学考英语听说计算机考试,2018中考英语听说计算机考试工作重要通知
  10. 干货 | 数字经济创新创业——数字技术创造新经济