一、拉链表原理
1、引入
在数据仓库的数据模型设计过程中,常常会遇到这样的需要:
(1)数据量比拟大。
(2)表中的局部字段会被update,如用户的地址,产品的形容信息,订单的状态等等。
(3)须要查看某一个工夫点或者时间段的历史快照信息,比方,查看某一个订单在历史某一个工夫点的状态。
(4)查看某一个用户在过来某一段时间内,更新过几次等等。
(5)变动的比例和频率不是很大,比方,总共有1000万的会员,每天新增和发生变化的有10万左右。
(6)如果对这边表每天都保留一份全量,那么每次全量中会保留很多不变的信息,对存储是极大的节约。
拉链表,既能满足反馈数据的历史状态,又能够最大水平的节俭存储。
2、拉链表概念
拉链表是针对数据仓库设计中表存储数据的形式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,始终到以后状态的所有变动的信息。
3、举例说明
上面有一张原始表,表外面的有5条数据,该数据含有orderid、create_time、mod_time三列,别离示意订单编号、订单创立工夫、订单批改工夫。能够看出该数据都是在2020-11-14统计进去的,当天只能统计出前一天的数据。
有了一张原始表之后,咱们创立一个拉链表,所来记录之后所有的订单更新以及新建的详情,如下图所示,咱们能够看出拉链表比原始表多了两列,别离为start_time、end_time,别离示意为订单的失效日期以及生效日期。其中一开始失效日期就是创立日期,而生效日期咱们设置为很大的数字,示意只有该条订单不被批改,那就是永恒失效。
创立原始表和初步的拉链表后,到15号开始统计14号的数据,又有两条记录,入下图所示。因为咱们每天产生的记录都会依照日期将数据保留在分区表中,所以该分区表最初多了一列示意分区名,其实就是日期。
更新原始表如下图所示,咱们发现在14号的记录中,2号订单在14号被批改过一次,同时又创立了一个6号订单
而后咱们须要将14号数据的分区表和初步设计的拉链表开始整合,进行左外连贯(left join),拉链表left join 分区表,连贯后的表外面end_time字段为null的值从新设置为永恒失效日期。
为什么要这样设置呢?
(1)首先进行左外链接,后果是只有2号订单可能和拉链表匹配的上,阐明只有2号订单在14号产生了更新,那咱们就将拉链表中的2号订单的end_time改成14号,而其余4个订单的end_time会为null,阐明没有产生更新,那咱们就将其设置为永恒失效日期。
(2)咱们还发现在14日的数据中除了批改2号订单,又创立了一个6号订单,所以在拉链表中咱们在最初间接退出一个6号订单。
最终将14号的记录更新后,拉链表如下图所示。
依此类推,咱们开始收集15号的记录数据,导入分区表中,如下图所示。发现2号订单又更新了一次,4号订单也更新了一次,同时又创立了一个7号订单。
更新原始表如下图与所示。将2号和4号订单的end_time改成15号,同时减少一个7号订单信息。
更新拉链表,让新的14号的拉链表和15号的数据分区表做left join,以及之后的整合。
这边有一个很重要的一点:就是2号订单之前曾经批改过一次,end_time工夫为14号,当初15号又批改一次,那之前14号的批改的那条2号订单数据其实曾经生效,新的2号订单end_time为15号;与此同时,4号订单做了第一次的更新,所以将4号订单的end_time改成15号即可;最初又创立一个7号订单。如下图所示
最初一步就是将15号数据中批改2号订单和4号订单的数据从新增加到拉链表中。并且从新设置end_time为永恒失效日期。
最终拉链表展现:咱们能够看出某个订单在哪一天产生了变更,到了变更的那一天,依照订单号查找订单,就能够查出该订单编号之后有没有再变更,该过程就造成了一张拉链表。以2号订单为例:咱们发现,2号订单在13号的时候被创立,14号的时候批改过一次,而后去统计15号的数据,发现2号订单在15号的时候又被批改过一次,最初2号订单是否还会被批改须要收集查看之后每天的数据分区表。