Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Спроектировать систему рейтингов / 25 сообщений из 37, страница 1 из 2
19.06.2013, 17:09
    #38303619
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Здравствуйте. Есть таблица пользователей(200-300 тыс записей) и таблица Игр. Нужно показывать топ10 игроков по количеству выигранных игр. И при этом показать изменение позиции в рейтинге по сравнению с прошедшим часом (Рейтинг обновляется раз в час). Подскажите как лучше сделать? Хранить для каждого пользователя старую позицию в рейтинге, тогда получается каждый час очень большой апдейт. Как лучше хранить все эти места.
Спасибо.
...
Рейтинг: 0 / 0
19.06.2013, 17:14
    #38303638
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxполучается каждый час очень большой апдейт.
Заведи отдельную таблицу top10 и апдейт будет маленьким.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2013, 17:19
    #38303655
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
А как показать изменение места игрока, которого не было в прошлый раз в топ10?
...
Рейтинг: 0 / 0
19.06.2013, 17:33
    #38303680
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxА как показать изменение места игрока, которого не было в прошлый раз в
топ10?
С пустым старым местом. В чём проблема-то? Не слышал о LEFT JOIN?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2013, 17:38
    #38303688
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Поясните, не понимаю может сути. У меня человек не входил в таблицу top10. За час он туда попадает, мне надо показать сколько на сколько позиций он поднялся. Т.е. знать старое место в рейтинге час назад.
...
Рейтинг: 0 / 0
19.06.2013, 17:44
    #38303701
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxмне надо показать сколько на сколько позиций он поднялся
А, т.е. ты хочешь показать, что он поднялся с 1000-го места до 5-го?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2013, 17:54
    #38303723
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxx,

Или поле в основной таблице и хранить прошлое место, или отдельная таблица. Примерно посчитай какой топ изменяется, т.е. максимум мест на которое может подняться игрок за час. Храни соответственно топ100 или топ1000 (не думаю что будет больше). Обновляй этот топ а потом из него выбирай свой топ10.
...
Рейтинг: 0 / 0
19.06.2013, 18:06
    #38303754
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Dimitry Sibiryakov,
Да хочу показать именно это.
...
Рейтинг: 0 / 0
19.06.2013, 18:07
    #38303756
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Злой Бобр,
Именно так хотел сделать, просто я забыл еще один важный момент. Необходимо пользователю также показывать под топ10 его текущее место. И изменение его позиции с прошедшим часом.
...
Рейтинг: 0 / 0
19.06.2013, 18:19
    #38303782
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxДа хочу показать именно это.
Тогда тебе не остаётся ничего другого кроме как update всех 300к записей. Выбирай СУБД,
которой это не делает проблем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2013, 18:25
    #38303796
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Dimitry Sibiryakov,
Думаю использовать редис отдельно для рейтингов. Делать выборку с LEFT JOIN каждый час, айди пользователя, и его количество очков записывать в редис. Такой апдейт происходит за 2-3сек. Обновление раз в час. Правильная ли такая архитектура, или можно придумать что нить еще)
...
Рейтинг: 0 / 0
19.06.2013, 18:35
    #38303811
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxДумаю использовать редис отдельно для рейтингов.
Для использования в проекте сразу двух СУБД нужны весьма веские основания.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2013, 20:36
    #38303917
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxЗлой Бобр,
Именно так хотел сделать, просто я забыл еще один важный момент. Необходимо пользователю также показывать под топ10 его текущее место. И изменение его позиции с прошедшим часом.
Ну я ж вроде по русски написал. Храни в отдельной таблице Топ1000 к примеру.
id_user, position1, position2 - ну это грубо так, я ж незнаю что там и как у тебя.
Если непонятно - говори что именно. А то я не телепат.
...
Рейтинг: 0 / 0
19.06.2013, 21:04
    #38303931
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Злой БобрХрани в отдельной таблице Топ1000 к примеру.
....а остальным 199 тысячам игроков отвечай "хрен вам, а не рейтинг, вы в полной жопе".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2013, 21:40
    #38303955
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Dimitry Sibiryakov....а остальным 199 тысячам игроков отвечай "хрен вам, а не рейтинг, вы в полной жопе".
Ну да. По уму при выигрыше должно увеличиваться на 1 значение какого-то поля. По нему и отбирать. А хранимкой которая там раз в час будет запускаться делать срез этого поля.
Но опять таки - значение поля может каждый день (10 дней, месяц, год) обнуляться. Не думаю что кто-то станет держать значения с начала времен. Поэтому все упирается в детали. Не зная деталей сложно дать однозначный ответ. А может там ведется статистика каждой игры и проигрыши тоже логируются. А может .... В общем - нехочу гадать. Исходя из первого поста указанная реализация оптимальна. Но если нам что-то недосказали - это уже проблемы ТС.
...
Рейтинг: 0 / 0
20.06.2013, 01:02
    #38304038
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Злой Бобр,
Поясняю, пользователь щелкает на кнопку 'рейтинг' - у него открывается таблица из 10-ти человек, которые имеют больше всех побед. У каждого из 10-ти показывается изменение позиции с прошлым разом. Вот. И еще мне надо показать позицию текущего пользователя, он может быть 150 093 в рейтинге. И при этом у него также показать изменение позиции с прошлым разом.

