共计 1675 个字符,预计需要花费 5 分钟才能阅读完成。
一、拉链表原理
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 号订单是否还会被批改须要收集查看之后每天的数据分区表。