数据库设计的三范式与反范式:优化数据结构,提升数据库性能的秘籍
三范式设计详解。范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦。但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低。因此处于性能考虑,可能需要进行反范式设计。
一、范式的概念
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
三范式和反范式是空间和时间的关系。三范式是为了降低空间;反范式是通过增加空间来提升运行效率。
二、三范式
(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 |
三、反范式
反范式是经常使用的设计。比如用户表采用的就是反范式,因为如果用户表不采用反范式设计,将会产生很多的关联关系表,这就会涉及到联表查询,非常影响效率,特别对登录来说,是不可容忍的。
因此,反范式允许冗余存储,为了提升查询效率。
总结
- 范式二中,对于联合索引,主键不能依赖一部分,而要依赖整体;出现重复的要拆分。
- 反范式是经常使用的设计。三范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦。但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低。因此处于性能考虑,可能需要进行反范式设计。

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