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

上一篇:拼多多商品搜索接口


下一篇:Python3学习笔记6:字符串操作、dict字典、文件file的合理使用----购物车优化之用户端(消费者端)