關系模型組成:關系數據庫,關系操作集合,關系完整性約束。
關系的三類完整性約束:
(1)實體完整性(必須)
若屬性A是基本關系R的主屬性,則A不能取空值。
檢查和違約處理:
1)檢查主碼值是否唯一,如果不唯一則拒絕插入或修改。
2)檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改。
(2)參照完整性(必須)
若屬性F是基本關系R的外碼,它與基本關系S的主碼K相對應,則對於R中每個元組在F上的值要么為空值,要么等於S中某個元組的主碼值。
檢查和違約處理:
| 被參照表 | 參照表 | 違約處理 |
| 可能破壞參照完整性 | 插入元組 | 拒絕 |
| 可能破壞參照完整性 | 修改外碼值 | 拒絕 |
| 刪除元組 | 可能破壞參照完整性 | 拒絕/級連刪除/設置為空值 |
| 修改主碼值 | 可能破壞參照完整性 | 拒絕/級連刪除/設置為空值 |
(3)用戶定義的完整性(可選)
比如唯一性、能否取空值等。
候選碼:設K是R<U,F>的屬性,若K->U,則K為R的候選碼。
主碼:從候選碼中選擇一個。
主屬性:包含在任何一個候選碼中的屬性。
非主屬性:不包含在任何碼中的屬性。
5NF<4NF<BCNF<3NF<2NF<1NF
第一范式(1NF):每一個分量必須是不可分的數據項。
存在問題:數據冗余太大,更新異常,插入異常,刪除異常。
違反例子:F={Sno->Sdept, Sdept->Mname, (Sno, Cno)->Grade}
分解為合格:S(Sno, Sdept, Sno->Sdept), SC(Sno, Cno, Grade, (Sno, Cno)->Grade), DEPT(Sdept, Mname, Sdept->Mname)
第二范式(2NF):若R屬於1NF,且每一個非主屬性完全函數依賴於碼,則R屬於2NF。
存在問題:插入異常,刪除異常,修改復雜。
違反例子:{(Sno, Cno)->完全函數依賴Grade), Sno->Sdept, (Sno, Cno)->部分函數依賴Sdept, Sno->Sloc, (Sno, Cno)->部分函數依賴Sloc}。
分解為合格:SC(Sno, Cno, Grade, (Sno, Cno)->Grade), SL(Sno, Sdept, Sloc, Sno->Sdept, Sno->Sloc, Sdept->Sloc)
第三范式(3NF):若R屬於3NF,則每一個非主屬性既不部分依賴於碼,也不傳遞依賴於碼。
違反例子:上面的SL是不屬於3NF的,因為有傳遞函數依賴。
分解為合格:SD(Sno, Sdept, Sno->Sdept), DL(Sdept, Sloc, Sdept->Sloc)。
BCNF:所有非主屬性對每一個碼都是完全函數依賴,所有主屬性對每一個不包含它的碼,也是完全函數依賴,沒有任何屬性完全函數依賴於非碼的任何一組屬性。
若R屬於BCNF,則一定屬於3NF;反過來不成立。
第四范式(4NF):屬性之間不允許有非平凡(若多值依賴X->->Y中,Z為空,則稱X->->Y為平凡的多值依賴)且非函數依賴(X->Y)的多值依賴。
若R屬於4NF,則一定屬於BCNF。

