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

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

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

反规范化的理由包括:

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

反规范化的类型:

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


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


(1)增加冗余列

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


2)增加派生列

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


3)重新组表

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


(4)分割表

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

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


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

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

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


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


反规范化的潜在缺点:

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

应用场景与平衡策略:

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

相关文章
|
2月前
|
SQL Oracle 关系型数据库
DBeaver,一款好用的开源数据库管理软件
DBeaver,一款好用的开源数据库管理软件
|
2月前
|
存储 BI 数据库
|
3月前
|
SQL NoSQL MongoDB
低代码使用问题之“规范化”和“反规范化”在设计数据库时应该如何权衡
低代码使用问题之“规范化”和“反规范化”在设计数据库时应该如何权衡
|
2月前
|
存储 数据库
数据库规范化的类型及其重要性
【8月更文挑战第1天】
50 0
|
3月前
|
监控 NoSQL 数据管理
电脑监控软件中的NoSQL数据库管理
这篇文章介绍了在电脑监控软件中使用NoSQL数据库管理非结构化数据。通过Python示例展示了如何使用MongoDB客户端连接数据库、插入单条或多条数据、查询数据(包括所有、特定用户和时间范围)、更新数据以及删除数据。此外,还提供了一个简单的数据监控和自动提交到网站的脚本,以每分钟检查一次新活动并发送到指定URL。这些示例有助于理解和优化监控软件中的数据处理。
86 3
|
3月前
|
存储 Java 数据管理
数据库三范式设计与规范化过程详解
数据库三范式设计与规范化过程详解
|
3月前
|
消息中间件 缓存 架构师
对抗软件复杂度问题之降低代码的复杂度,如何解决
对抗软件复杂度问题之降低代码的复杂度,如何解决
|
4月前
|
存储 搜索推荐 数据库
软件系统【标签tag功能】的两种数据库设计
软件系统中的标签功能可采用两种数据库设计。方案一,文章和Tag各一表,Tag信息存储在文章表内(`tags`和`tagids`字段),优点是模型简单,但查询效率低且易引发数据冗余和一致性问题。方案二,增加Tagmap表,用于存储标签-文章映射,利于索引查询和数据更新,适用于高效率需求,但结构更复杂。
165 0
软件系统【标签tag功能】的两种数据库设计
|
3月前
|
数据库管理 Python
在停车场管理系统工程中,我们可能会涉及到硬件设计、软件编程、数据库管理、用户界面设计等多个方面
在停车场管理系统工程中,我们可能会涉及到硬件设计、软件编程、数据库管理、用户界面设计等多个方面
|
4月前
|
存储 安全 关系型数据库