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

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

表一:events

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

表二:active

用于记录参与活动的用户记录
IDuser_id
1888
2999

目前的需求如下:

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

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

阅读 1.4k
1 个回答

没有很明白你的表结构,你给出的两个表结构应该是不全的,或者说不是最佳设计。
一般活动-用户的参与结构是多对多,应该有个中间关联表,除非你只有一个活动..
活动表:actives:id,title,...
用户表:users:id,name,...
活动-用户关联表:active_user: id,user_id,active_id,包含两个外键。

这样一来,查询某一活动id为1的参与用户数据为
select * from users inner join active_user on users.id = active_user.user_id where active_id = 1
或者
select * from users where id in (select user_id from active_user where active_id = 1)

未参与用户就改成,这样不用join
select * from users where id not in (select user_id from active_user where active_id = 1)

自己比对一下哪种速度快。如果还是慢,就要用redis之类的缓存一下每个活动的用户信息了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题