一、拉链表的定义及使用场景
定义:所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。
使用场景:举个栗子,现有一张内含1000万数据的订单表,每天都有100左右的订单状态会变化,因业务需求要回溯某个历史节点的一笔订单的状态。
现有两种处理方式:
1.比较原始的做法,对每天的数据做切片表,查看对应时间的切片表可以得到该订单的历史状态,但是若一笔订单在状态一天内多次变化,切片表只会保留当天最后的状态,若是把粒度缩小为小时级别的切片表,多张切片表会产生大量重复的冗杂数据浪费空间。
2.使用拉链表,首先拉链表将所有数据录入,加上状态标识为当前有效,当某条数据的更新时间变化之后,把拉链表保留的该条数据标识为无效,新插入更新后的数据标识为有效。在设计中经常用有效期开始时间和结束时间来判定数据的有效与否。
二、设计方案
1.初始化
将原始表的所有数据导入拉链表,初始化有效时间,有效时间start_date为数据的创建时间和更新时间较大的那项,而end_date为max值。
2.拉链表的每日更新
-
将原始表创建时间为当前时间的数据插入拉链表,初始化有效时间有效时间start_date为当天,而end_date为max值。
-
将原始表更新时间为当天的数据插入拉链表,初始化有效时间有效时间start_date为当天,而end_date为max值。拉链表对应的该条历史数据start_date保持不变,而end_date改为当天(重点)
三、拉链表的使用
- 查询所有账户当前最新情况:select * from table where end_date=9999/12/31
- 查询某账户历史情况:如查b账户2020/01/09的情况
select * from table where id =b and start_date<=2020/01/09 and end_date>2020/01/09