一、什么是范式
為了建立冗余較小、結構合理的數據庫,設計數據庫時必須遵循一定的規則。在關系型數據庫中這種規則就稱為范式。范式是符合某一種設計要求的總結。要想設計一個結構合理的關系型數據庫,必須滿足一定的范式。
二、第一范式
2-1、要求
確保每列的原子性,每個列都不可以再拆分
2-2、錯誤設計
+----+----------+--------+------------------+----------+------+---------------------------------------+
| id | username | gender | email | nickname | age | region |
+----+----------+--------+------------------+----------+------+---------------------------------------+
| 1 | admin | 男 | admin@qq.com | 管理員 | 25 | 廣東省、深圳市、龍崗區、龍崗大道127號 |
| 2 | zhangsan | 男 | zhangsan@126.com | 張三 | 24 | 廣東省、廣州區、天河區、珠江大道29號 |
+----+----------+--------+------------------+----------+------+---------------------------------------+
分析:上述表很明顯就不符合數據庫第一范式的表設計,為何不符合?region列不具有原子性。因為還可以拆分成省份、城市、區域、詳細地址字段。
2-3、正確設計
+----+----------+--------+----------+------+----------+--------+--------+---------------+
| id | username | gender | nickname | age | province | city | region | adress |
+----+----------+--------+----------+------+----------+--------+--------+---------------+
| 1 | admin | 男 | 管理員 | 25 | 廣東省 | 深圳市 | 龍崗區 | 龍崗大道127號 |
| 2 | zhangsan | 男 | 張三 | 24 | 廣東省 | 廣州市 | 天河區 | 珠江大道29號 |
+----+----------+--------+----------+------+----------+--------+--------+---------------+
三、第二范式
3-1、要求
在第一范式的基礎上,非主鍵列完全依賴於主鍵,而不能是依賴於主鍵的一部分
3-2、錯誤設計
+-----------+----------+------------+------+--------+----------+-------------+
| orders_id | goods_id | goods_name | nuit | prices | username | phone |
+-----------+----------+------------+------+--------+----------+-------------+
| 0001 | 1 | iphone13 | 台 | 9800 | 大當家 | 0755-864510 |
| 0001 | 2 | 智能掃把 | 把 | 150 | 大當家 | 0755-864510 |
| 0002 | 3 | 玩具車 | 輛 | 450 | 王二狗 | 0755-816540 |
+-----------+----------+------------+------+--------+----------+-------------+
分析:上述表很明顯不符合第二范式,order_id 和 good_id 作為聯合主鍵。但 good_name、number、unit、price 只和 good_id 有關,很明顯和 order_id 主鍵無關,除此之外,上述表里做了兩件事(訂單信息、商品信息),第二范式的目的在於保證一張表只做一件事情,很明顯違反第二范式。
3-3、正確設計
+-----------+----------+-------------+
| orders_id | username | phone |
+-----------+----------+-------------+
| 0001 | 大當家 | 0755-864510 |
| 0002 | 王二狗 | 0755-816540 |
+-----------+----------+-------------+
+----------+------------+------+--------+
| goods_id | goods_name | nuit | prices |
+----------+------------+------+--------+
| 1 | iphone13 | 台 | 9800 |
| 2 | 智能掃把 | 把 | 150 |
| 3 | 玩具車 | 輛 | 450 |
+----------+------------+------+--------+
+----------+----------+
| order_id | goods_id |
+----------+----------+
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
+----------+----------+
四、第三范式
4-1、要求
在第二范式的基礎上,非主鍵列只依賴於主鍵,不依賴於其他非主鍵
4-2、錯誤設計
+----------+--------------+----------+------+--------+
| goods_id | goods_name | category | nuit | prices |
+----------+--------------+----------+------+--------+
| 1 | iphone13 | 3C數碼 | 台 | 9800 |
| 2 | 智能掃把 | 智能家居 | 把 | 150 |
| 3 | iphone12 pro | 3C數碼 | 台 | 5800 |
+----------+--------------+----------+------+--------+
4-3、正確設計
+----------+--------------+------+--------+
| goods_id | goods_name | nuit | prices |
+----------+--------------+------+--------+
| 1 | iphone13 | 台 | 9800 |
| 2 | 智能掃把 | 把 | 150 |
| 3 | iphone12 pro | 台 | 5800 |
+----------+--------------+------+--------+
+-------------+---------------+
| category_id | category_name |
+-------------+---------------+
| 1 | 3C數碼 |
| 2 | 智能家居 |
+-------------+---------------+
+-------------+----------+
| category_id | goods_id |
+-------------+----------+
| 1 | 1 |
| 2 | 2 |
| 1 | 3 |
+-------------+----------+