2009-09-09 2 views
2

Я пытаюсь создать систему точек в моей программе, подобную переполнению стека, то есть когда пользователь делает какое-то хорошее действие (активность), его/ее точки увеличиваются. Мне интересно, что лучший способ реализовать это с точки зрения схемы db + логики.Система баллов, такая как stackoverflow

я могу думать о трех вариантов:

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

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

ответ

2

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

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

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

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

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

0

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

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

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

0

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

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

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

0

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

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

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

0

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

0

Заканчивать http://code.google.com/p/userinfuser/

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

Смежные вопросы