一、范式的概念

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

三范式和反范式是空间和时间的关系。三范式是为了降低空间;反范式是通过增加空间来提升运行效率。

二、三范式

(1)目的:减少空间占用。
(2)内容:列不可分、依赖主键(联合索引)、在依赖主键(联合索引)的基础上直接依赖。

2.1、范式一

确保每列保持原子性;数据库表中的所有字段都是不可分解的原子值。
例如:某表中有一个地址字段,如果经常需要访问地址字段中的城市属性,则需要将该字段拆分为多个字段,省份、城市、详细地址等。

姓名 地址
fly1 广西壮族自治区南宁市越秀区繁华东路66号8栋8楼8号
fly2 广东省深圳市福田区繁华东路66号8栋8楼8号
fly3 湖南省长沙市岳麓区繁华东路66号8栋8楼8号

可以才分为:

姓名 省份 详细信息
fly1 广西壮族自治区 南宁市 越秀区 繁华东路 66号 8栋8楼8号
fly2 广东省 深圳市 福田区 繁华东路 66号 8栋8楼8号
fly3 湖南省 长沙市 岳麓区 繁华东路 66号 8栋8楼8号

2.2、范式二

确保表中的每列都和主键相关,而不能只与主键的某一部分相关(组合索引)。

订单编号 商品编号 商品名称 数量 单位 价格 客户 所属单位 联系方式
1 1 电脑 1 10000 fly1 FLY 13788888888
1 2 手机 2 6000 fly1 FLY 13788888888
2 3 ipad 3 3000 fly2 BAT 13799999999

因为订单编号与客户的信息相关,订单编号和商品编号一起唯一确定数量,商品编号和商品信息相关;所以可以拆分成三个表:

订单编号 客户 所属单位 联系方式
1 fly1 FLY 13788888888
2 fly2 BAT 13799999999
订单编号 商品编号 数量
1 1 1
1 2 2
2 3 3
商品编号 商品名称 单位 商品价格
1 电脑 10000
2 手机 6000
3 ipad 3000

2.3、范式三

确保每列都和主键直接相关,而不是间接相关;减少数据冗余。

例如

订单编号 订单项目 负责人 业务员 订单数量 客户编号
1 电脑 fly1 alice 10 1
2 手机 fly2 molic 20 2
3 ipad fly3 selia 30 1

可以拆分为:

订单编号 订单项目 负责人 业务员 订单数量 客户编号 客户名称 所属公司 联系方式
1 电脑 fly1 alice 10 1 vico 0voice1 13766666666
2 手机 fly2 molic 20 2 milo 0voice2 13799999999
3 ipad fly3 selia 30 1 vico 0voice1 13766666666
客户编号 客户名称 所属公司 联系方式
1 vico 0voice1 13766666666
2 milo 0voice2 13799999999

三、反范式

反范式是经常使用的设计。比如用户表采用的就是反范式,因为如果用户表不采用反范式设计,将会产生很多的关联关系表,这就会涉及到联表查询,非常影响效率,特别对登录来说,是不可容忍的。

因此,反范式允许冗余存储,为了提升查询效率。

总结

  1. 范式二中,对于联合索引,主键不能依赖一部分,而要依赖整体;出现重复的要拆分。
  2. 反范式是经常使用的设计。三范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦。但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低。因此处于性能考虑,可能需要进行反范式设计。

在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