2013-08-05 67 views
0

我希望爲基於社區的網站上的用戶保持某種成就計數。 這個想法是在連續5天內或在整個月的每個週末進行一次記錄。保持基於時間的用戶指標計數

我也要爲獲得100個帖子提供成就,但這很容易確定。我剛纔給出的基於時間的例子有點難度。

如何製作某種通用系統來保持每個用戶的這些指標的數量?或者我最終會得到一張大桌子,其中包含「every_weekend_for_month」和「5_days_in_a_row」等字段,一旦這些整數達到4和5,它們就會「達到」。但是,對於這兩個領域,我也必須保持最後一個週末/一天的得分。

+1

爲什麼要在單個度量標準級別跟蹤這類事情?爲什麼不存儲每個登錄時間,然後按某種時間表(或每次登錄等)檢查是否已達到獎勵級別?那麼只需使用關聯表來授予用戶成就? – Brad

回答

1

您需要跟蹤所有(甚至部分)需要獲得成績的數據。

周邊登錄所取得的成就,你需要每天一次跟蹤每次登錄時,具有類似於表:

user_id | login 

1 | 2013-07-20 
1 | 2013-07-19 
1 | 2013-07-16 
2 | 2013-07-20 
... 

每當觸發跟蹤事件,您還檢查所取得的成就。

event onLogin { 

    // get the last 4 logins before the current login 
    statement = (
     SELECT login FROM tracking_user_login 
     WHERE user_id = 1 
     ORDER BY login DESC 
     LIMIT 1,4 
    ); 
    statement.execute(); 

    // did the user even login at least 4 times already? 
    if (statement.rowCount == 4) { 

     date lastLogin = todaysLogin; 
     int consecutiveLogins = 1; 

     // iterate descending through the last days 
     foreach (row in statement) { 

      if (row.login == (lastLogin - 1day)) { 
       consecutiveLogins++; // increment consecution 
       lastLogin = (lastLogin - 1day); // prepare next comparison 
      } else { 
       // consecution interrupted, ignore the rest 
       break; 
      } 
     } 

     // enough to achieve something? 
     if (consecutiveLogins >= 5) { 
      user.addAchievement('5 CONSECUTIVE LOGINS'); 
     } 
    } 

} 

您基本上可以在此活動中添加登錄周圍的所有成就。

+0

可能更好的方法是在用戶表上添加兩個額外的列,最後登錄和連續登錄日期(如果您實際上不關心保留用戶的完整登錄歷史記錄),以節省空間 – bengoesboom

+0

但是這會限制成就的可能性。他已經提到他不妨檢查一下週末是否有條件。在這種情況下,您仍然需要添加處理邏輯。 – Alex

+0

當然記錄更少的數據限制的可能性。我要說的是,OP描述的內容非常可行,而且更具可擴展性 – bengoesboom

1

您可以跟蹤所有登錄並使用該數據來推斷成果。跟蹤和搜索個人登錄可能會更慢。如果您擁有非常龐大的用戶羣和大量登錄名,在登錄時執行這些計數可能並不重要。

如果您希望速度更快,您可以追蹤特定成就的最後登錄日期,然後增加一個聽起來像您所想的那樣的計數器。