鍵總結
- 超鍵:關係的唯一性約束。可以有冗餘,例如(studentnr)是超鍵,(studentnr,name)也是超鍵。
- 鍵(候選鍵):最小超鍵,其他屬性都完全函數依賴該屬性。不含有多餘屬性。
- 主鍵:用於標識關係中元組的候選鍵,一般在鍵中選一個作爲主鍵。
候選鍵由主鍵和備用鍵組成。
超鍵 >= 候選鍵 >= 主鍵
範式總結
這篇文章講得非常細緻(https://www.cnblogs.com/langdashu/p/5924082.html)
第一範式(1NF):
每個屬性類型都是原子單值,則關係爲第一範式。
第二範式(2NF):
在上一條基礎上排除部分函數依賴,即每個非主屬性類型完全依賴於關係的鍵,則關係爲第二範式。
例:R1(SSN,Pnumber,Pname,hours)
函數依賴:Pnumber->Pname,(SSN,Pnumber)->hours
鍵:(SSN,Pnumber)
主屬性:SSN,Pnumber
非主屬性:Pname,hours
Pname對於鍵(SSN,Pnumber)是部分依賴,所以不是第二範式,改爲:
R11(SSN,Pnumber,hours)
R12(SSN,Pname)
第三範式(3NF):
在上一條基礎上排除傳遞函數依賴,即每個非主屬性類型只依賴鍵,不依賴其他非主屬性,則關係爲第三範式。
例:R1(SSN,ename,dnumber,dname,dmgrssn)
一個員工在一個部門,一個部門有多個員工,一個部門有一個經理。
函數依賴:SSN->ename,SSN->dnumber,dnumber->dname,dnumber->dmgrssn
鍵:SSN,dnumber
主屬性:SSN,dnumber
非主屬性:ename,dname,dmgrssn
因爲SSN可推出dnumber,dnumber可推出dname和dmgrssn,存在傳遞函數依賴,不是第三範式,可改爲:
R11(SSN,ename,dnumber)
R12(dnumber,dname,dmgress)
巴斯範式(BCNF):
在上一條基礎上每個非平凡函數依賴X->Y(X不包含Y),X是超鍵(即X是候選鍵或其一個超集),則關係爲巴斯範式。通俗來說就是消除主屬性對於鍵的部分與傳遞函數依賴。
例1:R1(SUPNR,SUPNAME,PRODNR,QUANTITY)
一個供應商可以供應多個產品,一個產品能由多個供應商供應且每個供應商有唯一的命名
函數依賴:supnr->supname,supname->supnr,(supnr,prodnr)->quantity
鍵:(supnr,prodnr),(supname,prodnr)
主屬性:supnr,supname,prodnr
非主屬性:quantity
兩種判斷方法:
1.存在主屬性supname對於鍵(supnr,prodnr)的部分函數依賴,所以不是BCNF
2.supnr->supname,supname->supnr左邊不是鍵,所以不是BCNF
改爲BCNF:
R11(SUPNR,PRODNR,QUANTITY)
R12(SUPNR,SUPNAME)
例2:STC(S,T,C)中,S表示學生,T表示教師,C表示課程。假設每個教師只教一門課,每門課有若干老師,某一學生選一門課就對應一個老師。
函數依賴:(S,C)->T,(S,T)-> C,T-> C
鍵:(S,C),(S,T)
主屬性:S,C,T
兩種判斷方法:
1.主屬性是:S,C,T,因爲T就能推出C,還有(S,T)->C,有主屬性對於鍵的部分函數依賴 ,所以不是BCNF。
2.或者(S,C)和(S,T)都是鍵,但T不是,所以STC屬於第三範式,不屬於BCNF。
第四範式(4NF):
在上一條基礎上若存在平凡多值依賴(當每個X值精確地確定一組Y值時,存在從X到Y,X->->Y的多值依賴性,與其它屬性類型無關),對於它的每個非平凡的多值依賴關係X->->Y,X是超鍵,則關係爲第四範式。簡單來說就是消除關係中的多對多關係。
例:R(course,instructor,textbook)
假如一個課程能由不同的老師授課,且有多種教材。該關係不是第四範式,改爲:
R11(course,textbook)
R12(course,instructor)
由上到下越來越嚴格,下面的一定屬於上面,反之不一定成立