营销积分表设计
表结构设计
由于业务需要可以作废还原等操作,所以设计的稍微复杂,如果没有这种业务需求,可以去除扣减积分详情表以及可用积分表去除record_id并合并相同过期时间的积分,然后在账号中冗余可用积分及最近过期的积分过期时间
积分记录表 integral_record
此表对应的是业务操作引起的积分变化记录
字段名 | 类型 | 长度 | 说明 |
---|---|---|---|
id | bigint | 20 | 主键id |
type | smallint | 11 | 积分记录类型 |
original_id | varchar | 40 | 原始记录id |
value | int | 11 | 积分值 |
expire_time | datetime | 3 | 过期时间 |
reason | varchar | 255 | 积分增减原因 |
user_id | varchar | 40 | 用户id |
deleted | tinyint | 4 | 删除标记 |
create_time | datetime | 3 | 创建时间 |
update_time | datetime | 3 | 修改时间 |
可用积分表 usable_integral
此表对应的是可用的积分记录,当前积分根据此表值计算得出
字段名 | 类型 | 长度 | 说明 |
---|---|---|---|
id | bigint | 20 | 主键id |
record_id | bigint | 20 | 积分表中积分记录id |
value | int | 11 | 积分值 |
expire_time | datetime | 3 | 过期时间 |
user_id | varchar | 40 | 用户id |
deleted | tinyint | 4 | 删除标记 |
create_time | datetime | 3 | 创建时间 |
update_time | datetime | 3 | 修改时间 |
扣减积分详情表 reduce_integral_detail
字段名 | 类型 | 长度 | 说明 |
---|---|---|---|
id | bigint | 20 | 主键id |
reduce_id | bigint | 20 | 积分表中扣减积分记录id |
add_id | bigint | 20 | 积分表中新增的积分记录id |
used_value | int | 11 | 扣减的积分值 |
expire_time | datetime | 3 | 原新增的积分记录的过期时间 |
user_id | varchar | 40 | 用户id |
deleted | tinyint | 4 | 删除标记 |
create_time | datetime | 3 | 创建时间 |
update_time | datetime | 3 | 修改时间 |
场景模拟
2020-04-01当天记录
某用户积分记录表如下,其他额外信息暂时忽略
积分记录表id | 用户id | 积分值 | 添加时间 | 过期时间 | 类型 | 备注 |
---|---|---|---|---|---|---|
1 | 1 | 50 | 2019-04-02 | 2020-04-02 | 扫码获取 | 新增积分 |
2 | 1 | 50 | 2019-04-04 | 2020-04-04 | 扫码获取 | 新增积分 |
3 | 1 | 100 | 2019-04-04 | 2020-04-04 | 扫码获取 | 新增积分 |
4 | 1 | -30 | 2020-04-01 | 2020-04-01 | 积分兑换 | 使用积分 |
可用积分表
可用积分表id | 用户id | record_id | 可用积分值 | 修改时间 | 过期时间 | deleted |
---|---|---|---|---|---|---|
1 | 1 | 1 | 20 | 2020-04-01 | 2020-04-02 | 未删除 |
2 | 1 | 2 | 50 | 2019-04-04 | 2020-04-04 | 未删除 |
3 | 1 | 3 | 100 | 2019-04-04 | 2020-04-04 | 未删除 |
扣减积分详情表
记录id | 用户id | add_id 新增积分id |
reduce_id 扣减积分id |
used_value 使用积分 |
创建时间 | 过期时间 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 4 | 30 | 2020-04-01 | 2020-04-01 |
2020-04-03当天记录
某用户积分记录表如下,其他额外信息暂时忽略
积分记录表id | 用户id | 积分值 | 添加时间 | 过期时间 | 类型 | 备注 |
---|---|---|---|---|---|---|
1 | 1 | 50 | 2019-04-02 | 2020-04-02 | 1(扫码获取) | 新增积分 |
2 | 1 | 50 | 2019-04-04 | 2020-04-04 | 1(扫码获取) | 新增积分 |
3 | 1 | 100 | 2019-04-04 | 2020-04-04 | 1(扫码获取) | 新增积分 |
4 | 1 | -30 | 2020-04-01 | 2020-04-01 | 2(积分兑换) | 使用积分 |
5 | 1 | -20 | 2020-04-01 | 2020-04-01 | 3(积分过期) | 积分过期 |
可用积分表
可用积分表id | 用户id | record_id | 可用积分值 | 修改时间 | 过期时间 | deleted |
---|---|---|---|---|---|---|
2 | 1 | 2 | 50 | 2019-04-04 | 2020-04-04 | 未删除 |
3 | 1 | 3 | 100 | 2019-04-04 | 2020-04-04 | 未删除 |
扣减积分详情表
记录id | 用户id | add_id 新增积分id |
reduce_id 扣减积分id |
used_value 使用积分 |
创建时间 | 过期时间 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 4 | 30 | 2020-04-01 | 2020-04-01 |
2 | 1 | 1 | 5 | 20 | 2020-04-02 | 2020-04-02 |
2020-04-03 积分兑换80后
积分记录表id | 用户id | 积分值 | 添加时间 | 过期时间 | 类型 | 备注 |
---|---|---|---|---|---|---|
1 | 1 | 50 | 2019-04-02 | 2020-04-02 | 1(扫码获取) | 新增积分 |
2 | 1 | 50 | 2019-04-04 | 2020-04-04 | 1(扫码获取) | 新增积分 |
3 | 1 | 100 | 2019-04-04 | 2020-04-04 | 1(扫码获取) | 新增积分 |
4 | 1 | -30 | 2020-04-01 | 2020-04-01 | 2(积分兑换) | 使用积分 |
5 | 1 | -20 | 2020-04-01 | 2020-04-01 | 3(积分过期) | 积分过期 |
6 | 1 | -80 | 2020-04-01 | 2020-04-01 | 3(积分兑换) | 积分兑换 |
可用积分表
可用积分表id | 用户id | record_id | 可用积分值 | 修改时间 | 过期时间 | deleted |
---|---|---|---|---|---|---|
3 | 1 | 3 | 70 | 2020-04-03 | 2020-04-04 | 未删除 |
扣减积分详情表
记录id | 用户id | add_id 新增积分id |
reduce_id 扣减积分id |
used_value 使用积分 |
创建时间 | 过期时间 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 4 | 30 | 2020-04-01 | 2020-04-01 |
2 | 1 | 1 | 5 | 20 | 2020-04-02 | 2020-04-02 |
3 | 1 | 2 | 6 | 50 | 2020-04-03 | 2020-04-04 |
4 | 1 | 3 | 6 | 30 | 2020-04-03 | 2020-04-04 |
额外说明
积分优先扣除最早过期的且小面值的积分
每天需要定时扫码可用积分表,将过期积分删除,并在积分记录表标注好过期记录以及扣减积分详情表记录扣减值
积分总额可直接根据可用积分值计算(即使过期积分没即使删除,也可以通过计算过滤来实现)
-
校验等式: 扣减积分表中add_id为a的所有使用积分和 + 可用积分表中record_id为a的可用积分值 = 积分记录表id为a的积分值
例如:扣减积分表 add_id=1的使用积分为(30 + 20) + 可用积分表record_id=1的可用积分值(0) = 积分记录表id为1的积分值50