數(shù)據(jù)庫三大范式
第一范式(1NF):列不可拆分
假設我們有一個學生信息表,用來記錄學生的姓名和地址:
| 學生ID | 姓名 | 地址 |
|---|---|---|
| 1 | 張三 | xx省xx市xx區(qū) |
這個表違反了第一范式,因為地址不符合不可拆分要求。為了滿足第一范式,需要把地址拆分成省、市、區(qū)。
第二范式(2NF):不能只依賴主鍵的一部分
現(xiàn)在,如果我們想要記錄學生的課程成績,表結構可能會變成這樣:
| 學生ID | 姓名 | 課程 | 成績 |
|---|---|---|---|
| 1 | 張三 | 數(shù)學 | 90 |
| 1 | 張三 | 英語 | 85 |
| 2 | 李四 | 數(shù)學 | 95 |
| 2 | 李四 | 英語 | 80 |
在這個例子中,學生ID和課程一起構成了聯(lián)合主鍵(因為一個學生可以有多個課程成績)。但是,姓名只依賴于學生ID,并不依賴于課程。這就違反了第二范式,因為存在非主鍵字段(姓名)只依賴于主鍵的一部分(學生ID)。為了滿足第二范式,我們需要將這個表拆分為兩個表:
學生表:
| 學生ID | 姓名 |
|---|---|
| 1 | 張三 |
| 2 | 李四 |
成績表:
| 學生ID | 課程 | 成績 |
|---|---|---|
| 1 | 數(shù)學 | 90 |
| 1 | 英語 | 85 |
| 2 | 數(shù)學 | 95 |
| 2 | 英語 | 80 |
這樣,每個表都滿足了第二范式。
第三范式(3NF):禁止間接依賴
假設我們有一個訂單表,用來記錄訂單信息和客戶信息:
| 訂單ID | 客戶ID | 客戶姓名 | 客戶電話 | 商品 | 價格 |
|---|---|---|---|---|---|
| 1001 | 001 | 張三 | 13800138000 | 商品A | 100 |
| 1002 | 002 | 李四 | 13900139000 | 商品B | 200 |
在這個例子中,訂單ID是主鍵,但是客戶電話依賴于客戶ID,而不是直接依賴于訂單ID。這違反了第三范式,因為存在對非主鍵字段的傳遞依賴。為了滿足第三范式,我們需要進一步拆分這個表:
訂單表:
| 訂單ID | 客戶ID | 商品 | 價格 |
|---|---|---|---|
| 1001 | 001 | 商品A | 100 |
| 1002 | 002 | 商品B | 200 |
客戶表:
| 客戶ID | 客戶姓名 | 客戶電話 |
|---|---|---|
| 001 | 張三 | 13800138000 |
| 002 | 李四 | 13900139000 |
通過這種方式,我們消除了表中的傳遞依賴,滿足了第三范式。
浙公網(wǎng)安備 33010602011771號