数据仓库实践:流水表和拉链表基础概念

背景

在某些分析场景下,我们需要处理一部分数据,这些数据通常有以下特征:

我们需要分析该类数据从创建到当前或者相当长一段周期的历史内容,历史状态;

该类数据创建之后不会被轻易删除,或者不会被删除,长期存在;

该类数据会不断的变化,有时是所有一起变化,但大部分时间只有部分变化;

此时,我们会想到用一个定时任务周期性的记录这类数据,每条数据在每次定时任务运行完成后都已一条记录。以此记录该类数据的历史版本;

这是全量表的逻辑,但是这种方法仍然有弊端:

因为不是每一次定时任务运行时所有的该类数据都会跟上一次不一样,

如果直接记录,虽然逻辑上不会有问题,但会多占用许多存储资源并且不会产生价值。

尤其是在数据仓库下,数据量特别大的情况下,花费的存储成本和计算成本会远超其分析价值,得不偿失。

为解决此类问题,我们引入了流水表和拉链表;

简介

流水表

顾名思义,流水表对于表的每一个修改都会记录,可以用于反映实际记录的变更。

这种数据和银行卡交易明细、DEBUG事件日志很像,事件每发生一次,则记录一次,在此基础上记录变化的内容;

设计流水表的时候,会在数据原有的主键上添加 update_date(update_time也可,视时间粒度而定)作为发生变化的时间,

并且在数据原有内容字段后加上流水的说明字段比如 description 描述此次变化的内容。

拉链表

设计拉链表的时候在数据的主键基础上 添加 start_date 和 end_date 两个字段,

数据更新时,通过新增版本记录 并 设置最新 start_date 和 end_date 来设置版本记录的所在时间段(有效时间)。

通过数据的主键和新增的start_date 和 end_date字段,我们能够清楚得到数据的所有历史版本,

就像拉链,合在一起的链牙是已经记录的历史版本记录,拉头所在的链牙位置(最大start_date 和 end_date所在的版本记录)就是最新版记录。

同时因为是版本记录,记录中所有内容相同的情况下会在拉链表中被合并为一条记录,也保证了数据量比全量少许多,最大限度地节省存储空间。

所谓拉链,就是记录历史,记录一个事物从开始,一直到当前状态的所有版本的信息。

我们可以使用这张表拿到最新的当天的最新数据以及之前的历史数据。

既能满足反应数据的历史状态,又可以最大限度地节省存储空间

拉链表和流水表的区别

引入两类表的目的都同样是减少存储和计算的成本,只是拉链表和流水表的记录的内容有些许差异;

拉链表记录的是版本记录,也即发生变化前和发生变化后的版本内容;

流水表记录的是事件,每次发生变化的时刻(秒,分,时,可视记录周期统计粒度来定),事件发生的结果等。

应用场景

在制造类企业的分析场景下一般会有以下应用:

人员主题分析:员工的【入转调离】、员工履历等分析;

设备主题分析:设备运行过程中待料,调机,故障,正常工作等状态的记录和分析;

产品主题分析:产品结构履历等

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

The_Singing_Towers

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

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

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

打赏作者

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

抵扣说明:

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

余额充值