什么是资料库反正规化?优缺点是什么?

2023年2月10日

💎 加入 E+ 成長計畫 與超過 350+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

什么是资料库反正规化?

资料库正规化是透过分表的的方式去做到降低资料的重复性、去除相依性等,但他的缺点显而易见,表跟表之间的耦合性会很高、而且利用JOIN 的方式查询会导致速度变慢、拆成多张表的储存成本也较高

资料库反正规化(Database Denormalization)是一种将资料库中的资料再次加工,将资料从正规化状态转换为非正规化状态的过程。而反正规化不等于非正规化(Unnormalized Form),反正规化是先遵守正规化的所有规则,再进行局部调整,故意打破一些正规化规则;而后者非正规化是全然不顾规则。

反正规化的逻辑在于:通过增加冗余数据或对数据进行分组,牺牲一部分的写入性能,换取更高的读取性能。简单来说,反正规化就是要把某些数据在不同地方多放几份,加快数据检索速度

反正规化的优缺点

优点

  1. 查询效能提升:通过将资讯放在一起,可能增加冗余性。单因为 JOIN 的数量减少,这会提高查询效能。
  2. 方便管理:由于粒度高,正规化资料库很难管理;相反的,反正规化可以提供易于使用的资料,而不是 JOIN 完才能知道其资料的完整性。
  3. 提升报告化过程:分析资料需要迅速进行大量计算。反正规化资料库生成报告是提供分析资讯的理想解决方案。

缺点

  1. 提升复杂性:在插入、更新资料时增加复杂性以及成本。
  2. 不一致性:因为数据难以更新,所以可能会有数据不一致的问题。
  3. 增加存储负担:由于增加了资料的冗余,因此需要更大的储存空间。

反正规化的技术

Pre-joining Tables

预先将两张表或多张表 JOIN 起来,而会这样做通常是因为:

  1. 在查找时,两张表或多张表常常需要一起查找
  2. JOIN 时是需要耗费大量资源

如下图所示,下图将两张表预先 JOIN ,这样可以节省大量的时间和多次 JOIN 带来的资料库负担。

Denormalization Pre-Join Table
Denormalization Pre-Join Table
圖片來源:https://phoenixnap.com/kb/database-denormalization

Mirror Tables

Mirror Table 分成「部分复制」以及「全部复制」,常常是用来做备份。另外,有时会需要将数据做别的分析或者建模,因为需要将大量的资料做聚集,而这个步骤可能会导致系统效能降低,因此复制出来另外去处理,会使得原本的服务不会因为大量的计算而被中断或者降低效能。

Table Splitting

常见的拆分方法有两种:

  • 水平切分:刻意将不同的 Row 拆分成不同的表,可以利用 ID 的范围或透过某些条件来拆分。

  • 垂直切分:将不同的 Columne 拆分成不同的表,Primary Key 也会重复出现在不同的表中。

Table Splitting
Table Splitting

Storing Derivable Values

有些数值如果常常用到,就可以先计算好,例如:透过生日要算年龄,就可以新增一个栏位去存放年龄,而不用每次都重新算,如下图所示:

Database denormalization - Storing Derivable Values
Database denormalization - Storing Derivable Values

相关文章

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們