資料庫三大正規化解析
第一正規化(1NF)
(必須有主鍵,列不可分)
資料庫表中的任何欄位都是單一屬性的,不可再分
create table aa(id int,NameAge varchar(100)) insert aa values(1,''無限-女 '') 沒有達到第一正規化 create table aa(id int,name varcahr(10),age char(2)) insert aa values(1,''無限'',''女 '') 達到第一正規化
第二正規化(2NF)
資料庫表中非關鍵欄位對任一候選關鍵欄位的 都 不存在部分函式依賴
(當一個表是複合主鍵時,非主鍵的欄位不依賴於部分主鍵(即必須依賴於全部的主鍵欄位))
create table sci(
sno int(32),cno int(32),grade int(32),credit int(32),
primary key sno,cno
)
課程(cno)1---1學分(credit)
學生(sno)n---n課程(cno)
學生+課程--->分數(grade)
sci
sno cno grade credit
1 1 60 80
2 1 90 80
3 1 70 80
. . . .
. . . .
. . . .
如此以來,學分被大量重複儲存,資料冗餘
如要某課程學分,則要大量重複操作
如要加新課程,由於sno和cno共同做為主鍵,則在加入新課程時,必須有人選該課
如某學生某課程結業,則該學生其它課程資訊也同時被刪除了
總之
這種設計不太好吧,非關鍵字屬性credit僅函式依賴於cno,也就是credit部分依賴組合關鍵字(sno,cno)而不是完全依賴
解決
分成兩個關係模式 sc1(sno,cno,grade),c2(cno,credit)。新關係包括兩個關係模式,它們之間通過sc1中的外關鍵字cno相聯絡,需要時再進行自然聯接,恢復了原來的關係
第三正規化(3NF)
關係模式R(U,F)中的所有非主屬性對任何候選關鍵字都不存在傳遞依賴
例----S1(SNO,SNAME,DNO, DNAME, LOCATION)
學號 姓名 所在系 系名稱 系地址 關鍵字SNO決定各個屬性。由於是單個關鍵字,沒有部分依賴的問題,肯定是2NF。但這關係肯定有大量的冗餘,有關學生所在的幾個屬性DNO,DNAME,LOCATION將重複儲存,插入,刪除和修改時也將產生類似以上例的情況。 原因:關係中存在傳遞依賴造成的。即SNO 1->1 DNO。 而DNO 1->n SNO卻不存在, 而DNO -> LOCATION存在, 因此關鍵遼 SNO 對 LOCATION 函式決定是通過傳遞依賴 SNO -> LOCATION 實現的。也就是說,SNO不直接決定非主屬性LOCATION。 解決目地:每個關係模式中不能留有傳遞依賴。 解決方法:分為兩個關係 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION) 注意:關係S中不能沒有外關鍵字DNO。否則兩個關係之間失去聯絡
鮑依斯-科得正規化(BCNF)
在3NF的基礎上,庫表中任何欄位對任一候選關鍵欄位的傳遞函式依賴都不存在
倉庫管理關係表為StorehouseManage(倉庫ID, 儲存物品ID, 管理員ID, 數量),且管理員1---1倉庫;倉庫1---n物品。這個資料庫表中存在如下決定關係: (倉庫ID, 儲存物品ID) →(管理員ID, 數量) (管理員ID, 儲存物品ID) → (倉庫ID, 數量) 所以,(倉庫ID, 儲存物品ID)和(管理員ID, 儲存物品ID)都是StorehouseManage的候選關鍵字,表中的唯一非關鍵欄位為數量,它是符合第三正規化的。但是,由於存在如下決定關係: (倉庫ID) → (管理員ID) (管理員ID) → (倉庫ID) 即存在關鍵欄位決定關鍵欄位的情況,所以其不符合BCNF正規化
解決:
把倉庫管理關係表分解為二個關係表: 倉庫管理:StorehouseManage(倉庫ID, 管理員ID) 倉庫:Storehouse(倉庫ID, 儲存物品ID, 數量)