用户成长值与等级核心表设计
成长体系本质是记录用户行为、累积成长值、对应等级和权益。核心需要三张表:用户主表扩展字段、成长值流水表、等级规则表。
用户表(user)增加成长相关字段:
growth_value:当前总成长值,INT 类型,建议用 BIGINT 防溢出 level:当前等级,TINYINT 或 SMALLINT,冗余存储提升查询效率 level_updated_at:上次升级时间,DATETIME,便于做等级活跃分析成长值变动必须记流水(不可只更新总数)
每次加减成长值(如签到+10、发帖+20、违规-50)都应写入独立流水表,保证可追溯、可对账、可回滚。
成长流水表(user_growth_log)建议字段:
id, user_id, amount:变动值,可正可负 type:枚举类型,如 'sign_in', 'publish_post', 'admin_deduct' related_id:关联业务ID(如帖子ID、订单号),便于溯源 created_at:精确到秒或毫秒,索引此字段支持按时间查账等级规则用配置表,避免硬编码
等级门槛(如Lv1:0~99,Lv2:100~299)应存在数据库中,方便运营后台动态调整,无需改代码发版。
等级规则表(level_rule)结构示例:
level:等级数字,主键 min_value:该等级最低成长值(含) max_value:该等级最高成长值(不含) name, description:等级名称和描述,供前端展示查当前等级时,用
SELECT * FROM level_rule WHERE min_value ?即可匹配,注意索引覆盖
min_value和
max_value。
升级逻辑放在事务里,防止并发错级
用户成长值变更后,需检查是否触发升级。这个判断+更新必须在同一个事务中完成,否则高并发下可能出现“成长值已加,但等级没升”或重复升级。
典型升级伪SQL流程:
BEGIN TRANSACTION; UPDATE user SET growth_value = growth_value + 20 WHERE id = 123; SELECT growth_value, level INTO @gv, @lv FROM user WHERE id = 123; SELECT level FROM level_rule WHERE min_value @gv INTO @new_level; IF @new_level != @lv THEN UPDATE user SET level = @new_level, level_updated_at = NOW() WHERE id = 123; COMMIT;生产环境建议将此逻辑封装为存储过程或由应用层用乐观锁(version字段)+重试实现。
