一、什么是范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
二、第一范式
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 |
+-------------+----------+