Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment implémenter les badges ?

Une implémentation similaire à Stackoverflow est en fait beaucoup plus simple que ce que vous avez décrit, basée sur des informations fournies par l'équipe de temps en temps.

Dans la base de données, vous stockez simplement une collection de BadgeID -UserID des paires pour suivre qui a quoi (et un décompte ou un rowID pour permettre plusieurs récompenses pour certains badges).

Dans l'application, il existe un objet worker pour chaque type de badge. L'objet est en cache, et lorsque le cache expire, le travailleur exécute sa propre logique pour déterminer qui doit obtenir le badge et effectuer les mises à jour, puis il se réinsère dans le cache :

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);
    }
}

Et une implémentation concrète :

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); }
    }
}