数据库理论 05 关系数据库设计——基于《数据库系统概念》第七版
通過E-R圖轉換得出一組關系模式后
**選擇1:**把一些關系模式合并為更大的關系 —— 會產生過多的數據冗余
如果通過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關系模式,那么在邏輯設計中,我們可以將其分解為兩個關系模式
如何知道該合并或分解關系模式呢?
并不是所有的關系模式拆分是有益的
將employee(ID, 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 7A → 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
函數依賴在關系實例和關系模式上的體現區別:
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的超集
推理規則
Armstrong公理:
有效的:它們不會產生錯誤的函數依賴
完備的:對一個給定函數依賴集F,它們能產生整個F+
函數依賴證明(A → H):
已知A → B,根據函數依賴定義,可得:
計算函數依賴集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閉包用途
屬性閉包算法有多個用途:
- 判斷α 是不是超碼,通過計算α+,看α+ 是否包含R中的所有屬性
- 要檢驗函數依賴α → β是否成立 (換句話說,是否在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 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 ),下面至少有一個成立:
不屬于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范式:排除了任何屬性(包括主屬性和非主屬性)對候選碼的部分依賴和傳遞依賴,也排除了主屬性之間的傳遞依賴
例子
r( R)的候選碼為A
r ( R ) ? B C N F r(R) ? BCNF r(R)∈/?BCNF
r( R)的候選碼為AB和BC
r ( R ) ? B C N F r(R) ? BCNF r(R)∈/?BCNF
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的例子中
inst_dept 被以下兩個模式取代
( dept_name, building, budget )( ID, name, salary, dept_name )有可能分解完之后仍有關系模式不符合BCNF,那么continue
保持依賴
檢查包括各種約束(碼、check子句、函數依賴、斷言等)的開銷是很大的,但是如果只涉及到單個關系,檢查約束的開銷相對較低
然而,BCNF分解會妨礙某些函數依賴的高效檢查
如果F上的每一個函數依賴都在其分解后的一個關系上成立,那么這個分解是保持依賴的
因為通常無法同時實現BCNF和保持依賴,因此我們考慮另外一種范式,它比BCNF寬松,允許我們保持依賴,稱為第三范式
第三范式
具有函數依賴集F的關系模式R屬于第三范式(3NF)的條件是:對F+ 中所有形如? → ? 的函數依賴中,至少有以下之一成立
(注意: 每個屬性也許包含在不同的候選碼中
? 第三個條件是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(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 ∈ α 是不是多余的
驗證屬性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中函數依賴的左半部都是不同的
正則覆蓋是
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范式
檢查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的超碼
拆成三部分
兩個候選碼:JK 和JL
?R 不滿足BCNF
?R 滿足3NF
?R 的任何分解都不可能保持
J K → L JK → L JK→L
?這意味著要驗證 JK → L 需要連接操作
?BCNF分解可能無法做到保持依賴
?能夠有效的驗證更新是否違反函數依賴很重要
解決方法:采用一個稍弱的范式,第三范式
關系dept_advisor:
dept_advisor (s_ID, i_ID, dept_name)
F = { s_ID, dept_name → i_ID, i_ID → dept_name }
- s_ID, dept_name → i_ID
- s_ID,dept_name 是超碼
- i_ID → dept_name
- β ? α \beta - \alpha β?α= dept_name 在一個候選碼中
冗余覆蓋
? 信息重復
? 需要使用空值
計算正則覆蓋
? 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 关系数据库设计——基于《数据库系统概念》第七版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BUAA OO Unit 2 HW8]
- 下一篇: java信息管理系统总结_java实现科