@otachkin
Программист php

Как лучше хранить историю начисления баллов в сервисе обучения?

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

Вопрос состоит в том, как лучше хранить историю начисления баллов.

Я думаю создать таблицу scores со следующими полями:
id;
user_id;
table_name (для хранения имени таблицы, например lessons, чтобы понимать, за что именно начислены балы);
element_id (id записи в таблице table_name );
scores (количество балов);
date_create (дата и время начисления очков

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

Подскажите, подходит ли данный алгоритм решения вопроса, или есть более грамотное решение?
  • Вопрос задан
  • 2299 просмотров
Пригласить эксперта
Ответы на вопрос 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Лучше всего хранить в 2х таблицах:
1) количество балов в настоящий момент - можно хранить полем в таблице users например
2) таблица истории транзакций (начислений/списаний) -
transaction_id
user_id
scores
date_create
...какие то поля обоснования за что, итд...
Ответ написан
Комментировать
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Я бы рекомендовал во первых ввести заголовок. Скажем история выглядит примерно так

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

Очки я бы суммировал в отдельной таблице в профиле пользователя, лучше потратить лишнее время при инсерте, чем 100500 раз суммировать.

Ну и в принципе можно еще извернутся и сделать основную таблицу, и ее потомков под каждый table_name.
Тогда можно сделать скажем insert into scores_by_lessons, select * from scores by_lessons
ну и в любой момент select * from scores для общего журнала. Тут уже вопрос предпочтений)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы