一般而言多矮,關系數(shù)據(jù)庫的設計目標是生成一組關系模式氯析,使我們存儲信息時避免不必要的冗余缎岗,并且讓我們可以方便地獲取信息静尼。這是通過設計滿足適當范式(normal form)的模式來實現(xiàn)的。
引例
-
首先有如下兩個模式
- instructor( <u>ID</u>, name, dept_name, salary )
- department( <u>dept_name</u>, building, budget )
-
若將上面兩個模式合并成一個大的模式
inst_dept(ID, name, salary, dept_name, building, budget)
存在數(shù)據(jù)冗余(building和budget被存儲了多份,實際上每個系的樓和預算只要存一次就好了)
存在插入鼠渺、刪除和更新異常
-
需要分解成更小的模式
-
并不是所有模式的分解都是有益的
employee(ID, name, street, city, salary)
-
分解成下面兩個模式
- employee1(ID, name)
- employee2(name, street, city, salary)
-
由于可能存在同名的可能鸭巴,所以分解以后導致了數(shù)據(jù)的丟失
- 比如有兩個叫Sunny的人,我們用其中一個Sunny的ID去查詢他的地址信息的時候系冗,因為存在兩份信息相互混淆奕扣,導致得不到正確的結果,但是在分解之前通過ID是可以得到唯一的地址的
-
有損分解和無損分解
- 像上面的例子中掌敬,分解以后導致信息丟失的分解稱之為有損分解(在實際進行分解時要避免這種分解)
- 反之則稱之為無損分解(無損分解在重新合并后可以得到和分解之前一致的狀態(tài))
函數(shù)依賴
-
什么是函數(shù)依賴惯豆?
- 有如下模式
- U = {Sno, Sname, Cno, Sdept, Mname, Grade} (分別代表學號、學生姓名奔害、課程號楷兽、系、系主任华临、分數(shù))
- Sname = f(Sno) ==>學生的姓名函數(shù)依賴于學號
- 記作:Sno→Sname
- 讀作:Sno推出Sname
- 有如下模式
-
非平凡函數(shù)依賴和平凡函數(shù)依賴
- X 和 Y 為模式U中一個或多個屬性的集合
- 非平凡函數(shù)依賴
- X→Y芯杀,但Y?X
- 平凡函數(shù)依賴(包含冗余)
- X→Y,且Y∈X
-
完全函數(shù)依賴和部分函數(shù)依賴
寫函數(shù)依賴時雅潭,完全函數(shù)依賴和部分函數(shù)依賴的寫法中揭厚,P和F是寫在箭頭的正上方的,由于Markdown不能很好的展現(xiàn)扶供,就標在了箭頭的右上角
所以用下面的表示法:- →F :完全依賴
- →P :部分依賴
- 完全函數(shù)依賴
- 在模式R(U)中X→Y筛圆,但是對于任意X的真子集X’, 都沒有X‘→Y, 則稱Y完全函數(shù)依賴于X椿浓,記作X→FY
- X實際上就是能推出Y的最小集
- 例如:(Sno, Cno)→Grade
- 部分函數(shù)依賴
- 在模式R(U)中X→Y太援,存在某個X的真子集X’, 有X‘→Y, 則稱Y部分函數(shù)依賴于X扳碍,記作X→PY
- 例如:(Sno, Cno)→Sdept
- 而實際上:Sno→Sdept 也是可行的提岔,上面的依賴關系中,Cno是冗余的
-
傳遞函數(shù)依賴
- X→Y, Y→Z ==> X→Z
碼
-
超碼笋敞、候選碼和主碼
- 可以沿用SQL中碼的概念
- 超碼是可以唯一標識一個元組的屬性集(可以有多個)
- 候選碼是每個超碼中去除不必要屬性但是仍然能夠標識一個元素的最精簡屬性集(可以有多個)
- 主碼只有一個碱蒙,在候選碼中選一個當做主碼
-
用函數(shù)依賴來定義
- K為R< U, F >中的屬性或屬性組合,若K→U(→上面有一個F)(即U完全依賴于K)液样,則稱K為R的候選碼振亮,若候選碼多與一個,則選擇其中一個作為主碼
-
主屬性與非主屬性
- 主屬性:包含于某個候選碼的屬性
- 非主屬性:不被任何候選碼包含的屬性
范式
-
首先還是構造一個例子
R< U, F>
U = {Sno, Sdept, Sloc, Cno, Grade} (分別代表學號鞭莽、系坊秸、系所在樓、課程號澎怒、分數(shù))
F = {(Sno, Cno)→F Grade, Sno→Sdept, (Sno, Cno)→P Sdept, Sno→Sloc, (Sno, Cno)→PSloc}
主屬性:Sno, Cno
非主屬性:Sdept, Sloc, Grade
-
上面的依賴關系可以用下面的圖示表示
1.png
-
第一范式(1NF)
-
一個域是原子的(atomic)褒搔,則該域的元素被認為是不可分的單元
- 比如name屬性就可以不是原子的阶牍,name(first_name, middle_name, last_name)
一個關系模式R屬于第一范式(1NF)==>R上的所有屬性都是原子的
上述例子中的每個屬性都是原子的,所以滿足第一范式
-
-
第二范式(2NF)
-
R ∈ 1NF星瘾,并且每一個非主屬性完全依賴于碼(實際上就是在1NF的基礎上走孽,去除了非主屬性對碼的部分函數(shù)依賴)
上述例子中存在非主屬性對碼的部分函數(shù)依賴,故不滿足2NF
-
對上述例子作出如下分解
R1< {Sno, Cno, Grade}, {(Sno, Cno)→FGrade} >
-
R2< {Sno, Sdept, Sloc}, {Sno→Sdept, Sdept→Sloc}>
- ps:其中R2隱含了Sno→Sloc (由之后即將學習的AmStrong公理可以推算出來)
-
上面的依賴關系可以用下面的圖示表示
2.png
經(jīng)過上面的分解之后琳状,每一個非主屬性都完全依賴于碼了磕瓷,所以分解之后的模式滿足2NF
-
-
第三范式(3NF)
-
R∈2NF, 并且不存在非主屬性對碼的傳遞依賴(實際上就是在2NF的基礎上去除了非主屬性對碼的傳遞依賴)
-
上述經(jīng)過分解以后的模式中存在非主屬性對碼的傳遞依賴,故不滿足3NF
- Sno→Sdept, Sdept→Sloc ==> Sno→Sloc
-
對上面的模式進行進一步的分解
R1< {Sno, Cno, Grade}, {(Sno, Cno)→FGrade} >
R2< {Sno, Sdept}, {Sno→Sdept} >
R3< {Sdept, Sloc}, {Sdept→Sloc} >
-
上面的依賴關系可以用下面的圖示表示
3.png
- 經(jīng)過上面的進一步分解之后念逞,就不存在非主屬性對碼的傳遞依賴了困食,故進一步分解之后的模式滿足3NF
-
2NF和3NF中的約束都是針對于非主屬性的。在日常開發(fā)的時候只要ER圖設計好翎承,一般都是滿足到3NF的硕盹,3NF也是可以保證無損分解的最高范式
-
Boyce-Codd范式(BCNF)
-
R ∈ 3NF, 并且不存在主屬性間的部分函數(shù)依賴和傳遞函數(shù)依賴 (實際上就是在3NF的基礎上叨咖,去除了主屬性的部分函數(shù)依賴和傳遞函數(shù)依賴)
-
舉個栗子
R< U, F >
U = {S, T, J}
F = { (S, J)→T, (S, T)→J, T→J }
-
從上面的函數(shù)依賴易判斷出:S瘩例、T、J都是主屬性
因為{S, J}甸各, {S, T} 都是候選碼
因為不存在非主屬性垛贤,所以該模式已經(jīng)滿足到3NF
-
上面模式的依賴可以用下面的圖示表示
4.png
上面的栗子中的模式主屬性中存在部分函數(shù)依賴,所以不滿足BCNF
-
作出如下分解
R1< {S, T, J}, { (S, J)→T, (S, T)→J } >
R2< {T, J}, { T→J } >
-
上面的依賴關系可以用下圖表示
5.png
經(jīng)過分解之后的模式就不存在主屬性間的部分函數(shù)依賴和傳遞函數(shù)依賴趣倾, 故滿足BCNF
當我們分解不屬于BCNF的模式的時候南吮,產(chǎn)生的模式中可能有一個或多個不屬于BCNF。在這種情況中誊酌,需要進一步分解,其最終結果是一個BCNF的模式集合
-
更高的范式還有第四范式和第五范式露乏,但是應用較少碧浊,且考綱不要求,這里就不再贅述了