最近在看自己之前的博客,广告系统下的历史物料 ,文章背景啥的都忘记了,但是联想到一个淘宝快照是怎么做的.
两个问题,版本怎么来设计,历史快照和原物料是同一个id么?
方案1: 一开始还想过不同一个id,同一个表.相当于历史对象和当前对象同一个空间,即实体是不可变的. 这个就很扯蛋了. 一订单关联的当前外键内容id要每次变动后都变. 一个商家的当前的订单查询就比较麻烦. 需要通过gmt_modified来识别最新. 所有的历史表没有统一的归属,只有上一个不可变实体.
orderId(唯一索引) | producterId | lastOrderId |
缺点: 历史和实体之间的相关性不明确. 不符合逻辑.
方案2: 另外一种是 空间分开. 历史表专门的表(含最新的id), id非唯一键. 所有的历史表归属于同一个实体id.
orderId | producterId |
historyId(唯一索引) | orderId | lastHistoryId | updateTime |
基于方案2来设计快照就简单多了.
每个订单下面有物料,每个位置的物料(或者物料的子字段)都有自己的历史数据,加上时间戳.
通过时间戳来查询 快照订单的物料信息.
记住通过数字version是不可能实现的. 用户记录orderId的一个version. 如果order有很多物料(属性) 每次变动都要改动version么.
version适用于 端上和服务端同步, 判断自己是否是最新的数据,如果不是最新,那么就查询下.