Да, рейтинг, обнуляется каждую неделю, но ведь чтобы достать рейтинг текущего пользователя, мне надо знать рейтинг всех. А не топ1000.
...
Рейтинг: 0 / 0
20.06.2013, 12:55
    #38304622
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxтогда получается каждый час очень большой апдейт.
Большой апдейт - это двести-триста миллионов. Да и то не очень большой.

Описанная задача вызывает вопросы с постановочной точки зрения, но допустим, что оно так. Реальная проблема в вашем расчёте будет не в объёме обновлений, а в их согласованности. Судя по игрокам и пользователям, речь идёт о вебе и соответственно MySQL, и потребуется предпринять определённые усилия для того, чтобы у вас в рейтинге не оказалось два первых места или игрок на двух местах сразу (или на одном, но с дыркой на прежнем месте).

Если Вас волнуют именно обновления, никто не мешает заменить их insert-ами, храня место игрока отдельно от игрока. Но смысл в этом имхо будет только если СУБД неэффективно выполняет операцию update, поскольку для согласованности всё равно скорее всего придётся блокировать всю таблицу на время расчёта.
...
Рейтинг: 0 / 0
20.06.2013, 13:07
    #38304663
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
softwarerдля согласованности всё равно скорее всего придётся блокировать всю
таблицу на время расчёта.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.06.2013, 13:26
    #38304707
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
Рейтинг, alekseyxxxx, это как правило интегральная оценка по нескольким критериям. Таблица результатов - это не рейтинг, это таблица результатов. Какой идиот поставил вам задачу сформулированным вами образом, остается только догадываться.

> У каждого из 10-ти показывается изменение позиции с прошлым разом.

Прошлым разом чего? Подсчета очков? Определенного количества сыгранных игр? Игровым днем? Турниром? При проектировании основной источник проблем - кривая постановка задачи.

> Да, рейтинг, обнуляется каждую неделю

Клинический случай.
...
Рейтинг: 0 / 0
20.06.2013, 13:48
    #38304763
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
guest_20040621,

Ну рейтинг или таблица результатов, мне не важно как назвать) Опишу еще раз подробно. Этот 'рейтинг' идет неделю. Т.е. показывает победивших наибольшее количество раз на неделю. Зачем это сделано, я сам не могу сказать, но задача у меня такая. Т.е. в понедельник в 0:00 этот рейтинг обнуляется и начинается новый. Пользователи в приложении должны видеть свои позиции. Позиции обновляются не в реалтайме, а один раз в час. Т.е. раз в час пересчитывать количество побед и обновлять таблицу, и показывать их изменение позиций по сравнению с прошлым пересчетом. Вообщем каждый пользователь должен видеть топ10 и свою позицию с изменением. Вообщем задача такая:)Надеюсь понятно, что требуется.
...
Рейтинг: 0 / 0
20.06.2013, 14:30
    #38304856
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
> Ну рейтинг или таблица результатов, мне не важно как назвать

Начните с точных формулировок. Увидите, насколько проще станет жить.

> показывает победивших наибольшее количество раз на неделю

Ну, и будете вы каждый час апдейтить всю таблицу. Спросите у умника, который формулировал задачу, что делать с пользователями с одинаковым количеством побед? Считать результаты личных встреч? Что делать, если личных встреч не было?

Реально идиотская задача.
...
Рейтинг: 0 / 0
20.06.2013, 14:34
    #38304867
alekseyxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
guest_20040621,

В случае одинаковых результатов, выше будет тот, кто первее набрал этот результат. В таблице игра есть поле 'дата', придется по ней еще делать сортировку.
...
Рейтинг: 0 / 0
20.06.2013, 14:35
    #38304872
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxxХранить для каждого пользователя старую позицию в рейтинге, тогда получается каждый час очень большой апдейт. Как лучше хранить все эти места.Можно не апдэйтить 300 тыщ записей, а раз в час перезаливать отдельную табличку для этого (два поля, ИД+рейтинг). Это будет быстро, пару секунд.
...
Рейтинг: 0 / 0
20.06.2013, 14:57
    #38304915
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
alekseyxxxx...Пользователи в приложении должны видеть свои позиции. Позиции обновляются не в реалтайме, а один раз в час. Т.е. раз в час пересчитывать количество побед и обновлять таблицу, и показывать их изменение позиций по сравнению с прошлым пересчетом. Вообщем каждый пользователь должен видеть топ10 и свою позицию с изменением.
Тогда вариант с отдельной таблицей отпадает. Покажите структуру базы.
...
Рейтинг: 0 / 0
20.06.2013, 15:02
    #38304928
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спроектировать систему рейтингов
> выше будет тот, кто первее набрал этот результат

Как вы намерены определять предыдущее место для игроков, не принимавших участия в играх прошлого интервала (предыдущего обнуления)? Как намерены определять текущее место для игроков, не принимающих участие в играх в текущем интервале? Ноль побед, дата обновления одинакова.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Спроектировать систему рейтингов / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]