数据库范式解析(1NF 2NF 3NF BCNF)
數(shù)據(jù)庫(kù)設(shè)計(jì)范式是關(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì)準(zhǔn)則。其目的在于通過(guò)規(guī)劃設(shè)計(jì)使得數(shù)據(jù)庫(kù)結(jié)構(gòu)合理,盡量減少數(shù)據(jù)冗余,消除存儲(chǔ)異常,方便數(shù)據(jù)的插入、更新和刪除操作。目前常用范式包括1NF(第一范式)、2NF(第二范式)、3NF(第三范式)和BCNF(鮑依斯-科得范式)。
1NF 第一范式
如果一個(gè)關(guān)系模式R的所有屬性都是不可分的基本數(shù)據(jù)項(xiàng),則R∈1NF。
也可表述為:數(shù)據(jù)庫(kù)表中的字段都是單一屬性的,不可再分。
比如“地址”屬性應(yīng)該拆分為“城市”、“區(qū)縣”、“具體地址”便于使用。
2NF 第二范式
若關(guān)系模式R∈1NF,并且每一個(gè)非主屬性都完全函數(shù)依賴于R的碼(多個(gè)主屬性字段的組合),則R∈2NF
也可表述為:數(shù)據(jù)庫(kù)表中不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的部分函數(shù)依賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。
比如選課關(guān)系表(學(xué)號(hào), 姓名, 年齡, 課程名稱, 成績(jī), 學(xué)分),碼為組合關(guān)鍵字(學(xué)號(hào), 課程名稱),因?yàn)榇嬖谌缦聸Q定關(guān)系:
這個(gè)數(shù)據(jù)庫(kù)表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:(課程名稱) → (學(xué)分) 和 (學(xué)號(hào)) → (姓名, 年齡),即存在碼中的部分字段決定非關(guān)鍵字的情況,所以不符合2NF。應(yīng)修改為一以下三個(gè)表:
學(xué)生:Student(學(xué)號(hào), 姓名, 年齡);
課程:Course(課程名稱, 學(xué)分);
選課關(guān)系:SelectCourse(學(xué)號(hào), 課程名稱, 成績(jī))。
3NF 第三范式
關(guān)系模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z(Z ? Y), 使得X→Y,Y→Z,成立,則稱R<U,F> ∈ 3NF。
也可表述為:在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在"A → B → C"的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫(kù)表應(yīng)該不存在如下依賴關(guān)系:關(guān)鍵字段 → 非關(guān)鍵字段x → 非關(guān)鍵字段y
比如:學(xué)生關(guān)系表為Student(學(xué)號(hào), 姓名, 年齡, 所在學(xué)院, 學(xué)院地點(diǎn), 學(xué)院電話)關(guān)鍵字段為“學(xué)號(hào)”,存在以下決定關(guān)系(學(xué)號(hào)) → (姓名, 年齡, 所在學(xué)院, 學(xué)院地點(diǎn), 學(xué)院電話),符合2NF;但存在(學(xué)號(hào)) → (所在學(xué)院) → (學(xué)院地點(diǎn), 學(xué)院電話),不符合3NF。應(yīng)改為:
學(xué)生:(學(xué)號(hào), 姓名, 年齡, 所在學(xué)院);
學(xué)院:(學(xué)院, 地點(diǎn), 電話)。
BCNF 鮑依斯-科得范式
設(shè)關(guān)系模式R<U,F>∈1NF,如果對(duì)于R的每個(gè)函數(shù)依賴X→Y,若Y不屬于X,則X必含有候選碼,那么R∈BCNF。
也可表述為:在第三范式的基礎(chǔ)上,數(shù)據(jù)庫(kù)表中如果不存在任何字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。
比如:倉(cāng)庫(kù)管理關(guān)系表為(倉(cāng)庫(kù)ID, 存儲(chǔ)物品ID, 管理員ID, 數(shù)量),且有一個(gè)管理員只在一個(gè)倉(cāng)庫(kù)工作;一個(gè)倉(cāng)庫(kù)可以存儲(chǔ)多種物品。這個(gè)數(shù)據(jù)庫(kù)表中存在如下決定關(guān)系:
(倉(cāng)庫(kù)ID, 存儲(chǔ)物品ID) →(管理員ID, 數(shù)量)
(管理員ID, 存儲(chǔ)物品ID) → (倉(cāng)庫(kù)ID, 數(shù)量)
所以,(倉(cāng)庫(kù)ID, 存儲(chǔ)物品ID)和(管理員ID, 存儲(chǔ)物品ID)都是表的候選關(guān)鍵字,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系:
(倉(cāng)庫(kù)ID) → (管理員ID)
(管理員ID) → (倉(cāng)庫(kù)ID)
即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以其不符合BCNF范式。數(shù)據(jù)表應(yīng)修改為:
倉(cāng)庫(kù)管理:(倉(cāng)庫(kù)ID, 管理員ID);
倉(cāng)庫(kù):(倉(cāng)庫(kù)ID, 存儲(chǔ)物品ID, 數(shù)量)。
四種范氏之間的關(guān)系
每一個(gè)范氏都是進(jìn)一步約束的關(guān)系,如下圖:
四種范式之間的關(guān)系
參考:
總結(jié)
以上是生活随笔為你收集整理的数据库范式解析(1NF 2NF 3NF BCNF)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库范式1NF 2NF 3NF BCN
- 下一篇: 《卓有成效的程序员》读书笔记