前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >数据库设计的三范式与反范式:优化数据结构,提升数据库性能

数据库设计的三范式与反范式:优化数据结构,提升数据库性能

原创
作者头像
Lion Long
发布2024-11-22 22:12:54
发布2024-11-22 22:12:54
2060
举报
文章被收录于专栏:数据库系列数据库系列

一、范式的概念

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

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

二、三范式

(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. 反范式是经常使用的设计。三范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦。但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低。因此出于性能考虑,可能需要进行反范式设计。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、范式的概念
  • 二、三范式
    • 2.1、范式一
    • 2.2、范式二
    • 2.3、范式三
  • 三、反范式
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档