离线数仓仓库-关于拉链表

前言

此处陈述的事实可不是我们平时生活中说所的事实。

数据仓库维度建模中,事实维度是两个核心概念,用于描述和组织数据。

什么是事实

在数据仓库维度建模中,事实是指描述业务事件或过程中发生的具体事实或指标的数据。它通常表示业务中的可度量或可观察的数据,例如销售额、数量、利润、成本等。

事实表是用于存储事实数据的表格结构,其中每一行代表一个特定的业务事件或过程,并与维度表进行关联。

什么是维度

维度是描述事实数据背后的业务维度的数据。维度提供了对事实数据进行分组、过滤和分析的上下文信息。常见的维度包括时间、地理位置、产品、客户等。

维度表用于存储维度数据,其中每一行代表一个唯一的维度值,并包含与该维度相关的属性信息。

拉链表是什么?

一种在数据仓库中用于跟踪维度表中历史变化的技术。

  • 缓慢渐变维:在数据仓库的维度建模理论中,维度表用于描述事实表中的业务维度,例如产品、客户、地区等。

缓慢渐变维是指一种变化程度低,变化速度慢的维度。

例如: 上述所说的地区、客户信息维度,地区维度通常不会进行更改,比如一个地区的名字总是在很长一段时间内不会更改;一个客户的手机号码在一段时间内总是固定的。

  • 通过给维度表添加两个时间字段来实现记录数据的有效时间:有效开始时间(Start Date)和有效结束时间(End Date)
  • 每当维度表中的记录发生变化时,不会直接修改原始记录,而是通过插入新的记录来表示新的状态,并更新之前记录的结束时间。

时间:2024-01-31
有下述拉链表dim_username_zip:

user_idnamestart dateend date
1张山2024-01-319999-12-31
2李四2024-01-319999-12-31
3王五2024-01-309999-12-31
4aimyon2024-01-309999-12-31

时间:2024-02-01
上述拉链表中的id=5的数据发生改变,应该做此变化:

user_idnamestart_dateend_date
1张山2024-01-319999-12-31
2李四2024-01-319999-12-31
3王五2024-01-309999-12-31
4aimyon2024-01-302024-02-01
4aimyon362024-02-019999-12-31

上述表中id=5的记录在2024-02-01发生改变,其name下,字段的值由aimyon更改为aimyon36,因此需要将id为4的记录的end_date字段修改为时间有效的截至时间。

在大数据的非关系型数据库中,不限制主键重复


为什么要使用拉链表?

离线数据仓库中,数据同步的方式分为增量同步和全量同步。

增量同步: 是指仅将源数据中发生变化的部分复制到数据仓库中,而不是复制全部数据。

增量同步只传输源数据中发生变化的部分,这可以减少数据传输量和同步时间。增量同步通常用于在目标系统中保持与源系统的实时或定期同步,以保持数据的一致性。

全量同步:是指将源数据的全部内容复制到数据仓库中,无论数据是否发生变化。每次同步都会复制源数据的全部内容,无论是否已经存在于目标系统中。

全量同步通常在初始数据迁移或重建目标系统时使用,以确保目标系统中包含与源系统完全相同的数据。


根据上述的数据同步方式描述,如果一张表每天的数据变化量很少,那么我们在使用全量同步时,会造成大量的数据冗余;如果一张表数据变化量很多,那么我们使用增量同步时,其同步的数据又跟全表数据相差不大;

Tip:具体的数据同步方式不应该仅由数据的变化频率决定,还跟数据的基数,以及上层的指标有关系。

回到上述的dim_username_zip表,如果该表的数据基数很大,并且数据的变化频率很小,那么使用全量同步会造成大量的冗余和底下的效率,如果使用增量同步,有可能存在同步不到变化数据的情况,并且在进行统计分析很麻烦。

如何利用拉链表?

  1. 一张表的数据基数很大,并且变化频率很低。
  2. 需要给表添加数据生效时间数据失效时间两个字段。

具体的适用方法已经在上边的 拉链表是什么? 中已经说明,下边讨论关于拉链表的分区规划。


根据Hive的分区表,通过将数据放到不同目录下实现分区裁剪,从而优化查询,当我们在使用拉链表时,数据又应该如何存放?

通常情况下,我们通过时间字段进行分区,一天一分区,将每天的数据放入不同的分区中。

在使用拉链表时,我们不再将同步的数据放入对应分区,而是采用以下方法:

  1. 我们需要将数据区分,对于同步的数据,分为update和insert;
  2. 我们将至今有效的数据放入到9999-12-31(最大日期)分区,将过期数据放入到对应(数据过期时间)分区;
  3. 对于insert的数据,可以直接存放到9999-12-31(最大日期)分区;
  4. 对于update的数据,也可以直接存放到9999-12-31(最大日期)分区,但是还需要修改过期数据,将被更改的元数据修改分区到对应(数据过期时间)分区;
user_idnamestart_dateend_date
1张山2024-01-319999-12-31
2李四2024-01-312024-02-03
2李五2024-02-039999-12-31
3王五2024-01-309999-12-31
4aimyon2024-01-302024-02-01
4aimyon362024-02-019999-12-31

如上述,拉链表其实很好理解,拉链表虽然能够记录数据的历史变更记录,但也存在一些弊端。

为什么禁止使用拉链表?:

即使拉链表这种建模方式,能够解决数据的历史变化记录,但也存在了一些潜在的问题和复杂性。

  • 数据冗余:每次维度数据发生变化的时候,都需要创建一行新的记录,久而久之存储空间的需求会越来越大,并且在查询时,可能需要进行额外的处理。
  • 复杂性: 当需要查询历史数据的变化的时候,这可能需要复杂的查询逻辑获取结果,并且当系统发生错误,数据的同步出错时,拉链表需要更多的开发和维护。
  • 性能影响:拉链表能够处理历史数据,如果处理大量的历史数据,可能导致查询性能下降。
  • 数据一致性: 维度表总是需要跟事实表的数据保持一致,当维度数据发生变化时,需要确保所有相关的事实数据能够正确的关联到维度记录上。

拉链表还可能出现断链,交叉链表的问题,在维护方便十分麻烦,因此一些公司禁止使用拉链表。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aimyon_36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值