关于活动评选相关逻辑设计请教
设计场景如下:
目前有一个活动发布和参与的功能,采用laravel框架实现的,一共有两个表来保存业务数据:
表一:events
用于发布活动信息,每个活动用户均可自由参与
id | titlle |
---|---|
1 | 活动 1 |
2 | 活动 2 |
表二:active
用于记录参与活动的用户记录
ID | user_id |
---|---|
1 | 888 |
2 | 999 |
目前的需求如下:
1、分别列出参与活动的用户数据和未参与活动的用户明细(用户总数据单独有一个user表)
2、根据参与活动人数的多少,对活动进行动态排名
自我尝试办法:
对于已参加活动的用户明细,可以直接从active表获取,但是想要查询出某一项活动未参与用户的列表,通过join关联查询时候,如果去判断关联值为null的话,会造成全表扫描,而且数据量大的情况下,加载时间非常高。
不知道还有什么办法能更高效的实现这个办法,或者借助其他一些外部插件实现均可。
用redis bitmap
未啥需要查出未参加活动的用户明细,感觉这需求有问题
zadd
像活动的集合里面写入一条数据 集合key为活动id拼装zincrby
命令增加活动参数人数zrank
命令获取排名数据如果你拥有修改数据库字段的权限的话,events表可以增加一个json字段用来保存参与过活动的用户id,活动参与表增加一个计数字段用来保存该活动有多少人参加。有时候字段冗余会让业务逻辑好写很多,不必要墨守成规
log表是记录活动参与者,model做好关联就可以了
你给你那个 null 效率低的SQL贴出来分析一下,我觉得这样就可以,用user表做主表,这个本身参与的人数就不会很多吧,全表扫描不是很正常吗?
你可以在active表加一个events表的关联id,然后用users表with关联events表,active表作为中间表,查询时如果有events表的记录就表示已经参加活动
看用户量有多少,不是很多的话,可以在创建活动的时候就在记录表里面把每个正常的用户写进参与活动记录的表里面,加一个状态的字段去管理,后面的业务只要去操作这个状态就可以了