一、概念

拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。

在历史表中对客户的一生的记录可能就这样几条记录,避免了按每一天记录客户状态造成的海量存储的问题:

  (NAME)人名  (START-DATE)开始日期  (END-DT)结束日期  (STAT)状态

    client              19000101                  19070901             H在家
    client              19070901                  19130901             A小学
    client              19130901                  19160901             B初中
    client              19160901                  19190901             C高中
    client              19190901                  19230901             D大学
    client              19230901                  19601231             E公司
    client              19601231                  29991231             H退休在家

上面的每一条记录都是不算末尾的,比如到19070901,client已经在A,而不是H了。所以除最后一条记录因为状态到目前都未改变的,其余的记录实际上在END-DT那天,都不在是该条记录END-DT那天的状态。这种现象可以理解为算头不算尾。

二、算法

1、采集当日全量数据到“ ND(NewDay) ”表;

2、可从历史表中取出昨日全量数据存储到“ OD(OldDay) ”表;

3、“ (ND-OD) ”(即两个表进行全字段比较,ND 数据减去 OD 数据)就是当日新增和变化的数据,也就是当天的增量,用“ W_I ”表示;

4、“ (OD-ND) ”(即两个表进行全字段比较,OD 数据减去 ND 数据)为状态到此结束需要封链的数据,用“ W_U ”表示;

5、将“ W_I ”表的内容全部插入到“ 历史表 ”(比ND表和OD表多两个字段(start_date,end_date)) 中,这些是新增记录,start_date为当天,而end_date为max值;

6、对“ 历史表 ”进行“ W_U ”部份的更新操作,start_date保持不变,而end_date改为当天,也就是“关链操作”;

拉链表 实际上是一个数据的有效更新处理方法。 在定义了对于该方法支持的几个字段后可以对数据进行处理。

讲解一个加了几个字段的的一种处理方法

模拟场景

1、定义两个临时表,一个为当日全量数据,另一个为需要新增或更新的数据;

CREATE TABLE A_day_full;

CREATE TABLE B;

2、获取当日全量数据

INSERT INTO   A   SELECT (a,b,c,cur_date, max_date) FROM SOURCE_Table

3、抽取新增或有变化的数据,从A临时表到B临时表;

INSERT INTO   B SELECT fieldname  FROM  A WHERE   NOT IN (select fieldname  from A_HIS where end_date='max_date');

4、更新历史表的失效记录的end_date为max值

UPDATE A1  FROM a_his  A1,  B  A2 SET End_Date='current_date' WHERE A1.xx=A2.xx  AND A1.End_Date='max_date';

5、将新增或者有变化的数据插入目标表*/

INSERT INTO A_HIS SELECT * FROM B;

DataBase 之 拉链表结构设计的更多相关文章

  1. plsql的database下拉为空,如何解决?

    如何解决plsql的database下拉为空? 为什么plsql的database下拉为空?我在tnsnames.ora中设置了字符串ORCL,疑惑了我好久,在网上找了许久解决方案,终于是解决了!如下 ...

  2. 数仓1.4 |业务数仓搭建| 拉链表| Presto

    电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...

  3. hive拉链表

    前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成:先分享一下拉链表的用途.什么是拉链表.通过一些小的使用场景来对拉链表做 ...

  4. 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    本文将会谈一谈在数据仓库中拉链表相关的内容,包括它的原理.设计.以及在我们大数据场景下的实现方式. 全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近 ...

  5. merge实现拉链表

    建表如下( 历史拉链表): 新表(每日更新的): 实现语句: MERGE INTO test_target t1 USING ( SELECT nvl(c.id, b.id) AS id ,CASE ...

  6. 解决PL/SQL管理工具database下拉为空和登录出现ORA-12154

    前言:昨天捣鼓了一下午,终于可以用plsql连接上oracle了... 测试环境:win10 注意问题: (一).环境变量 我发现按网上别人说的那一大推环境配置,很容易出错,我把它们全删了,就留了两个 ...

  7. hive 汇率拉链表转日连续流水表

    1.什么是拉链表 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 我们先看一个示例,这就是一张拉链表,存储的 ...

  8. mysql执行拉链表操作

    拉链表需求: 1.数据量比较大 2.变化的比例和频率比较小,例如客户的住址信息,联系方式等,比如有1千万的用户数据,每天全量存储会存储很多不变的信息,对存储也是浪费,因此可以使用拉链表的算法来节省存储 ...

  9. hive拉链表以及退链例子笔记

    拉链表设计: 在企业中,由于有些流水表每日有几千万条记录,数据仓库保存5年数据的话很容易不堪重负,因此可以使用拉链表的算法来节省存储空间.  例子: -- 用户信息表; 采集当日全量数据存储到 (当日 ...

随机推荐

  1. linux 把用户加入一个组&从这个组中移除

    # usermod -a -G www zhou // zhou这个用户现在属于两个组 zhou www # groups zhou zhou : zhou www # gpasswd -d zhou ...

  2. 洛谷——P2095 营养膳食

    题目描述 Mr.L正在完成自己的增肥计划. 为了增肥,Mr.L希望吃到更多的脂肪.然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养.Mr.L通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超 ...

  3. 29、Flask实战第29天:cms用户名渲染和注销功能实现

    这节来完成用户名渲染和注销的功能,目前用户名在前端页面是写死的,我们需要动态的展示出来 用户名渲染 实现用户名动态展示,其中一种方法就是在视图函数,根据session信息,获取到user id,通过该 ...

  4. RabbitMQ (十三) 集群+单机搭建(window)

    拜读了网上很多前辈的文章,对RabbitMQ的集群有了一点点认识. 好多文章都说到,RabbitMQ的集群分为普通集群和镜像集群,有的还加了两种:单机集群和主从集群. 我看来看去,看了半天,怎么感觉, ...

  5. JavaScript的程序构成

    JavaScript的程序构成主要从以下几方面做个总结:控制语句.函数 .事件驱动及事件处理,希望对读者有些帮助. 控制语句: if条件语句 基本格式 if(表述式) 语句段1: ...... els ...

  6. 「HNOI2013」游走

    「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...

  7. 【状压dp】Travelling

    [hdu3001]Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. 创建Django与项目介绍

    主流web框架总结 a socket b 路由关系 c 模板字符串替换(模板语言) 主流web框架 djange a用别人的 b自己写 c自己写 flask a用别人的 b自己写 c用别人的(jinj ...

  9. ncnn阅读 - CMakeLists.txt

    CMAKE_TOOLCHAIN_FILE This variable is specified on the command line when cross-compiling with CMake. ...

  10. cocos2d-x解析xml时的Bug

    cocos2d-x中使用tinyxml解析xml配置.如下: tinyxml2::XMLDocument doc; if (tinyxml2::XML_SUCCESS != doc.LoadFile( ...