范式
- 第一范式(1NF):要求屬性值不可再分,即屬性項不能由屬性組合組成
- 第二范式(2NF):引入主鍵,如果關系模式R為第一范式,並且R中每一個非主屬性完全函數依賴於R的某個候選鍵,則R為第二范式模式。(主屬性與非主屬性:如果A是關系模式R的候選碼的一個屬性,則稱A是R的主屬性,否則稱A是R的非主屬性)(函數Y=f(X),則X決定Y,Y依賴於X,記作X->Y)
- 第三范式(3NF):如果關系模式R為第二范式,並且每個非主屬性都不傳遞依賴於R的候選鍵,則R為第三范式模式。部分依賴屬於傳遞依賴,原因是候選碼 ->候選碼真子集->非主屬性,如例1中,(學生號,課程號)->學生號->姓名。所以3NF比2NF規定更多,更高要求。
- BC范式(BCNF):如果關系模式R為第一范式,並且每個非主屬性都不傳遞依賴於R的候選鍵,則R為BCNF模式。
例1:
判斷2NF。
FD={學生號->姓名,學生號->性別,學生號->專業,課程號->課程名,課程號->課程學分,(學生號,課程號)->成績}
第一步,尋找候選碼——1。那些沒有決定因素的屬性(所以,學生號和課程號必包含在候選碼中);2。候選碼能夠決定其他所有屬性(所以,{學生號,課程號}是一個候選碼,且是唯一的候選碼。
第二部,尋找部分依賴。姓名、性別、專業部分依賴於學生號,課程名、課程學分部分依賴於課程號,所以存在部分依賴。不是2NF。
*有一種情況必定是2NF——單屬性候選碼。
2NF消除方法:對每一個部分依賴建一張表。
S=(
學生號,姓名,性別,專業)
C=(
課程號,課程名,課程學分)
SC=(
學生號,
課程號,成績)
例2:判斷3NF。
FD={學號->姓名,學號->性別,學號->籍貫,學號->系號,系號->系名,系號->系電話,學號->宿舍號,宿舍號->宿舍電話}
因為候選碼學號是單屬性,必定不存在部分依賴,所以是2NF。但學號對系號所推出的系名,系電話,以及宿舍號所推出的宿舍電話都是傳遞依賴。所以不是3NF。
3NF消除方法:主碼不動,把有直接函數依賴關系的非主碼(系號,宿舍號)分解出去。
Normalization and Denormalization (標准化和非標准化)
這是兩種設計數據庫表的模式,Normalization對應的數據屬於干凈非冗余型,而Denormalization則允許數據冗余或者同樣的數據存儲於多處。下面主要列出了Normalization的優點和缺點,
同樣的Denormalization則適合於read-heavy。
關於屬性
- 超鍵(super key):在關系中能唯一標識元組的屬性集稱為關系模式的超鍵。例如,在一個學生的表中,假設有“學號”、“姓名”、“相關信息”、“生日”等字段, 其中學號是唯一的,那么(學號)是一個超鍵,同時(學號,姓名,生日)的組合也是唯一的,所以也可以為一個超鍵。
- 候選鍵(candidate key):不含有多余屬性的超鍵稱為候選鍵
- 主鍵(primary key):用戶選作元組標識的一個候選鍵稱為主鍵
