Задать вопрос
@akula22

Нужен совет по реализации статистики?

Добрый день, можете подсказать по реализации:
Есть юзер, который играет в разные игры на сайте. Мне надо вести статистику его побед поражений, рейтинга и иметь возможность выводить это по разным играм.
Задача там конечно сложнее, попробую обрисовать в двух словах
Игрок вносит результат на сайте, и нужно сделать
1. Сделать движение его по турнирной сетке.
2. Записать как-то в статистику победа поражение ничья, рейтинг статистика, так чтоб в профиле потом можно было посмотреть его достижения по разным играм.
3. Произвести выдачу наград, например за 100ую победу или типа того.

Как мне организовать базу данных
на данный момент есть таблицы user и user_profile, думал сделать user_stat но как туда записывать.... каждую игру? или создать значение при создание юзера и потом ее только апдейтить, но как тогда считать стату по определенной игре.
Сайт делаю на Yii2
  • Вопрос задан
  • 283 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
rim89
@rim89
программист-велосипедист
Отдельная таблица:
stat_id
user_id
game_id
user_vin
user_lost
user_reting
И потом Join куда надо
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
, думал сделать user_stat но как туда записывать

Сделайте user_stat и записывайте каждую игру.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
user: id, name
clan: id, name
game_result: id(u_int), user_id(u_int), opponent_id(u_int), game_id(u_int), isWinner (bool), score(longint), timestamp(timestamp), parent_game_result(u_int), user_clan(u_int), opponent_clan(u_int)
Ответ написан
Комментировать
knetesin
@knetesin
Шпион
вы можете инкриментить счетчики у юзера например в таблице user_game_stat(тригерами или в бизнес логике когда становится известен результат)
структура например может быть такая (id, user_id, game_type, win_count, lost_count, total_games) - вы можете сюда добавить поле даты, чтобы у была инфа по стате юзера за какой то промежуток времени (например за сегодняшний день, или за вчерашний, или вообще периоды по 4 часа)

1. движение в каком виде? изменение позиции по отношению к прошлому дню? вообще за каждый день относительно всех ?
- в первом случае вам достаточно будет добавить поле с позицией за прошлый период и за текущий и агрегировать данные раз в N период
- во втором немного сложнее логика, но можно в user_game_stat хранить доп поле с рейтингом на момент времени, в итоге вы запросто сможете понять позиции любых игроков на момент времени в игре (можно запросто получить топ за любой промежуток в рамках минимального периода) и из этих же данных можете строить реальный топ на данный момент (т.е своеобразный агрегат, можете и конкретно по каждой игре, но когда будет большой нагруз в итоге уйдете в агрегаты по промежуткам)
* всё зависит от того что конкретно вам надо, возможно даже смесь обоих вариантов будет целесообразнее, зависит от задач

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

3. счетчики по игре?(проверять в момент изменения счетчика или раз во N времени?) можно агрегировать данные раз в час и смотреть, награды это вообще отдельная история :)

p.s возможно даже mysql не лучшее решение для вас, но вообщем для адекватной оценки мало информации о задаче, о нагрузке, но надеюсь в целом идея из написаного выше ясна ;) :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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