1.7 關係資料庫設計理論
阿新 • • 發佈:2018-12-15
1.7.1 函式依賴
記 A->B 表示 A 函式決定 B,也可以說 B 函式依賴於 A。
如果 {A1,A2,... ,An} 是關係的一個或多個屬性的集合,該集合函式決定了關係的其它所有屬性並且是最小的,那麼該集合就稱為鍵碼。
對於 A->B,如果能找到 A 的真子集 A',使得 A'-> B,那麼 A->B 就是部分函式依賴,否則就是完全函式依賴。
對於 A->B,B->C,則 A->C 是一個傳遞函式依賴。
1.7.2 異常
以下的學生課程關係的函式依賴為 Sno, Cname -> Sname, Sdept, Mname, Grade,鍵碼為 {Sno, Cname}。也就是說,確定學生和課程之後,就能確定其它資訊。
Sno | Sname | Sdept | Mname | Cname | Grade |
---|---|---|---|---|---|
1 | 學生-1 | 學院-1 | 院長-1 | 課程-1 | 90 |
2 | 學生-2 | 學院-2 | 院長-2 | 課程-2 | 80 |
2 | 學生-2 | 學院-2 | 院長-2 | 課程-1 | 100 |
3 | 學生-3 | 學院-2 | 院長-2 | 課程-2 | 95 |
不符合正規化的關係,會產生很多異常,主要有以下四種異常:
- 冗餘資料:例如
學生-2
出現了兩次。 - 修改異常:修改了一個記錄中的資訊,但是另一個記錄中相同的資訊卻沒有被修改。
- 刪除異常:刪除一個資訊,那麼也會丟失其它資訊。例如刪除了
課程-1
需要刪除第一行和第三行,那麼學生-1
的資訊就會丟失。 - 插入異常:例如想要插入一個學生的資訊,如果這個學生還沒選課,那麼就無法插入。
1.7.3 正規化
正規化理論是為了解決以上提到四種異常。
高級別正規化的依賴於低級別的正規化,1NF 是最低級別的正規化。
1. 第一正規化 (1NF)
屬性不可分。
2. 第二正規化 (2NF)
每個非主屬性完全函式依賴於鍵碼。
可以通過分解來滿足。
分解前
Sno | Sname | Sdept | Mname | Cname | Grade |
---|---|---|---|---|---|
1 | 學生-1 | 學院-1 | 院長-1 | 課程-1 | 90 |
2 | 學生-2 | 學院-2 | 院長-2 | 課程-2 | 80 |
2 | 學生-2 | 學院-2 | 院長-2 | 課程-1 | 100 |
3 | 學生-3 | 學院-2 | 院長-2 | 課程-2 | 95 |
以上學生課程關係中,{Sno, Cname} 為鍵碼,有如下函式依賴:
- Sno -> Sname, Sdept
- Sdept -> Mname
- Sno, Cname-> Grade
Grade 完全函式依賴於鍵碼,它沒有任何冗餘資料,每個學生的每門課都有特定的成績。
Sname, Sdept 和 Mname 都部分依賴於鍵碼,當一個學生選修了多門課時,這些資料就會出現多次,造成大量冗餘資料。
分解後
關係-1
Sno | Sname | Sdept | Mname |
---|---|---|---|
1 | 學生-1 | 學院-1 | 院長-1 |
2 | 學生-2 | 學院-2 | 院長-2 |
3 | 學生-3 | 學院-2 | 院長-2 |
有以下函式依賴:
- Sno -> Sname, Sdept
- Sdept -> Mname
關係-2
Sno | Cname | Grade |
---|---|---|
1 | 課程-1 | 90 |
2 | 課程-2 | 80 |
2 | 課程-1 | 100 |
3 | 課程-2 | 95 |
有以下函式依賴:
- Sno, Cname -> Grade
3. 第三正規化 (3NF)
非主屬性不傳遞函式依賴於鍵碼。
上面的 關係-1 中存在以下傳遞函式依賴:
- Sno -> Sdept -> Mname
可以進行以下分解:
關係-11
Sno | Sname | Sdept |
---|---|---|
1 | 學生-1 | 學院-1 |
2 | 學生-2 | 學院-2 |
3 | 學生-3 | 學院-2 |
關係-12
Sdept | Mname |
---|---|
學院-1 | 院長-1 |
學院-2 | 院長-2 |