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个徽章).
编辑:有些人认为我已经指定了一些混淆日期/时间,颁发徽章的标准最好放在准备好的查询/每个徽章的功能中不会吗?(更好的灵活性)
关于你包括的草图:去掉badges_user上的boolean列.在那里没有任何意义:该关系是根据谓词"user user_id在assigned_at获得徽章bd_id"来定义的.
至于你的整体问题:首先将模式定义为关系而不考虑速度(这将使你摆脱潜在性能问题的一半,可能换取不同的性能问题),正确索引(什么是正确的取决于查询模式),然后如果它很慢,从更快的那个派生(仍然是关系)设计.就像你可能需要预先计算一些聚合,等等.
我会保留与你拥有的相似的类型结构
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)