Appearance
积分系统表设计方案 (含过期机制)
💡 设计背景
本方案旨在解决复杂的营销积分业务场景,支持积分按批次过期、按顺序扣减(FIFO)、以及在作废/退货时对积分进行精确还原的需求。
1. 核心表结构设计
为了支持“作废还原”等高级操作,模型采用了三表关联结构。若业务较简单,可考虑合并可用积分与积分记录。
1.1 积分记录表 (integral_record)
记录所有业务引起的积分变更流水。
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 ID |
| user_id | varchar(40) | 用户 ID |
| type | smallint | 记录类型 (1:获取, 2:使用, 3:过期) |
| value | int | 积分值 (正数为加,负数为减) |
| original_id | varchar(40) | 关联原始业务记录 ID |
| reason | varchar(255) | 积分变更原因 |
| expire_time | datetime | 该批次积分的过期时间 |
| create_time | datetime | 记录创建时间 |
1.2 可用积分表 (usable_integral)
维护当前用户手中尚未过期且未被使用的积分批次。
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 ID |
| record_id | bigint | 关联积分记录表获取记录的 ID |
| user_id | varchar(40) | 用户 ID |
| value | int | 当前批次剩余可用积分值 |
| expire_time | datetime | 过期时间 |
| update_time | datetime | 最后更新时间 |
1.3 扣减详情表 (reduce_integral_detail)
记录每一笔“扣减”操作具体消耗了哪些“获取”批次的积分,用于追溯和还原。
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 ID |
| reduce_id | bigint | 对应的扣减记录 ID (指向 record) |
| add_id | bigint | 被消耗的新增记录 ID (指向 record) |
| used_value | int | 本次操作扣减的积分值 |
| expire_time | datetime | 原新增批次的过期时间 |
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. 核心业务逻辑说明
🔴 扣减原则 积分应优先扣除最早过期且小面值的批次,以最大化用户权益并简化数据维护。
🟡 过期清理 建议每天凌晨执行定时任务:
- 扫描
usable_integral中已过期的记录。 - 批量执行“虚拟扣减”:在流水表记录过期明细,并清理可用积分表。
🟢 数据校验等式SUM(扣减详情.used_value WHERE add_id = A) + 可用积分.value WHERE record_id = A == 积分流水.value WHERE id = A 通过此等式可实时校验系统数据的完整性与一致性。
🔗 参考资料
