MySQL数据库三大范式和反范式

版权声明:本文为博主原创文章,未经博主允许不得转载 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 角色表

扫描二维码关注公众号,回复: 4391244 查看本文章
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表的次数。

猜你喜欢

转载自blog.csdn.net/qq_32828933/article/details/82828783