Skip to content

积分系统表设计方案 (含过期机制) ​

💡 设计背景

本方案旨在解决复杂的营销积分业务场景,支持积分按批次过期、按顺序扣减(FIFO)、以及在作废/退货时对积分进行精确还原的需求。


1. 核心表结构设计 ​

为了支持“作废还原”等高级操作,模型采用了三表关联结构。若业务较简单,可考虑合并可用积分与积分记录。

1.1 积分记录表 (integral_record) ​

记录所有业务引起的积分变更流水。

字段名类型说明
idbigint主键 ID
user_idvarchar(40)用户 ID
typesmallint记录类型 (1:获取, 2:使用, 3:过期)
valueint积分值 (正数为加,负数为减)
original_idvarchar(40)关联原始业务记录 ID
reasonvarchar(255)积分变更原因
expire_timedatetime该批次积分的过期时间
create_timedatetime记录创建时间

1.2 可用积分表 (usable_integral) ​

维护当前用户手中尚未过期且未被使用的积分批次。

字段名类型说明
idbigint主键 ID
record_idbigint关联积分记录表获取记录的 ID
user_idvarchar(40)用户 ID
valueint当前批次剩余可用积分值
expire_timedatetime过期时间
update_timedatetime最后更新时间

1.3 扣减详情表 (reduce_integral_detail) ​

记录每一笔“扣减”操作具体消耗了哪些“获取”批次的积分,用于追溯和还原。

字段名类型说明
idbigint主键 ID
reduce_idbigint对应的扣减记录 ID (指向 record)
add_idbigint被消耗的新增记录 ID (指向 record)
used_valueint本次操作扣减的积分值
expire_timedatetime原新增批次的过期时间

2. 场景模拟验证 ​

2.1 初始获取与部分扣减 ​

场景:用户在 2019 年分两次获得积分(50+150),2020-04-01 兑换消耗 30 分。

  • 积分记录表:存在两条获取记录(id:1, 2)和一条消耗记录(id:4, -30)。
  • 可用积分表:记录 1 的可用值变为 20,记录 2 的可用值仍为 150。
  • 扣减详情表:记录消耗记录 4 使用了获取记录 1 的 30 分。

2.2 积分过期处理 ​

场景:2020-04-02 记录 1 到期。

  • 逻辑:扫描可用积分表,发现记录 1 的 expire_time 已到,将其 value 清零并标记删除。
  • 同步:在 integral_record 插入一条过期记录(-20),在 reduce_integral_detail 记录过期消耗。

3. 核心业务逻辑说明 ​

🔴 扣减原则 积分应优先扣除最早过期且小面值的批次,以最大化用户权益并简化数据维护。

🟡 过期清理 建议每天凌晨执行定时任务:

  1. 扫描 usable_integral 中已过期的记录。
  2. 批量执行“虚拟扣减”:在流水表记录过期明细,并清理可用积分表。

🟢 数据校验等式SUM(扣减详情.used_value WHERE add_id = A) + 可用积分.value WHERE record_id = A == 积分流水.value WHERE id = A 通过此等式可实时校验系统数据的完整性与一致性。


🔗 参考资料

方舟 · Ark