2009-11-16 61 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