一、拉链表:是一种用于数据仓库的表结构,记录了数据随时间变化的历史状态。每次数据发生变化时,都会在拉链表中插入一条新记录,而旧记录保持不变,仅标记其有效时间区间。
在数据仓库的数据模型设计过程中,经常会遇到这样的需求:
- 数据量比较大
- 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;
- 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;
- 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;
- 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;
-
对于这种表有几种方案可选:
-
方案一:每天只留最新的一份,比如我们每天用Sqoop抽取最新的一份全量数据到Hive中。
-
方案二:每天保留一份全量的切片数据。
-
方案三: 每天保存一份增量数据 方案四:使用拉链表。
-
以上方案对比
方案一
这种方案就不用多说了,实现起来很简单,每天drop掉前一天的数据,重新抽一份最新的。
优点很明显,节省空间,一些普通的使用也很方便,不用在选择表的时候加一个时间分区什么的。
缺点同样明显,没有历史数据,先翻翻旧账只能通过其它方式,比如从流水表里面抽。
方案二
每天一份全量的切片是一种比较稳妥的方案,而且历史数据也在。
缺点就是存储空间占用量太大太大了,如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费,这点我感触还是很深的…
当然我们也可以做一些取舍,比如只保留近一个月的数据?但是,需求是无耻的,数据的生命周期不是我们能完全左右的。
方案三
每天都保存增量数据,这种方案相比较方案一二的话,数据量变少了,也记录了每条数据的变化.但是数据量还是比拉链表多,同时它要求某天的历史数据查询效率比较低,比较繁琐.比如你要求2021年10月01号的在职人数,你就需要判断入职日期小于等于10月01号的,用lead函数获取下条数据,判断下条数据的离职日期是否大于2021年10月01号.
拉链表
拉链表在使用上基本兼顾了我们的需求。
首先它在空间上做了一个取舍,虽说不像方案一那样占用量那么小,但是它每日的增量可能只有方案二的千分之一甚至是万分之一。
其实它能满足方案二所能满足的需求,既能获取最新的数据,也能添加筛选条件也获取历史的数据。
所以我们还是很有必要来使用拉链表的。
优势
-
历史数据跟踪:
- 拉链表能够完整地记录数据的历史变化,保留数据的所有版本,方便进行时间序列分析和审计。
-
数据一致性:
- 通过记录数据的所有变化,拉链表能够确保数据的一致性和完整性,使得数据分析和报告更加准确可靠。
-
回溯分析:
- 允许用户回溯到某一特定时间点查看数据的状态,有助于进行历史数据分析和故障排查。
-
数据审计:
- 拉链表为数据审计提供了基础,能够详细记录数据的变更历史,方便追溯和审核数据的变更过程。
-
简化数据归档:
- 拉链表可以作为数据归档的一部分,将历史数据保留在同一表中,方便管理和查询。
劣势
-
存储空间需求高:
- 由于需要记录数据的所有变化版本,拉链表可能会占用大量存储空间,尤其是在数据频繁变更的情况下。
-
数据插入复杂性:
- 每次数据变更时都需要插入新记录,同时更新旧记录的有效时间区间,这增加了数据插入操作的复杂性和资源消耗。
-
查询复杂性:
- 查询某一时点的有效数据可能需要进行时间过滤和关联操作,增加了查询的复杂性和执行时间。
-
数据冗余:
- 为了保留数据的所有版本,拉链表可能会包含大量冗余数据,这不仅增加了存储需求,还可能影响查询性能。
-
维护成本高:
- 由于表结构复杂,数据插入和更新操作频繁,拉链表的维护成本较高,需要更多的管理和监控。
-
性能问题:
- 在数据量大且变化频繁的情况下,拉链表的查询和插入性能可能受到影响,尤其是在进行大规模数据分析时。
-
复杂的ETL过程:
- 构建和维护拉链表的ETL(提取、转换、加载)过程相对复杂,需要处理数据的版本控制和历史记录管理,增加了开发和维护的难度。
二、宽表:一种数据仓库表结构,通常包含大量的列,并尽量减少表之间的连接操作。
优势:
-
查询性能提升:
- 宽表减少了多表连接(Join)的需求,从而减少了查询的复杂度和执行时间。对于复杂查询,尤其是涉及多个表的查询,宽表能够显著提升性能。
-
简化数据模型:
- 宽表将相关数据集中在一起,简化了数据模型,使得数据分析和查询更加直观。数据分析人员不需要处理复杂的多表关系,从而减少了错误的可能性。
-
提高数据读取效率:
- 宽表可以减少IO操作次数。由于相关的数据集中存储,读取数据时可以一次性获取所需信息,减少了数据读取的次数和时间。
-
减少冗余存储:
- 在某些情况下,宽表可以通过消除多表冗余数据存储来节省存储空间。虽然宽表本身可能会有较大的数据量,但与多表存储相比较,整体存储需求可能更低。
-
便于数据备份和恢复:
- 数据集中在一个表中,备份和恢复操作更加简单和高效。无需在多个表之间进行协调,减少了出错的几率。
-
提高数据一致性:
- 宽表减少了由于多表结构导致的数据一致性问题。所有相关数据存储在一个表中,更新操作更加简单,降低了数据不一致的风险。
-
优化数据分析和机器学习:
- 宽表结构适合大数据分析和机器学习应用,尤其是在需要进行特征工程和特征选择的场景下。所有相关特征数据集中存储,方便进行快速处理和分析。
劣势:
-
存储空间需求增加:
- 宽表通常包含大量的列和重复的数据,因此可能会占用更多的存储空间,尤其是当表中包含许多冗余信息时。
-
数据更新复杂性:
- 更新宽表中的数据可能会变得复杂且耗时,因为表结构较大且字段众多,任何更新操作都可能涉及到大量数据的修改,增加了操作的复杂性。
-
数据冗余:
- 为了减少多表连接,宽表中可能会存储重复的数据,导致数据冗余。这不仅增加了存储需求,还可能引发数据一致性问题。
-
灵活性降低:
- 宽表设计相对固定,添加新字段或修改现有结构可能需要重新设计和迁移数据,这降低了数据模型的灵活性,不利于应对快速变化的业务需求。
-
性能问题:
- 在某些场景下,宽表的查询性能可能反而会下降,特别是在涉及到大量列扫描的情况下。如果表的宽度过大,可能会导致性能瓶颈。
-
维护成本高:
- 宽表的设计、管理和维护需要更多的精力和资源。由于表结构复杂,任何变动都可能需要大量的测试和调整,增加了维护成本。
-
数据管理难度增加:
- 宽表包含大量列,管理和理解这些数据可能会变得更加困难。数据质量、字段解释和使用规范都需要严格管理,否则容易引发数据管理问题。
-
备份和恢复复杂性:
- 虽然宽表备份和恢复操作较为集中,但由于数据量大,备份和恢复的时间和资源需求也相应增加,特别是在大规模数据环境中。