拉链表是一种记录数据变化的存储模型。正如拉链一样,有开链和闭链两种形态。主要用来维护数据的历史版本信息。
一个场景🎬
在电商购物🛍️过程中,常常会展示物流状态,比如我在京东购买的Aptamil奶粉,显示的物流信息2023-07-30 09:27:15 订单打印完成
2023-07-30 09:57:54 捡货完成
2023-07-30 17:41:09 分捡完成
2023-07-30 17:57:31 准备发往西安
... ...
2023-07-31 21:41:15 订单已签收
再比如,想要知道某一时刻数据的历史状态。2008年我使用的QQ网名是什么?
一些思考🤔
数据库中存储的数据多种多样,什么样的数据需要历史记录这点非常重要,毫无疑问,要获取数据的历史记录无疑会增加存储开销。
和一般的表设计不同,拉链表需要一个start_time和end_time,用来表示在这个时间区间内表中数据的状态。并且对于同一个数据不同记录来说,后一条的start_time往往是上一条的end_time,他们就像拉链一样,一环接着一环。对于当前生效的记录,end_time往往是一个未来遥远的时间。
根据时间的颗粒度大小,也可以设计拉链的松紧,可以每一次变更都进行记录,也可以按找分钟,小时,天进行粗力度的记录。
拉链表可以和原始业务表在一个数据库中,也可以不在一个数据库中,在数据同步的过程中,可以监听数据变更的接口,通过AOP拦截请求去更新拉链表,也可以通过监听数据库日志异步的更新拉链表,如果数据库变更有对应的message事件,也可以通过监听消息队列进行更新。