Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Балловая система действий пользователя


Автор: ruX 9.10.2009, 18:25
Всем доброго времени суток.

Мне нужно вести счёт(баллов/поинтов) пользователя. Этот счёт несколько похож на карму - за исключением, что списываются и добавляются баллы системой за различные действия(просмотр, коммент, заход на сайт). Практически, как это сделанно в http://otvety.google.ru.
Там:
  •  заход на сайт(раз в сутки) +5
  •  голос ответа +1
  •  ответ +2
  •  создание вопроса(-10, -20... сколько сам укажешь)
  •  ответ заминусовали - баллы убираются.

думаю идея ясна.

Я думаю завести таблицу(user_id, action_id, points, timestamp) в которую записывать изменение счёта в размере points для юзера user_id, которое произошло в timestamp и причина изменения баллов - action_id. В свою очередь создать таблицу(action_id, describe) в которой номер действия action_id связан с его описанием describe.
Также хранить в таблице пользователя текущий счёт, ну это понятно, не пересчитывать же.

Предполагается очень много действий пользователя(практически любое открытие страницы вызывает изменение баллов). 
Узнать текущий счёт будет не проблемма - он лежит в отдельной таблице. 
А просмотр действий? Идеально - это join'ить 2 таблицы по полю action_id и получается лог действий.
Ещё, стоимость одного из действий может меняться. Т.е. (например) сохранил, что человек просмотрел 2 фото, спустя день он вернулся к альбому и продолжил просматривать его, за что ещё баллы начисляются(а вернее надо добавить к тому что записал в бд!)

Оптимально?

Или стоит ежедневно/недельно/месячно "консервировать" текущую таблицу действий? Или причину изменения баллов вынести в файл например?

Может какие-нибудь глобальные изменения в идее есть?

Автор: youri 12.10.2009, 18:22
Цитата(ruX @  9.10.2009,  18:25 Найти цитируемый пост)
Я думаю завести таблицу(user_id, action_id, points, timestamp) в которую записывать изменение счёта в размере points для юзера user_id, которое произошло в timestamp и причина изменения баллов - action_id

почему points в этой таблице, а не в таблице actions?

Цитата(ruX @  9.10.2009,  18:25 Найти цитируемый пост)
Ещё, стоимость одного из действий может меняться. Т.е. (например) сохранил, что человек просмотрел 2 фото, спустя день он вернулся к альбому и продолжил просматривать его, за что ещё баллы начисляются(а вернее надо добавить к тому что записал в бд!)

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

Автор: ruX 13.10.2009, 19:24
Цитата(youri @  12.10.2009,  18:22 Найти цитируемый пост)
почему points в этой таблице, а не в таблице actions?

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


Цитата(youri @  12.10.2009,  18:22 Найти цитируемый пост)
как это стоимость действий должна меняться? Вместо добавления новой записи ты собираешься существующую изменять?

Думаю да, а не стоит?
Пусть юзер просматривает всего лишь 1 альбом - 500фото. тогда нужно записывать 500 строк в таблицу!

Автор: Hellka 13.10.2009, 19:34
Цитата(ruX @  9.10.2009,  18:25 Найти цитируемый пост)
Ещё, стоимость одного из действий может меняться. Т.е. (например) сохранил, что человек просмотрел 2 фото, спустя день он вернулся к альбому и продолжил просматривать его, за что ещё баллы начисляются(а вернее надо добавить к тому что записал в бд!)

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

Автор: ruX 14.10.2009, 11:46
Цитата(Hellka @  13.10.2009,  19:34 Найти цитируемый пост)
а зачем такой геморрой?

Это ТЗ а не геморрой )

Цитата(Hellka @  13.10.2009,  19:34 Найти цитируемый пост)
не думаешь, что юзеры накручивать будут?

Об этом я также не должен думать

Цитата(Hellka @  13.10.2009,  19:34 Найти цитируемый пост)
делай всё четко и сурово. зашел в альбом +1, зашел еще раз - фиг, т.к. уже смотрел его.по своему опыту знаю, что изголяться начнут

Да, просмотренные фото при повторном просмотре конечно не будут "тарифицироваться". А вообще здесь "фото" и "альбомы" это абстрактно - по факту может быть много чего.

Автор: youri 14.10.2009, 22:57
а где будут храниться текущие points?

Автор: Hellka 15.10.2009, 07:36
Цитата(youri @  14.10.2009,  22:57 Найти цитируемый пост)
а где будут храниться текущие points? 


Цитата

Также хранить в таблице пользователя текущий счёт, ну это понятно, не пересчитывать же.


profit?

Автор: youri 15.10.2009, 08:12
я про points, которые модераторы назначают и которые меняются

Автор: Hellka 15.10.2009, 09:46
Цитата(youri @ 15.10.2009,  08:12)
я про points, которые модераторы назначают и которые меняются

да это можно и в файле конфига, и в таблице и в массиве хранить

Автор: ruX 15.10.2009, 11:16
Цитата(youri @  14.10.2009,  22:57 Найти цитируемый пост)
а где будут храниться текущие points?

Один из вопросов моих, где лучше хранить, я же подумал что хорошо бы:
Цитата(ruX @  9.10.2009,  18:25 Найти цитируемый пост)
В свою очередь создать таблицу(action_id, describe) в которой номер действия action_id связан с его описанием describe.


Цитата(Hellka @  15.10.2009,  09:46 Найти цитируемый пост)
да это можно и в файле конфига, и в таблице и в массиве хранить

Вторая мысль была как раз такая же - хранить в сериализированном массиве, где есть соответствия (ид_действия->поинты,описание)

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

Автор: youri 15.10.2009, 14:29
Цитата(ruX @  15.10.2009,  11:16 Найти цитируемый пост)
Сейчас подумал ещё над тем, что возможно лучше не менять количество баллов за действие, а создавать копию действия, соответственно с другим айди, таким же описанием и другим кол-вом количеством  баллов.

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

Цитата(ruX @  15.10.2009,  11:16 Найти цитируемый пост)
Один из вопросов моих, где лучше хранить, я же подумал что хорошо бы:

храни в actions

Цитата(Hellka @  15.10.2009,  09:46 Найти цитируемый пост)
да это можно и в файле конфига, и в таблице и в массиве хранить

надо будет только рассказать модератором, в каком каталоге файлик этот лежит...

Автор: ruX 16.10.2009, 17:37
youriHellka, спасибо за ответы

решил как и посоветовали хранить actions в бд и
Цитата(ruX @  15.10.2009,  11:16 Найти цитируемый пост)
Сейчас подумал ещё над тем, что возможно лучше не менять количество баллов за действие, а создавать копию действия, соответственно с другим айди, таким же описанием и другим кол-вом количеством  баллов.


тема закрыта )

Автор: youri 16.10.2009, 18:00
на всякий случай, повторюсь: текущие points лучше хранить в actions и не создавать новую запись при изменении points. Тебе вряд ли эта дополнительная информация понадобиться. Создавать новую запись имеет смысл, если нужно будет выдавать историю изменения points для action'а или выдавать историю назначения пользователям points для некотрого action'а, когда у него было некоторое значение points

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)