我正在爲我過去一年來一直致力於開發的網站實施用戶獎勵/成就係統。基本前提與您在GameTrailers或GiantBomb.com上可以找到的基本前提類似:用戶獲得獎章(成就的可視化表示),用於執行以下操作:製作[x]多條評論或添加[x]多個項目他們的願望清單等跟蹤獎勵/成就係統的用戶操作
我想確定最有效的方式來實現這一點,我有點卡住了。我目前的解決方案是:
- 在數據庫中創建每個成就(這將會發生,無論)。該成就包含一個類別,一個接受編號和SQL以動態執行,以確定接受是否得到滿足。
- 每當用戶執行可能產生成就的行爲(例如對文章發表評論)時,我會運行一條SQL語句以確定他們有資格獲得哪些成就(我根據類別進行過濾,並刪除他們已經完成的)。
- 從該查詢中返回的成就中,我遍歷每一個並執行動態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服務器上壓力較小。
任何建議將不勝感激!