版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qq_32828933/article/details/82828783
第一范式(1NF):
数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。
Table: t_user_info
— | — | — | — | — | — |
---|---|---|---|---|---|
id | info(address + mobile) | — | — | — | |
主键 | 四川省成都市高新南区天府大道北段1700号(13312341234) | ||||
id | address | mobile | |||
主键 | 四川省成都市高新南区天府大道北段1700号 | 13312341234 | |||
id | province | city | district | address | mobile |
主键 | 四川省 | 成都市 | 高新南区 | 天府大道北段1700号 | 13312341234 |
第二范式(2NF):
满足1NF后要求表中的所有列,都必需依赖于主键,而不能有 任何一列与主键没有关系(一个表只描述一件事情)。
例如:订单表只能描述订单相关的信息,所以所有的字段都必须与订单ID相关。
产品表只能描述产品相关的信息,所以所有的字段都必须与产品ID相关。
因此在同一张表中不能同时出现订单信息与产品信息。
Table:t_order (old)
— | — | — | — | — |
---|---|---|---|---|
oid | order_sn | goods_name | goods_price | … |
主键 | cd201801010001 | 书籍 | 100 | … |
Table:t_order (new)
— | — | — | — | — |
---|---|---|---|---|
oid | order_sn | goods_id | goods_num | … |
主键 | cd201801010001 | 书籍 | 1 | … |
Table:t_goods
— | — | — | — | — |
---|---|---|---|---|
goods_id | goods_name | goods_price | … | |
主键 | 书籍 | 100 | … |
第三范式(3NF)
满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)
例如:一个用户可以对应多个角色,一个角色也可以对应多个用户。则可以按如下方式建立数据表关系,使其满足第三范式。
Table:t_user 用户表
— | — | — | — |
---|---|---|---|
uid | username | password | … |
主键 | name | pass | … |
Table: t_role 角色表
— | — | — | — |
---|---|---|---|
role_id | name | … | |
主键 | name | … |
Table: t_user_role用户-角色中间表
— | — | — |
---|---|---|
id | user_id | role_id |
主键 | 1 | 1 |
像这样,通过第三张表(中间表)来建立用户表和角色表之间的关系,同时又符合范式化的原则,就可以称为第三范式。
4. 反范式化
反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。
Table: t_user_role用户-角色中间表,id,user_id,role_id,role_name
— | — | — | — |
---|---|---|---|
id | user_id | role_id | role_name |
主键 | 1 | 1 | 超级管理员 |
例如:在上例中的user_role用户-角色中间表增加字段role_name。
反范式化可以减少关联查询时,join表的次数。