2009-11-16 89 views
29

我一直在浏览本网站的答案,但我仍然有点不确定如何在其数据库结构和实施计划一个类似的系统。成就/徽章系统

在PHP和MySQL中,很明显,一些成就是立即获得的(当采取专门行动时,在所有情况下填写所有配置文件字段),尽管我知道SO更新并在一定数量的时间。有这么多的用户徽章不会造成性能问题(在规模上:两个用户的徽章数量很多)。

因此数据库结构我认为会的东西一样简单:

Badges  | Badges_User  | User 
---------------------------------------------- 
bd_id  | bd_id   | user_id 
bd_name | user_id   | etc 
bd_desc | assigned(bool) | 
      | assigned_at  | 

但一些人说,这将是更好的有一个渐进式的方法让谁共有1,000,000论坛帖子用户不会减缓任何功能关闭。

那么它会成为徽章的另一张表,可能是增量式的,或只是上面的badge_user表中的'进度'字段?

感谢您的阅读,请关注期望系统的可扩展性(例如成千上万的用户和20至40个徽章)。

编辑:一些铁出了一些混淆我已assign_at作为日期/时间,授予徽章的标准将被最好放置在准备的查询/功能为每个徽章不是吗? (更好的灵活性)

+0

是一些比较流行的徽章检查比其他人还有吗? – bluedaniel 2009-11-16 20:49:37

+3

你能否澄清一下“分配(布尔)”的需求?是不是有点多余,因为除非你被分配了徽章,否则在第一种情况下你不会有映射?为什么论坛帖子的数量很重要? – Fredrik 2009-11-16 20:50:27

+0

我的第一个错误!说你分配根据职位有良好的徽章制作即奖励高职位量徽章 - >激励让用户交互 – bluedaniel 2009-11-16 20:53:05

回答

7

我认为你所建议的结构(没有根据评论“分配”字段)会起作用,并增加一个额外的表格,比如说“Submissions_User “,其中包含对user_id &的引用,用于计数提交的递增字段。然后,所有你需要的是一个“事件监听者”,根据this post和methinks你会被设置。

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

+0

好吧,这是最好的方法,在实施方面呢,就像我的问题SO在设定时间之后颁发徽章一样,因此每隔几个小时就是[foreach(徽章)] - >所有用户或[foreach (用户)] - >做所有徽章,这是否有所作为?那么我可以设置不太可能以更长时间间隔颁发的徽章?想法..和我接受作为答案 – bluedaniel 2009-11-17 14:17:57

7

关于您包含的草图:摆脱badges_user上的布尔列。在那里没有意义:该关系是通过谓词“user user_id在assigned_at处获得徽章bd_id”来定义的。对于你的总体问题:定义模式为关系型,而不考虑速度(这将使你摆脱一半潜在的性能问题,可能换取不同的性能问题),适当地索引它(什么是正确的取决于查询模式),那么如果它很慢,则从更快的方面推导(仍然是关系型)设计。就像你可能需要预先计算一些聚合等。

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

+1

嗯......我看到它的同一件事da5id正在谈论... – Sigersted 2009-11-16 21:18:46

7

我想这取决于你想跟踪的内容保持相似类型结构,你有什么

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

,然后添加跟踪表(S)和@什么细节水平......那么你就可以相应地更新表,并在其上设置触发器为“奖”徽章

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

您还可以跟踪从另一个方向太统计和触发徽章奖励

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


其他一些好点的是由 here