成就/徽章系统

时间:2009-11-16 20:45:06

标签: 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      |

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

那么它是否会成为徽章的另一个表格,可能是增量的,或者只是上面badges_user表中的'progress'字段?

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

编辑:为了解决一些我曾指定为日期/时间的混淆,授予徽章的标准最好放在准备好的查询/每个徽章的功能中不是吗? (更好的灵活性)

4 个答案:

答案 0 :(得分:7)

关于你包含的草图:去除badges_user上的boolean列。它没有任何意义:该关系是根据谓词“user user_id在assigned_at获得徽章bd_id”定义的。

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

答案 1 :(得分:7)

我认为您建议的结构(根据评论没有“已分配”字段)可以使用,添加一个附加表,例如“Submissions_User”,其中包含对user_id&的引用。用于计算提交的递增字段。然后根据this post你需要的是一个“事件监听器”,并且你会设置它。

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

答案 2 :(得分:7)

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

Badges(badge_id, badge_name, badge_desc)
Users(user_id, etc)
UserBadges(badge_id, user_id, date_awarded)

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

User_Activity(user_id, posts, upvotes, downvotes, etc...)

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

Posts(post_id, user_id, upvotes, downvotes, etc...)

<小时/> 其他一些好处是here

答案 3 :(得分:4)

我认为这是您的多对多表(Badges_User)合适的情况之一。
但是进行了一些小改动,以便不存储未分配的徽章
我认为assigned_at是日期和/或时间 默认是用户没有徽章。

Badges     |    Badges_User      |  User
----------------------------------------------
bd_id      |    bd_id            |  user_id
bd_name    |    user_id          |  etc
bd_desc    |    assigned_at      |  
           |                     |

这样只存储实际授予的徽章 Badges_User行仅在用户获得徽章时创建。

问候
Sigersted