关于活动评选相关逻辑设计请教

设计场景如下:
目前有一个活动发布和参与的功能,采用laravel框架实现的,一共有两个表来保存业务数据:

表一:events

用于发布活动信息,每个活动用户均可自由参与

id titlle
1 活动 1
2 活动 2

表二:active

用于记录参与活动的用户记录

ID user_id
1 888
2 999

目前的需求如下:

1、分别列出参与活动的用户数据和未参与活动的用户明细(用户总数据单独有一个user表)
2、根据参与活动人数的多少,对活动进行动态排名

自我尝试办法:
对于已参加活动的用户明细,可以直接从active表获取,但是想要查询出某一项活动未参与用户的列表,通过join关联查询时候,如果去判断关联值为null的话,会造成全表扫描,而且数据量大的情况下,加载时间非常高。
不知道还有什么办法能更高效的实现这个办法,或者借助其他一些外部插件实现均可。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11

未啥需要查出未参加活动的用户明细,感觉这需求有问题

2年前 评论
clark (楼主) 2年前
  1. 可以预先将所有用户id 查出放缓存(可以通过任务定时更新) 用户数据明细可以根据join关联查询 然后取差集在in users表
  2. 排名可以根据redis zset有序集合进行处理
    • 每新增一个新活动就通过zadd像活动的集合里面写入一条数据 集合key为活动id拼装
    • 每新增一条报名就活动的就累计+1 通过zincrby命令增加活动参数人数
    • 通过zrank命令获取排名数据
2年前 评论

如果你拥有修改数据库字段的权限的话,events表可以增加一个json字段用来保存参与过活动的用户id,活动参与表增加一个计数字段用来保存该活动有多少人参加。有时候字段冗余会让业务逻辑好写很多,不必要墨守成规

2年前 评论
clark (楼主) 2年前
L学习不停 (作者) 2年前
$query = ActivityThemeGame::withCount('activityThemeGameLogs')->where('activity_id',$info->id)->where('status',1);
if(isset($params['keyword']) && $params['keyword']){
    $query->where('username','like','%'.$params['keyword'].'%');
}
$list = $query->orderByDesc('activity_theme_game_logs_count')->paginate(10);

log表是记录活动参与者,model做好关联就可以了

2年前 评论

你给你那个 null 效率低的SQL贴出来分析一下,我觉得这样就可以,用user表做主表,这个本身参与的人数就不会很多吧,全表扫描不是很正常吗?

SELECT *
FROM user AS a
LEFT JOIN active AS b ON b.user_id = a.id AND b.active_id = 1 // 此处表里是不是少个活动id?
WHERE b.id IS NULL
LIMIT 0,15
2年前 评论

你可以在active表加一个events表的关联id,然后用users表with关联events表,active表作为中间表,查询时如果有events表的记录就表示已经参加活动

2年前 评论

看用户量有多少,不是很多的话,可以在创建活动的时候就在记录表里面把每个正常的用户写进参与活动记录的表里面,加一个状态的字段去管理,后面的业务只要去操作这个状态就可以了

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!