软件体系结构 - 关系数据库(2)反规范化

简介: 【4月更文挑战第25天】软件体系结构 - 关系数据库(2)反规范化

关系数据库反规范化(Denormalization)是数据库设计过程中的一种策略,它与规范化过程相反,是在规范化基础上有选择性地增加数据冗余,以优化特定查询的性能,尤其是提高数据检索速度。虽然规范化有助于减少数据冗余、维护数据完整性和简化数据结构,但在某些场景下,特别是对读取操作密集的应用,严格的规范化可能会导致性能瓶颈,特别是在需要执行大量表连接操作来完成查询的情况下。

反规范化的理由包括:

  1. 提高查询性能:通过在表中加入冗余数据,可以减少表间的连接操作,从而加快查询速度。这对于经常执行的复杂查询尤为重要。
  2. 简化查询逻辑:减少表连接可以使得SQL查询语句更简单,易于编写和维护。
  3. 减少磁盘I/O:通过减少访问多个表的需求,可以降低磁盘读写操作,尤其是在I/O敏感的应用场景中。

反规范化的类型:

  • 合并一对一关系的表:将两个具有一对一关系的表合并成一个表,尽管这可能增加一些冗余。
  • 添加非键列到一对多关系的“一”侧:将“多”侧表中频繁查询但非键的列复制到“一”侧表中,减少连接查询的需求。
  • 复制多对多关系中的列:在关联表中复制双方表的关键列,减少通过中间表的连接操作。


常见的反规范化技术包括:


(1)增加冗余列

增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。例如:以规范化设计的理念,学生成绩表中不需要字段“姓名”,因为“姓名”字段可以通过学号查询到,但在反规范化设计中,会将“姓名”字段加入表中。这样查询一个学生的成绩时,不需要与学生表进行连接操作,便可得到对应的“姓名”。


2)增加派生列

增加派生列指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量,从而加快查询速度。例如:订单表中,有商品号、商品单价、采购数量,我们需要订单总价时,可以通过计算得到总价,所以规范化设计的理念是无须在订单表中设计“订单总价”字段。但反规范化则不这样考虑,由于订单总价在每次查询都需要计算,这样会占用系统大量资源,所以在此表中增加派生列“订单总价”以提高查询效率。


3)重新组表

重新组表指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。


(4)分割表

有时对表做分割可以提高性能。表分割有两种方式。

水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。水平分割通常在下面的情况下使用。


情况 1:表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询效率。

情况 2:表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。

情况 3:需要把数据存放到多个介质上。


5)垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少 I/O 次数。其缺点是需要管理冗余列,查询所有数据需要连接操作。


反规范化的潜在缺点:

  • 数据一致性问题:冗余数据增加了维护数据一致性的难度,每次更新相关数据时,可能需要在多个地方同步更新。
  • 存储空间增加:冗余数据会占用更多的存储空间。
  • 设计和维护复杂度:随着冗余数据的增加,数据库设计变得更加复杂,维护成本上升。

应用场景与平衡策略:

在实施反规范化时,需要权衡查询性能提升与数据一致性的维护、存储成本增加之间的利弊。通常,这需要根据实际的业务需求、查询模式、系统资源限制等因素来决定。在某些情况下,可能采取混合策略,即在核心数据保持高度规范化的同时,针对特定的查询或性能瓶颈区域进行有限的反规范化处理,并采用触发器、存储过程或其他机制来维护数据一致性。此外,随着硬件性能的提升和数据库优化技术的进步,有时候可以通过索引调整、缓存策略等其他方法来改善性能,而非直接采用反规范化。

相关文章
|
11天前
|
存储 负载均衡 容灾
软件体系结构 - 关系数据库(4)分区
【4月更文挑战第27天】软件体系结构 - 关系数据库(4)分区
21 1
|
12天前
|
运维 负载均衡 监控
软件体系结构 - 关系数据库(3)主从架构
【4月更文挑战第26天】软件体系结构 - 关系数据库(3)主从架构
23 0
|
14天前
|
存储 数据库
软件体系结构 - 关系数据库(1)规范化
【4月更文挑战第24天】软件体系结构 - 关系数据库(1)规范化
22 0
|
1月前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
66 10
|
3月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
98 0
|
3月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
85 0
|
1月前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
103 6
|
2月前
|
SQL 存储 关系型数据库
【MySQL】——关系数据库标准语言SQL(大纲)
【MySQL】——关系数据库标准语言SQL(大纲)
60 0
【MySQL】——关系数据库标准语言SQL(大纲)
|
3月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据更新
【数据库SQL server】关系数据库标准语言SQL之数据更新
33 0
|
3月前
|
SQL 数据库 数据库管理
【数据库SQL server】关系数据库标准语言SQL的基本知识
【数据库SQL server】关系数据库标准语言SQL的基本知识
63 0