什么是资料库反正规化?优缺点是什么?
2023年2月10日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
什么是资料库反正规化?
资料库正规化是透过分表的的方式去做到降低资料的重复性、去除相依性等,但他的缺点显而易见,表跟表之间的耦合性会很高、而且利用JOIN
的方式查询会导致速度变慢、拆成多张表的储存成本也较高。
资料库反正规化(Database Denormalization)是一种将资料库中的资料再次加工,将资料从正规化状态转换为非正规化状态的过程。而反正规化不等于非正规化(Unnormalized Form),反正规化是先遵守正规化的所有规则,再进行局部调整,故意打破一些正规化规则;而后者非正规化是全然不顾规则。
反正规化的逻辑在于:通过增加冗余数据或对数据进行分组,牺牲一部分的写入性能,换取更高的读取性能。简单来说,反正规化就是要把某些数据在不同地方多放几份,加快数据检索速度。
反正规化的优缺点
优点
- 查询效能提升:通过将资讯放在一起,可能增加冗余性。单因为
JOIN
的数量减少,这会提高查询效能。 - 方便管理:由于粒度高,正规化资料库很难管理;相反的,反正规化可以提供易于使用的资料,而不是
JOIN
完才能知道其资料的完整性。 - 提升报告化过程:分析资料需要迅速进行大量计算。反正规化资料库生成报告是提供分析资讯的理想解决方案。
缺点
- 提升复杂性:在插入、更新资料时增加复杂性以及成本。
- 不一致性:因为数据难以更新,所以可能会有数据不一致的问题。
- 增加存储负担:由于增加了资料的冗余,因此需要更大的储存空间。
反正规化的技术
Pre-joining Tables
预先将两张表或多张表 JOIN
起来,而会这样做通常是因为:
- 在查找时,两张表或多张表常常需要一起查找
JOIN
时是需要耗费大量资源
如下图所示,下图将两张表预先 JOIN
,这样可以节省大量的时间和多次 JOIN
带来的资料库负担。
Mirror Tables
Mirror Table 分成「部分复制」以及「全部复制」,常常是用来做备份。另外,有时会需要将数据做别的分析或者建模,因为需要将大量的资料做聚集,而这个步骤可能会导致系统效能降低,因此复制出来另外去处理,会使得原本的服务不会因为大量的计算而被中断或者降低效能。
Table Splitting
常见的拆分方法有两种:
水平切分:刻意将不同的 Row 拆分成不同的表,可以利用
ID
的范围或透过某些条件来拆分。垂直切分:将不同的 Columne 拆分成不同的表,Primary Key 也会重复出现在不同的表中。
Storing Derivable Values
有些数值如果常常用到,就可以先计算好,例如:透过生日要算年龄,就可以新增一个栏位去存放年龄,而不用每次都重新算,如下图所示: