數(shù)據(jù)庫(kù)規(guī)范化與范式
數(shù)據(jù)庫(kù)設(shè)計(jì)中的規(guī)范化旨在減少數(shù)據(jù)冗余,增強(qiáng)數(shù)據(jù)完整性,避免數(shù)據(jù)異常(如插入、更新、刪除異常)。這通過(guò)將大型數(shù)據(jù)表分解成更小、更易管理的表,并定義它們之間的關(guān)系來(lái)實(shí)現(xiàn)。
不同的范式代表不同的規(guī)范化級(jí)別,每個(gè)級(jí)別都建立在前一個(gè)級(jí)別的基礎(chǔ)上,并遵循特定的規(guī)則。以下是幾種常用的范式:
第一范式 (1NF)
1NF 是規(guī)范化的基礎(chǔ)級(jí)別,其核心目標(biāo)是消除重復(fù)數(shù)據(jù),確保表中每個(gè)字段都包含單個(gè)、不可分割的值(原子值)。
- 1NF規(guī)則:
- 每個(gè)字段必須包含原子值,即不可再細(xì)分的值。
- 每行數(shù)據(jù)必須唯一。
- 每列數(shù)據(jù)類型一致。
- 不允許出現(xiàn)重復(fù)的列或字段內(nèi)包含多個(gè)值。
1NF示例:
非1NF:
訂單ID | 商品 | 數(shù)量 |
---|---|---|
1 | 蘋果,香蕉 | 2,3 |
2 | 橙子 | 5 |
—
轉(zhuǎn)換為1NF:
訂單ID | 商品 | 數(shù)量 |
---|---|---|
1 | 蘋果 | 2 |
1 | 香蕉 | 3 |
2 | 橙子 | 5 |
—
第二范式 (2NF)
2NF 在1NF的基礎(chǔ)上,進(jìn)一步消除了部分函數(shù)依賴。部分函數(shù)依賴是指非主鍵屬性依賴于主鍵的一部分(對(duì)于復(fù)合主鍵)。要滿足2NF,必須先滿足1NF。
- 2NF規(guī)則:
- 滿足1NF。
- 每個(gè)非主鍵屬性必須完全依賴于整個(gè)主鍵。
2NF示例:
非2NF(部分函數(shù)依賴):
訂單ID | 商品 | 客戶姓名 | 價(jià)格 |
---|---|---|---|
1 | 蘋果 | John | 10 |
1 | 香蕉 | John | 5 |
2 | 橙子 | Jane | 8 |
—
轉(zhuǎn)換為2NF:
表:
- 訂單 (訂單ID, 客戶姓名)
- 訂單明細(xì) (訂單ID, 商品, 價(jià)格)
訂單表:
訂單ID | 客戶姓名 |
---|---|
1 | John |
2 | Jane |
—
訂單明細(xì)表:
訂單ID | 商品 | 價(jià)格 |
---|---|---|
1 | 蘋果 | 10 |
1 | 香蕉 | 5 |
2 | 橙子 | 8 |
—
第三范式 (3NF)
3NF 在2NF的基礎(chǔ)上,消除了傳遞函數(shù)依賴。傳遞函數(shù)依賴是指非主鍵屬性依賴于其他非主鍵屬性。要滿足3NF,必須先滿足2NF。
- 3NF規(guī)則:
- 滿足2NF。
- 任何非主鍵屬性都不應(yīng)依賴于其他非主鍵屬性。
3NF示例:
非3NF(傳遞函數(shù)依賴):
訂單ID | 商品 | 類別 | 供應(yīng)商 |
---|---|---|---|
1 | 蘋果 | 水果 | XYZ |
2 | 胡蘿卜 | 蔬菜 | ABC |
—
轉(zhuǎn)換為3NF:
表:
- 訂單 (訂單ID, 商品, 類別)
- 類別 (類別, 供應(yīng)商)
訂單表:
訂單ID | 商品 | 類別 |
---|---|---|
1 | 蘋果 | 水果 |
2 | 胡蘿卜 | 蔬菜 |
—
類別表:
類別 | 供應(yīng)商 |
---|---|
水果 | XYZ |
蔬菜 | ABC |
—
Boyce-Codd范式 (BCNF)
BCNF 比3NF更嚴(yán)格。如果每個(gè)函數(shù)依賴的左部都是候選鍵,則表滿足BCNF。
- BCNF規(guī)則:
- 滿足3NF。
- 每個(gè)決定因素都是候選鍵。
第四范式 (4NF)
4NF 解決了多值依賴問(wèn)題,即一個(gè)屬性決定另一個(gè)屬性的多個(gè)值,且這些值彼此獨(dú)立。
- 4NF規(guī)則:
- 滿足BCNF。
- 沒(méi)有多值依賴。
總結(jié)
數(shù)據(jù)庫(kù)規(guī)范化是確保數(shù)據(jù)質(zhì)量的關(guān)鍵步驟。不同的范式提供了不同級(jí)別的規(guī)范化,選擇合適的范式需要權(quán)衡數(shù)據(jù)完整性和性能需求。 雖然高范式能保證數(shù)據(jù)完整性,但在某些情況下,為了性能考慮,可能會(huì)選擇降低范式級(jí)別。