Система начисления очков, как stackoverflow - PullRequest
2 голосов
/ 09 сентября 2009

Я пытаюсь создать систему баллов в моей программе, похожую на переполнение стека, т. Е. Когда пользователь совершает доброе дело (деятельность), его / ее очки увеличиваются. Мне интересно, как лучше реализовать это с точки зрения схемы БД + логики.

Я могу придумать три варианта:

  1. Добавьте дополнительное поле с именем points в таблице users, и каждый раз, когда пользователь что-то делает, добавляйте его в это поле (но это не сможет отображать какие-либо действия)
  2. Создайте функцию, которая будет запускаться каждый раз, когда пользователь делает доброе дело, которая вычисляет значение с нуля и обновляет поле точек
  3. Вычислять каждый раз, используя функцию без поля точек.

Как лучше всего это сделать? Спасибо за ваше время.

Ответы [ 6 ]

2 голосов
/ 09 сентября 2009

Лично я бы использовал второй вариант для решения этой проблемы.

Первый вариант ограничивает функциональность, поэтому я устраню это сразу.

Третий вариант неэффективен с точки зрения производительности - вполне вероятно, что вы получите это число много , и, если ваша программа похожа на stackoverflow, возможно, покажет (вычислит) ​​это число много раз за просмотр страницы / действие.

Для меня второй вариант - достойное гибридное решение. Обычно я ненавижу , имея дублированные данные в моей системе (действия и точки, а не одно или другое), но в этом случае целочисленное поле - это довольно небольшой объем пространства на пользователя, который экономит вам много времени на пересчет значений без необходимости.

Время от времени мы должны обменивать пространство для хранения данных на производительность или наоборот, и я бы сказал, что # 2 - это компромисс, который приносит большую пользу приложению.

0 голосов
/ 25 мая 2011

Выезд http://code.google.com/p/userinfuser/

Его открытый исходный код и позволяет добавлять очки и значки в ваше приложение. Имеет привязки Java, Python, PHP и Ruby.

0 голосов
/ 10 сентября 2009

Насколько простой будет ваша система начисления очков? Я считаю, что некоторые виды журналирования / журналирования хороши, так что вы можете отслеживать активность на ежедневной / еженедельной / ежемесячной основе для всех пользователей

0 голосов
/ 09 сентября 2009

Лично я бы выбрал первый вариант и добавил таблицу «Действия», чтобы отслеживать историю ваших действий.

Когда пользователь делает что-то хорошее, он получает запись в таблице «Действия» с действием и некоторым значением балла. Значение точки может быть получено из другой таблицы или файла конфигурации. Это же значение добавляется в запись пользователя.

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

0 голосов
/ 09 сентября 2009

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

Это также предотвращает скачки чисел в случае изменения факторов (таких как удаленные элементы, которые получили баллы, или здесь, в ответах SO, которые становятся вики сообщества, изменения в правилах баллов, внешние действия, такие как присоединение к другой учетной записи здесь, в SO и т. Д.). )

Если вы хотите использовать решение для повторного вызова (2), вы можете реализовать «умное» кэширование, очистив значение (установив его в NULL, что будет означать «грязный») каждый раз, когда может произойти изменение точки, и повторно - вычислять его, когда он равен NULL, в противном случае использовать кеш. Вы также можете (в качестве самокорректирующейся меры, когда происходят неясные вещи) очистить значения через час, день или все, что вы считаете первыми, чтобы через некоторое время был произведен повторный вызов, независимо от состояния «грязного» состояния. .

0 голосов
/ 09 сентября 2009

Я бы пошел на 1 и 2 (бегать в cron каждую минуту или около того).

Так что: - дополнительное поле будет действовать как кеш на сумму очков. - Функция для расчета баллов может быть одним SQL-запросом, который пересчитает баллы для всех пользователей одновременно, чтобы набрать некоторую скорость.

Я думаю, что пересчет поля каждый раз, когда точка получена, был бы излишним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...