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

通过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 AB不成立,反之成立

函数依赖和码

➢ 超码:在某关系中,若一个或多个属性的集合 { 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). instdept(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 AB,BC
推出 A → C A\rightarrow C AC
我们用 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的闭包算法:

repeat
	for each F +中的函数依赖 f
		在f上应用自反律和增补律
		将结果加入到F +中
	for each F +中一对函数依赖f1和 f2
		if 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发生变化) do
	for each 函数依赖 β → γ in F do
		begin
			if β ⊆  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 1NF2NF3NFBCNF4NF5NF
某一关系模式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;SDSL;(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) SCS#,C#,GSLS#,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 ZY)使得 X → Y X\rightarrow Y XY( Y ↛ X , Y ↛ X , Y → Z Y\not\rightarrow X, Y\not\rightarrow X, Y\rightarrow Z YX,YX,YZ),则称
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 ABBC

无损分解

对于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 R1R2R1R1R2R2
即 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→ BC

2.
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=F1F2Fn。 F’ 是模式R上的一个函数依赖集

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

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

result = α
while (result发生变化) do
	for each 分解后的Ri
		t =((result ∩ Ri)^+) ∩ Ri
		result = 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 → BC

 R1 = (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 JKL
✓这意味着要验证 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 → type
	employee_id → branch_name
	customer_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
的关系模式

目 录 译者序 第7版序言 第一部分 基础知识 第1章 数据库管理概述 1 1.1 引言 1 1.2 什么是数据库系统 3 1.3 什么是数据库 6 1.4 为什么用数据库 10 1.5 数据独立性 12 1.6 关系系统及其他 15 1.7 小结 17 练习 17 参考文献和简介 19 部分练习答案 19 第2章 数据库系统体系结构 22 2.1 引言 22 2.2 三级体系结构 22 2.3 外模式 24 2.4 概念模式 26 2.5 内模式 26 2.6 映象 27 2.7 数据库管理员 27 2.8 数据库管理系统 28 2.9 数据通信管理器 31 2.10 客户/服务器体系结构 31 2.11 工具 33 2.12 分布式处理 33 2.13 小结 35 练习 35 参考文献和简介 36 第3章 关系数据库介绍 38 3.1 引言 38 3.2 关系模型概述 38 3.3 关系和关系变量 41 3.4 关系的含义 42 3.5 优化 44 3.6 数据字典 45 3.7 基本关系变量和视图 46 3.8 事务 49 3.9 供应商和零件数据库 49 3.10 小结 51 练习 52 参考文献和简介 53 部分练习答案 54 第4章 SQL概述 55 4.1 引言 55 4.2 综述 56 4.3 目录 58 4.4 视图 59 4.5 事务 59 4.6 嵌入式SQL 59 4.7 SQL是不完美的 66 4.8 小结 66 练习 67 参考文献和简介 68 部分练习答案 73 第二部分 关系数据模型 第5章 域、关系和基本关系变量 77 5.1 引言 77 5.2 域 79 5.3 关系值 86 5.4 关系变量 90 5.5 SQL的支持 93 5.6 小结 96 练习 97 参考文献和简介 98 部分练习答案 101 第6章 关系代数 106 6.1 引言 106 6.2 关系封闭性 107 6.3 语法 109 6.4 语义 110 6.5 举例 117 6.6 关系代数的作用 119 6.7 附加的操作符 120 6.8 分组与分组还原 125 6.9 关系比较 127 6.10 小结 128 练习 129 参考文献和简介 131 部分练习答案 133 第7章 关系演算 140 7.1 引言 140 7.2 元组演算 141 7.3 举例 147 7.4 关系演算与关系代数的比较 149 7.5 计算能力 152 7.6 域演算 153 7.7 SQL语言 155 7.8 小结 162 练习 163 参考文献和简介 165 部分练习答案 167 第8章 完整性 179 8.1 引言 179 8.2 类型约束 180 8.3 属性约束 181 8.4 关系变量约束 182 8.5 数据库约束 182 8.6 黄金法则 183 8.7 静态约束和动态约束 184 8.8 码 185 8.9 SQL对完整性的支持 191 8.10 小结 194 练习 194 参考文献和简介 196 部分练习答案 201 第9章 视图 209 9.1 引言 209 9.2 视图的用途 211 9.3 视图检索 213 9.4 视图更新 214 9.5 快照 225 9.6 SQL对视图的支持 226 9.7 小结 227 练习 228 参考文献和简介 229 部分练习答案 232 第三部分 数据库设计 第10章 函数依赖 238 10.1 引言 238 10.2 基本概念 239 10.3 平凡的函数依赖和非平凡的函数 依赖 241 10.4 依赖集的闭包 241 10.5 属性集的闭包 242 10.6 最小函数依赖集 244 10.7 小结 245 练习 246 参考文献和简介 247 部分练习答案 249 第11章 进一步规范化Ⅰ:1NF、2NF、 3NF和BCNF 252 11.1 引言 252 11.2 无损分解和函数依赖 254 11.3 第一、第二和第三范式 257 11.4 保持函数依赖 262 11.5 BOYCE/CODD范式 264 11.6 具有关系值属性的关系变量 268 11.7 小结 270 练习 270 参考文献和简介 272 部分练习答案 274 第12章 进一步规范化Ⅱ:高级范式 282 12.1 引言 282 12.2 多值依赖与第四范式 282 12.3 连接依赖与第五范式 285 12.4 规范化过程小结 289 12.5 逆规范化 291 12.6 正交设计 292 12.7 其他的规范化形式 295 12.8 小结 296 练习 296 参考文献和简介 297 部分练习答案 302 第13章 语义建模 306 13.1 引言 306 13.2 总体方法 307 13.3 E/R模型 309 13.4 E/R图 312 13.5 基于E/R模型的数据库设计 313 13.6 简单分析 317 13.7 小结 319 练习 320 参考文献和简介 321 第四部分 事务管理 第14章 恢复 333 14.1 引言 333 14.2 事务 334 14.3 事务恢复 335 14.4 系统恢复 337 14.5 介质恢复 338 14.6 两阶段提交 338 14.7 SQL对事务的支持 339 14.8 小结 340 练习 341 参考文献和简介 341 部分练习答案 345 第15章 并发 347 15.1 引言 347 15.2 三个并发问题 347 15.3 锁 349 15.4 重提三个并发问题 350 15.5 死锁 352 15.6 可串行性 353 15.7 隔离级别 354 15.8 意向锁 355 15.9 SQL的支持 357 15.10 小结 358 练习 359 参考文献和简介 360 部分练习答案 365 第五部分 高级专题 第16章 安全性 369 16.1 引言 369 16.2 自主存取控制 371 16.3 强制存取控制 375 16.4 统计数据库 377 16.5 数据加密 381 16.6 SQL的支持 384 16.7 小结 386 练习 387 参考文献和简介 388 部分练习答案 390 第17章 优化 394 17.1 引言 394 17.2 一个启发性的例子 395 17.3 查询处理概述 396 17.4 表达式变换 399 17.5 数据库统计信息 403 17.6 分而治之的策略 404 17.7 关系操作的实现算法 406 17.8 小结 410 练习 411 参考文献和简介 413 部分练习答案 430 第18章 信息空缺 432 18.1 引言 432 18.2 3VL方法概述 433 18.3 上述方案所造成的某些结果 437 18.4 空值和码 440 18.5 外连接 442 18.6 特殊值 444 18.7 SQL的支持 444 18.8 小结 447 练习 448 参考文献和简介 449 部分练习答案 452 第19章 类型继承 454 19.1 引言 454 19.2 类型的层次结构 457 19.3 多态性和可置换性 459 19.4 变量与赋值 462 19.5 约束特化 465 19.6 比较 467 19.7 操作、版本和签名 470 19.8 一个圆是一个椭圆吗 473 19.9 约束特化—再次讨论 476 19.10 小结 478 练习 479 参考文献和简介 480 部分练习答案 481 第20章 分布式数据库 484 20.1 引言 484 20.2 一些预备知识 484 20.3 十二个目标 487 20.4 分布式系统面对的问题 493 20.5 客户/服务器系统 502 20.6 DBMS独立性 504 20.7 SQL的支持 508 20.8 小结 509 练习 509 参考文献和简介 510 第21章 决策支持 518 21.1 引言 518 21.2 决策支持的特征 519 21.3 决策支持的数据库设计 520 21.4 数据准备 525 21.5 数据仓库和数据集市 527 21.6 联机分析处理 530 21.7 数据挖掘 535 21.8 小结 536 练习 537 参考文献和简介 538 部分练习答案 540 第22章 时态数据库 541 22.1 引言 541 22.2 时态数据 542 22.3 问题是什么 544 22.4 时间间隔 548 22.5 间隔类型 549 22.6 间隔上的标量操作符 551 22.7 间隔上的聚集操作符 551 22.8 与间隔有关的关系操作符 552 22.9 间隔上的约束 557 22.10 间隔上的更新操作符 559 22.11 关于数据库设计 560 22.12 小结 562 练习 563 参考文献和简介 563 部分练习答案 565 第23章 基于逻辑的数据库 567 23.1 引言 567 23.2 综述 567 23.3 命题演算 569 23.4 谓词演算 572 23.5 数据库的证明理论观点 577 23.6 演绎数据库系统 580 23.7 递归查询过程 583 23.8 小结 588 练习 589 参考文献和简介 590 部分练习答案 596 第六部分 对象和对象/关系数据库 第24章 对象数据库 599 24.1 引言 599 24.2 对象、类、方法和消息 602 24.3 进一步的分析 605 24.4 一个详实的例子 611 24.5 混合性问题 618 24.6 小结 624 练习 626 参考文献和简介 627 部分练习答案 634 第25章 对象/关系数据库 637 25.1 引言 637 25.2 第一个根本性错误 639 25.3 第二个根本性错误 644 25.4 实现上的问题 645 25.5 真正融合的好处 647 25.6 小结 648 参考文献和简介 649 附 录 附录A SQL表达式 657 附录B SQL3概览 666 附录C 缩略语和符号 678
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值