Отслеживание пользовательских баллов (например, SO) - PullRequest
12 голосов
/ 02 марта 2010

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

Должен ли я хранить итоговую сумму пользователя в таблице «Пользователь» или просто извлекать все транзакции, которые влияют на пользователя в итоговых вопросах, суммировать их и отображать итоговую сумму?

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

Как правильно спроектировать это?

РЕДАКТИРОВАТЬ: принял совет. Используя оба и recalcs. Я добавил столбец RecalcDate, и если он старше одного дня, он будет вызван. Итоговое значение также пересчитывается каждый раз, когда пользователь делает что-то, что должно повлиять на общее количество баллов.

Ответы [ 2 ]

9 голосов
/ 02 марта 2010

Оба

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

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

3 голосов
/ 02 марта 2010

Вы, вероятно, должны сделать смесь обоих.

Сохранение промежуточного итога в таблице «Пользователь», а также ведение журнала каждой транзакции, которая влияет на итоговое значение пользователя. Таким образом, вам не нужно делать сумму всех записей, но вы получите их на всякий случай .

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

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