2010-12-12 5 views
1

私は過去1年間取り組んできたWebサイトのユーザー賞/達成システムを実装中です。基本的な前提は、GameTrailersやGiantBomb.comにあるものと似ています。ユーザーは[x]コメントを多くするか、[x]個のアイテムを追加するなどの目的で、賞のバッジ(成果の視覚的表現)彼らのウィッシュリストなどに。報酬/達成システムのユーザーアクションのトラッキング

私はこれを実装する最も効率的な方法を決定しようとしています、そして、私はちょっと立ち往生しています。現在の解決策は次のとおりです。

  1. データベースに各達成度を作成します(これは関係なく行われます)。成果には、受諾が満たされたかどうかを判断するために動的に実行されるカテゴリ、受入れ番号、およびSQLがあります。
  2. ユーザーが成果を上げる可能性のあるアクション(記事にコメントを付けるなど)を実行するたびに、SQL文を実行して、その達成度を判断します(カテゴリに基づいてフィルタを適用し、すでに完了しているもの)。
  3. そのクエリで返された成果から、私はそれぞれを調べて、受諾番号が満たされているかどうかを判断するために動的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サーバーではストレスの少ない可能性があります。

どのような提案も大歓迎です!

答えて

0

あなたの持つアクションの数によって異なります。少数の人がいれば(1日に10k以下)、あなたは良い方法があります。

より大きい場合は、アクションを毎回行うように変更することができます。そのため、アクションを実行するたびにすべてのユーザーに対してこの関数を呼び出すのではなく、アクティブなすべてのユーザーに対してこの関数を呼び出します一度に最後の30分。 1つのチェックが30分以上かかると、次回のチェックが開始されない場合があります。

または(、colsのユーザーIDとコメント、などの数)をメタテーブルに情報を格納し、(コメントの数の増加など)のユーザアクションに対するそのテーブルを操作し、すべてのアクションの後にチェックを呼び出します。

具体的な回答は、あなたのユーザー数などのデータを入力してください。アクティブなユーザーの数はいくつですか? 1日あたりのアクション数最良の実行方法に関する問題は、ユースケースの統計に大きく依存しています。

関連する問題