拉链表和宽表的优劣势

一、拉链表:是一种用于数据仓库的表结构,记录了数据随时间变化的历史状态。每次数据发生变化时,都会在拉链表中插入一条新记录,而旧记录保持不变,仅标记其有效时间区间。

在数据仓库的数据模型设计过程中,经常会遇到这样的需求:

  1. 数据量比较大
  2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;
  3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;
  4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;
  5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;
  • 对于这种表有几种方案可选: ​​​​​

  • 方案一:每天只留最新的一份,比如我们每天用Sqoop抽取最新的一份全量数据到Hive中。

  • 方案二:每天保留一份全量的切片数据。

  • 方案三: 每天保存一份增量数据 方案四:使用拉链表。

  • 以上方案对比

    方案一

    这种方案就不用多说了,实现起来很简单,每天drop掉前一天的数据,重新抽一份最新的。

    优点很明显,节省空间,一些普通的使用也很方便,不用在选择表的时候加一个时间分区什么的。

    缺点同样明显,没有历史数据,先翻翻旧账只能通过其它方式,比如从流水表里面抽。

    方案二

    每天一份全量的切片是一种比较稳妥的方案,而且历史数据也在。

    缺点就是存储空间占用量太大太大了,如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费,这点我感触还是很深的…

    当然我们也可以做一些取舍,比如只保留近一个月的数据?但是,需求是无耻的,数据的生命周期不是我们能完全左右的。

    方案三

    每天都保存增量数据,这种方案相比较方案一二的话,数据量变少了,也记录了每条数据的变化.但是数据量还是比拉链表多,同时它要求某天的历史数据查询效率比较低,比较繁琐.比如你要求2021年10月01号的在职人数,你就需要判断入职日期小于等于10月01号的,用lead函数获取下条数据,判断下条数据的离职日期是否大于2021年10月01号.

    拉链表

    拉链表在使用上基本兼顾了我们的需求。

    首先它在空间上做了一个取舍,虽说不像方案一那样占用量那么小,但是它每日的增量可能只有方案二的千分之一甚至是万分之一。

    其实它能满足方案二所能满足的需求,既能获取最新的数据,也能添加筛选条件也获取历史的数据。

    所以我们还是很有必要来使用拉链表的。

优势

  1. 历史数据跟踪

    • 拉链表能够完整地记录数据的历史变化,保留数据的所有版本,方便进行时间序列分析和审计。
  2. 数据一致性

    • 通过记录数据的所有变化,拉链表能够确保数据的一致性和完整性,使得数据分析和报告更加准确可靠。
  3. 回溯分析

    • 允许用户回溯到某一特定时间点查看数据的状态,有助于进行历史数据分析和故障排查。
  4. 数据审计

    • 拉链表为数据审计提供了基础,能够详细记录数据的变更历史,方便追溯和审核数据的变更过程。
  5. 简化数据归档

    • 拉链表可以作为数据归档的一部分,将历史数据保留在同一表中,方便管理和查询。

劣势

  1. 存储空间需求高

    • 由于需要记录数据的所有变化版本,拉链表可能会占用大量存储空间,尤其是在数据频繁变更的情况下。
  2. 数据插入复杂性

    • 每次数据变更时都需要插入新记录,同时更新旧记录的有效时间区间,这增加了数据插入操作的复杂性和资源消耗。
  3. 查询复杂性

    • 查询某一时点的有效数据可能需要进行时间过滤和关联操作,增加了查询的复杂性和执行时间。
  4. 数据冗余

    • 为了保留数据的所有版本,拉链表可能会包含大量冗余数据,这不仅增加了存储需求,还可能影响查询性能。
  5. 维护成本高

    • 由于表结构复杂,数据插入和更新操作频繁,拉链表的维护成本较高,需要更多的管理和监控。
  6. 性能问题

    • 在数据量大且变化频繁的情况下,拉链表的查询和插入性能可能受到影响,尤其是在进行大规模数据分析时。
  7. 复杂的ETL过程

    • 构建和维护拉链表的ETL(提取、转换、加载)过程相对复杂,需要处理数据的版本控制和历史记录管理,增加了开发和维护的难度。

二、宽表:一种数据仓库表结构,通常包含大量的列,并尽量减少表之间的连接操作。

优势:

  1. 查询性能提升

    • 宽表减少了多表连接(Join)的需求,从而减少了查询的复杂度和执行时间。对于复杂查询,尤其是涉及多个表的查询,宽表能够显著提升性能。
  2. 简化数据模型

    • 宽表将相关数据集中在一起,简化了数据模型,使得数据分析和查询更加直观。数据分析人员不需要处理复杂的多表关系,从而减少了错误的可能性。
  3. 提高数据读取效率

    • 宽表可以减少IO操作次数。由于相关的数据集中存储,读取数据时可以一次性获取所需信息,减少了数据读取的次数和时间。
  4. 减少冗余存储

    • 在某些情况下,宽表可以通过消除多表冗余数据存储来节省存储空间。虽然宽表本身可能会有较大的数据量,但与多表存储相比较,整体存储需求可能更低。
  5. 便于数据备份和恢复

    • 数据集中在一个表中,备份和恢复操作更加简单和高效。无需在多个表之间进行协调,减少了出错的几率。
  6. 提高数据一致性

    • 宽表减少了由于多表结构导致的数据一致性问题。所有相关数据存储在一个表中,更新操作更加简单,降低了数据不一致的风险。
  7. 优化数据分析和机器学习

    • 宽表结构适合大数据分析和机器学习应用,尤其是在需要进行特征工程和特征选择的场景下。所有相关特征数据集中存储,方便进行快速处理和分析。

劣势:

  • 存储空间需求增加

    • 宽表通常包含大量的列和重复的数据,因此可能会占用更多的存储空间,尤其是当表中包含许多冗余信息时。
  • 数据更新复杂性

    • 更新宽表中的数据可能会变得复杂且耗时,因为表结构较大且字段众多,任何更新操作都可能涉及到大量数据的修改,增加了操作的复杂性。
  • 数据冗余

    • 为了减少多表连接,宽表中可能会存储重复的数据,导致数据冗余。这不仅增加了存储需求,还可能引发数据一致性问题。
  • 灵活性降低

    • 宽表设计相对固定,添加新字段或修改现有结构可能需要重新设计和迁移数据,这降低了数据模型的灵活性,不利于应对快速变化的业务需求。
  • 性能问题

    • 在某些场景下,宽表的查询性能可能反而会下降,特别是在涉及到大量列扫描的情况下。如果表的宽度过大,可能会导致性能瓶颈。
  • 维护成本高

    • 宽表的设计、管理和维护需要更多的精力和资源。由于表结构复杂,任何变动都可能需要大量的测试和调整,增加了维护成本。
  • 数据管理难度增加

    • 宽表包含大量列,管理和理解这些数据可能会变得更加困难。数据质量、字段解释和使用规范都需要严格管理,否则容易引发数据管理问题。
  • 备份和恢复复杂性

    • 虽然宽表备份和恢复操作较为集中,但由于数据量大,备份和恢复的时间和资源需求也相应增加,特别是在大规模数据环境中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值