私は過去1年間取り組んできたWebサイトのユーザー賞/達成システムを実装中です。基本的な前提は、GameTrailersやGiantBomb.comにあるものと似ています。ユーザーは[x]コメントを多くするか、[x]個のアイテムを追加するなどの目的で、賞のバッジ(成果の視覚的表現)彼らのウィッシュリストなどに。報酬/達成システムのユーザーアクションのトラッキング
私はこれを実装する最も効率的な方法を決定しようとしています、そして、私はちょっと立ち往生しています。現在の解決策は次のとおりです。
- データベースに各達成度を作成します(これは関係なく行われます)。成果には、受諾が満たされたかどうかを判断するために動的に実行されるカテゴリ、受入れ番号、およびSQLがあります。
- ユーザーが成果を上げる可能性のあるアクション(記事にコメントを付けるなど)を実行するたびに、SQL文を実行して、その達成度を判断します(カテゴリに基づいてフィルタを適用し、すでに完了しているもの)。
- そのクエリで返された成果から、私はそれぞれを調べて、受諾番号が満たされているかどうかを判断するために動的SQLを実行します。そうであれば、ユーザーは達成を完了しました。
手順2と3では、ユーザーがコメントを1回だけ実行するたびにこれらのクエリを実行するため、私の懸念事項があります。
上記のシナリオの例は以下の通りです(このコードは完璧全体ではない、ただのモックが...ところで、ユーザー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
だからそれをすべて言った、私はこれが動作すると思いますが、私はパフォーマ心配ですnce。私はあまりWebプログラミングに精通していませんが、おそらくUserStatsオブジェクトをセッションに保持し、それを操作してユーザが達成を完了するための十分なコメントをしたかどうかを判断する方が良いでしょうか?これは動的ではありませんが、SQLサーバーではストレスの少ない可能性があります。
どのような提案も大歓迎です!