Подтвердить что ты не робот

Как реализовать значки?

Я подумал о том, чтобы реализовать значки (как и значки здесь в Stack Overflow), и подумать, что это будет сложно без служб Windows, но я хотел бы избежать этого, если это возможно.

Я придумал план для реализации некоторых примеров:

  • Audobiographer: проверьте, заполнены ли все поля в профиле.
  • Комментарий: при комментировании проверьте, равно ли количество комментариев равным 10, если это так награждает значок.
  • Хороший ответ: при голосовании проверьте, имеет ли рейтинг голосов 25 или выше.

Как это можно реализовать в базе данных? Или может быть лучше?

4b9b3361

Ответ 1

Реализация аналогичного типа -Stackoverflow на самом деле намного проще, чем вы описали, на основе бит информации, которую команда отбрасывала каждый раз через некоторое время.

В базе данных вы просто сохраняете коллекцию пар BadgeID - UserID для отслеживания того, кто имеет (и счетчик или идентификатор rowID, чтобы разрешить несколько наград для некоторых значков).

В приложении есть рабочий объект для каждого типа значка. Объект находится в кеше, и когда кеш истекает, рабочий запускает свою собственную логику для определения того, кто должен получить значок и делать обновления, а затем он снова вставляет себя в кеш:

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

Ответ 2

Работа. Это ключ. Вне рабочих заданий, которые выполняются с заданными интервалами, чтобы проверить критерии, которые вы упомянули. Я не думаю, что вам даже нужно иметь службу Windows, если для ее установки не требуются внешние ресурсы. Я действительно думаю, что StackOverflow также использует задания для своих вычислений.

Ответ 3

Вы можете использовать триггеры и проверять наличие обновлений или вставить, а затем, если ваши условия будут выполнены, добавьте значок. То, что справится с этим, кажется, меньше. Начало триггера в 3, 2, 1...

Ответ 4

комментарии должны храниться в базе данных правильно? то я думаю, что есть два основных способа сделать это.

1), когда пользователь входит в систему, вы получаете количество комментариев. это явно не желаемый подход, поскольку счет может занять много времени

2), когда пользователь отправляет комментарий, вы можете либо выполнить подсчет, либо сохранить счетчик с использованием данных, либо выполнить триггер, который выполняется при добавлении комментария. триггер затем получит детали вновь созданного комментария, захватит идентификатор пользователя, получит счетчик и сохранит его против пользователя в какой-либо таблице.

Мне нравится идея триггера, так как ваша программа может вернуться без ожидания, когда сервер sql сделает все возможное.