MySQL 三大范式


一、什么是范式

為了建立冗余較小、結構合理的數據庫,設計數據庫時必須遵循一定的規則。在關系型數據庫中這種規則就稱為范式。范式是符合某一種設計要求的總結。要想設計一個結構合理的關系型數據庫,必須滿足一定的范式。


二、第一范式

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 |
+-------------+----------+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM