成就/徽章系统

blu*_*iel 28 php mysql architecture scalability

我一直在浏览这个网站以获得答案,但我仍然不确定如何在其数据库结构和实现中规划类似的系统.

在PHP和MySQL中,很明显会立即获得一些成就(当采取专门行动时,在所有情况下:填写所有个人资料字段),虽然我知道在一定时间后更新并分配徽章.如此多的用户和徽章不会产生性能问题(就规模而言:用户和徽章数量都很大).

所以我假设的数据库结构就像这样简单:

Badges     |    Badges_User      |    User
----------------------------------------------
bd_id      |    bd_id            |  user_id
bd_name    |    user_id          |  etc
bd_desc    |    assigned(bool)   |  
           |    assigned_at      |
Run Code Online (Sandbox Code Playgroud)

但正如有些人所说,最好采用增量式方法,因此拥有1,000,000个论坛帖子的用户不会放慢任何功能.

那么它是徽章的另一个表可能是增量的还是上面badges_user表中的'progress'字段?

感谢阅读,请关注所需系统的可扩展性(如数以千计的用户和20到40个徽章).

编辑:有些人认为我已经指定了一些混淆日期/时间,颁发徽章的标准最好放在准备好的查询/每个徽章的功能中不会吗?(更好的灵活性)

jus*_*ody 7

关于你包括的草图:去掉badges_user上的boolean列.在那里没有任何意义:该关系是根据谓词"user user_id在assigned_at获得徽章bd_id"来定义的.

至于你的整体问题:首先将模式定义为关系而不考虑速度(这将使你摆脱潜在性能问题的一半,可能换取不同的性能问题),正确索引(什么是正确的取决于查询模式),然后如果它很慢,从更快的那个派生(仍然是关系)设计.就像你可能需要预先计算一些聚合,等等.


da5*_*5id 7

我认为您建议的结构(没有根据评论的"已分配"字段)可以使用,添加一个附加表,例如"Submissions_User",其中包含对user_id的引用和用于计数提交的递增字段.那么你所需要的只是一个"事件监听器",根据这篇文章,你会被设置.

编辑:对于成就徽章,在每次提交时运行事件监听器(仅针对提交课程的用户),并在现场授予任何相关徽章.对于基于时间的徽章,我会每晚运行CRON工作.循环遍历完整的用户列表并根据情况授予徽章.


Che*_*eso 7

我会保留与你拥有的相似的类型结构

Badges(badge_id, badge_name, badge_desc)
Users(user_id, etc)
UserBadges(badge_id, user_id, date_awarded)
Run Code Online (Sandbox Code Playgroud)

然后根据您要跟踪的内容和@详细级别添加跟踪表...然后您可以相应地更新表并在其上设置触发器以"奖励"徽章

User_Activity(user_id, posts, upvotes, downvotes, etc...)
Run Code Online (Sandbox Code Playgroud)

您也可以从其他方向跟踪统计数据并触发徽章奖励

Posts(post_id, user_id, upvotes, downvotes, etc...)
Run Code Online (Sandbox Code Playgroud)


这里 还有其他一些好处