2010-12-12 58 views
1

我正在爲我過去一年來一直致力於開發的網站實施用戶獎勵/成就係統。基本前提與您在GameTrailers或GiantBomb.com上可以找到的基本前提類似:用戶獲得獎章(成就的可視化表示),用於執行以下操作:製作[x]多條評論或添加[x]多個項目他們的願望清單等跟蹤獎勵/成就係統的用戶操作

我想確定最有效的方式來實現這一點,我有點卡住了。我目前的解決方案是:

  1. 在數據庫中創建每個成就(這將會發生,無論)。該成就包含一個類別,一個接受編號和SQL以動態執行,以確定接受是否得到滿足。
  2. 每當用戶執行可能產生成就的行爲(例如對文章發表評論)時,我會運行一條SQL語句以確定他們有資格獲得哪些成就(我根據類別進行過濾,並刪除他們已經完成的)。
  3. 從該查詢中返回的成就中,我遍歷每一個並執行動態SQL以確定接受數是否已滿足。如果是這樣,用戶完成了成就。

步驟2和步驟3是我關心的地方,因爲每當用戶發表評論時,我都會執行這些查詢。

出現上述情況的一個例子是如下(此代碼是不完美的整體,只是一個模擬..順便說一句,用戶ID是我檢索,不是用戶輸入):

achievements = From ach In searchCtx.Achievements 
       Where ach.CategoryID = achievementCategoryID And ach.IsActive = 1 
       Select ach 

For Each achmt As Achievement In achievements 
    Dim achieved As Boolean 
    Dim sqlToExecute As String = qst.SQLToRun 
    sqlToExecute = sqlToExecute.Replace("@USERID", "'" + userid.ToString + "'") 
    sqlToExecute = sqlToExecute.Replace("@TARGETVAL", achmt.AcceptanceNumber) 
    achieved = searchCtx.ExecuteQuery(Of Boolean)(sqlToExecute).First 

    If achieved Then 
     ' Add Conquest to User Achievemnets 
     Dim usrAhmt As New UserAchievement 
     usrAhmt .UserID = userid 
     usrAhmt .DateCompleted = DateTime.Now 
     usrAhmt .AchievementID = achmt .ID 
     searchCtx.UserAchievements.InsertOnSubmit(usrAhmt) 
    End If 

下一頁

的SqlToExecute被調用返回一個布爾函數,是這樣的:

select count(id) from comment where userid = @userID 

所以有說所有這一切,我認爲這會工作,但我很擔心PERFORMA NCE。我對Web編程不太熟悉,但是最好在會話中保留一個UserStats對象,然後對其進行操作,以確定用戶是否已經提出足夠的評論來完成一項成就?這將會不那麼動態,但可能在SQL服務器上壓力較小。

任何建議將不勝感激!

回答

0

這取決於您有多少用戶操作。如果你很少(比如每天10K以下),那麼你有一個好方法,不要這樣做。

如果它更大,則可以將策略更改爲每隔一段時間執行一次操作,而不是在每次執行操作時都爲所有用戶調用此函數,請將其稱爲所有活動用戶最近30分鐘。 請務必檢查問題是否在任何給定時間只運行一次,如果一次檢查時間超過30分鐘,則下一次檢查可能無法啓動!

或者將信息存儲在元表中(包括用戶標識,註釋數量等),並相對於用戶操作(如增加註釋數量)操作該表並在每個操作後調用檢查。

如需更具體的答案,請提供數據,例如您擁有多少用戶,其中:有多少人活躍?每天有多少動作等等。表現最佳的問題高度依賴於用例的統計數據。