質問

私はバッジを実装すること(スタックオーバーフローのバッジのように)を実装することを考えて、Windowsサービスがなければ難しいと思いますが、可能であればそれを避けたいと思います。

私はいくつかの例を実装する計画を思いつきました:

  • Audobiographer:プロファイル内のすべてのフィールドが記入されているかどうかを確認してください。
  • コメンター:コメントをチェックするときは、コメントの数が10に等しいかどうかを確認してください。もしそうなら、バッジを授与します。
  • 良い答え:投票するときは、投票スコアが25以上かどうかを確認するためにチェックしてください。

これはデータベースにどのように実装できますか?それとも別の方法が良くなるでしょうか?

役に立ちましたか?

解決

Stackoverflowの共和フローの実装は、実際には、時々チームがドロップした情報の一部に基づいて、説明したよりもはるかに簡単です。

データベースには、 BadgeID-UserID 誰が何を持っているのかを追跡するペア(そして、いくつかのバッジの複数の賞を許可するためにカウントまたはロウイド)。

アプリケーションには、バッジタイプごとにワーカーオブジェクトがあります。オブジェクトはキャッシュにあり、キャッシュが期限切れになると、ワーカーは誰がバッジを取得して更新を行うべきかを判断するための独自のロジックを実行し、キャッシュに再挿入します。

public abstract class BadgeJob
{
    protected BadgeJob()
    {
        //start cycling on initialization
        Insert();
    }

    //override to provide specific badge logic
    protected abstract void AwardBadges();

    //how long to wait between iterations
    protected abstract TimeSpan Interval { get; }

    private void Callback(string key, object value, CacheItemRemovedReason reason)
    {
        if (reason == CacheItemRemovedReason.Expired)
        {
            this.AwardBadges();
            this.Insert();
        }
    }

    private void Insert()
    {
        HttpRuntime.Cache.Add(this.GetType().ToString(),
            this,
            null,
            Cache.NoAbsoluteExpiration,
            this.Interval,
            CacheItemPriority.Normal,
            this.Callback);
    }
}

具体的な実装:

public class CommenterBadge : BadgeJob
{
    public CommenterBadge() : base() { }

    protected override void AwardBadges()
    {
        //select all users who have more than x comments 
        //and dont have the commenter badge
        //add badges
    }

    //run every 10 minutes
    protected override TimeSpan Interval
    {
        get { return new TimeSpan(0,10,0); }
    }
}

他のヒント

仕事。それが重要です。設定された間隔で実行されるプロセスジョブから、言及した基準を確認します。レベルを設定するために外部リソースが必要な場合を除き、Windowsサービスを必要とする必要はないと思います。実際、Stackoverflowは計算にもジョブを使用していると思います。

トリガーを使用して、更新または挿入時にチェックすることができ、条件が満たされている場合はバッジを追加できます。それはそれをかなり扱うでしょう。 3、2、1でトリガーバッシングを開始します...

コメントはデータベース内に保存する必要がありますか?それから、これを行う主な方法が2つあると思います。

1)ユーザーがログインすると、コメントがカウントされます。カウントには多くの時間がかかる可能性があるため、これは明らかに望ましいアプローチではありません

2)ユーザーがコメントを投稿すると、カウントを実行して使用してカウントを使用するか、コメントが追加されたときに実行されるトリガーを実行できます。トリガーは、新しく作成されたコメントの詳細を取得し、ユーザーIDをつかみ、カウントを取得し、ある種のテーブルにユーザーに対して保存します。

あなたのプログラムがSQL Serverがそのことをするのを待ってから戻ることができるので、私はトリガーのアイデアが好きです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top