Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Лично я бы выбрал первый вариант и добавил " Действия " таблица для отслеживания истории ваших действий.

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

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

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

Ознакомьтесь с http://code.google.com/p/userinfuser/

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top