电商快照系统解析- 历史实体设计

最近在看自己之前的博客,广告系统下的历史物料 ,文章背景啥的都忘记了,但是联想到一个淘宝快照是怎么做的.

两个问题,版本怎么来设计,历史快照和原物料是同一个id么?

方案1: 一开始还想过不同一个id,同一个表.相当于历史对象和当前对象同一个空间,即实体是不可变的.  这个就很扯蛋了. 一订单关联的当前外键内容id要每次变动后都变. 一个商家的当前的订单查询就比较麻烦. 需要通过gmt_modified来识别最新. 所有的历史表没有统一的归属,只有上一个不可变实体.

  

orderId(唯一索引)producterIdlastOrderId
   
   

 缺点: 历史和实体之间的相关性不明确. 不符合逻辑.

  方案2: 另外一种是 空间分开. 历史表专门的表(含最新的id), id非唯一键. 所有的历史表归属于同一个实体id. 

orderIdproducterId    
  
  

 

historyId(唯一索引)orderIdlastHistoryIdupdateTime
    
    

 

基于方案2来设计快照就简单多了.

每个订单下面有物料,每个位置的物料(或者物料的子字段)都有自己的历史数据,加上时间戳.

通过时间戳来查询 快照订单的物料信息. 

记住通过数字version是不可能实现的. 用户记录orderId的一个version. 如果order有很多物料(属性) 每次变动都要改动version么.

version适用于 端上和服务端同步, 判断自己是否是最新的数据,如果不是最新,那么就查询下.

订单快照是指对订单进行快照,记录下订单在某个时间点的状态,方便后续查询和对比。Java 中可以通过以下方式设计订单快照: 1. 定义订单快照实体类,包含订单的基本信息、订单状态等字段。 2. 在订单类中添加生成订单快照的方法,该方法会返回一个订单快照对象,并将当前订单状态赋值给订单快照对象。 3. 在需要生成订单快照的地方调用订单类中的生成订单快照方法,将生成的订单快照对象保存到数据库中。 以下是 Java 代码实现: 首先定义订单快照实体类: ```java public class OrderSnapshot { private Long id; // 订单快照ID private Long orderId; // 订单ID private String status; // 订单状态 private BigDecimal amount; // 订单金额 private Date createTime; // 订单快照创建时间 // 省略构造函数、getter/setter 方法 } ``` 然后在订单类中添加生成订单快照的方法: ```java public class Order { private Long id; // 订单ID private String status; // 订单状态 private BigDecimal amount; // 订单金额 private Date createTime; // 订单创建时间 // 省略构造函数、getter/setter 方法 /** * 生成订单快照 */ public OrderSnapshot generateSnapshot() { OrderSnapshot snapshot = new OrderSnapshot(); snapshot.setOrderId(this.id); snapshot.setStatus(this.status); snapshot.setAmount(this.amount); snapshot.setCreateTime(new Date()); return snapshot; } } ``` 最后在需要生成订单快照的地方调用订单类中的生成订单快照方法,将生成的订单快照对象保存到数据库中: ```java Order order = new Order(); // 设置订单状态、金额等信息 OrderSnapshot snapshot = order.generateSnapshot(); // 将订单快照保存到数据库中 orderSnapshotDao.save(snapshot); ``` 这样就完成了订单快照设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值