logo头像

Always believe youself.

初识拉链表

本文于1517天之前发表,文中内容可能已经过时。

做程序这么久了,其实在数据库这方面一直是一个菜鸟。以前学的东西比较多,学完之后也用不到慢慢的就遗忘了,业务中用到的也是最基本的,就是增删查改,所以一直在这方面也没什么进展。以前公司业务中数据库都是前辈们设计好的,有一些也是比较复杂的,所以我也没接触到,最近自己在做一些小的项目,从头到尾都得自己来,也是自己设计数据库,对于简单的业务也不需要花式的设计,设计完有幸让大佬帮我看下,大佬给我指出某些地方设计可以用拉链表,所以我就有时间对自己科普一下,进一步学习!


以下都是各处搜集信息:

  • 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。
  • 拉链表实际上是一个数据的有效更新处理方法。在定义了对于该方法支持的几个字段后可以对数据进行处理
  • 在数据仓库中,经常会用历史数据和时间维度做数据分析。而保存历史数据最常见的方案是使用拉链表进行存储。
  • 拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储;
  • dw_begin_date表示该条记录的生命周期开始时间,dw_end_date表示该条记录的生命周期结束时间;
    dw_end_date = ‘9999-12-31’表示该条记录目前处于有效状态;如果查询当前所有有效的记录,则select * from order_his where dw_end_date = ‘9999-12-31’
  • 算法
    • 采集当日全量数据到ND(NewDay)表;
      • 可从历史表中取出昨日全量数据存储到OD(OldDay)表;
    • (ND-OD)就是当日新增和变化的数据,也就是当天的增量,用W_I表示;
    • (OD-ND)为状态到此结束需要封链的数据,用W_U表示;
    • 将W_I表的内容全部插入到历史表中,这些是新增记录,start_date为当天,而end_date为max值;
    • 对历史表进行W_U部份的更新操作,start_date保持不变,而end_date改为当天,也就是关链操作;

好像今天加班又比较晚了,回家!
image