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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как вы намерены определять предыдущее место для игроков, не принимавших участия в играх прошлого интервала (предыдущего обнуления)? Как намерены определять текущее место для игроков, не принимающих участие в играх в текущем интервале? Ноль побед, дата обновления одинакова.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38304929
alekseyxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр,

Game User
-- id
--winner
--loser
--date
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38304941
alekseyxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Случайно отправил.


Злой Бобр,

Game
-- id
--winner
--loser
--date

User
--id
--username
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38304951
alekseyxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621,

Да, при обновлении и нулевых результатах, честно говоря, не учел вариант. Надо уточнять этот момент.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305014
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Надо уточнять этот момент.

Лучше задачу измените. Сравнение результатов имеет смысл при одинаковых условиях для участников. Если одинаковые условия обеспечить невозможно, первое, о чем думается - количественный ценз. Скажем, результаты считаются для участников с количеством игр, большим заранее заданного. Выбрать это значение можно так, чтобы сравнение не выглядело откровенно высосанным из пальца.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305053
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekseyxxxx,

Game распиши поля, я не телепат.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305065
alekseyxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр,

Типы полей? Вот вся таблица.

Game
-- id (Integer, pk)
--winner (ForeignKey(user.id))
--loser (ForeignKey(user.id))
--date (DateTime)
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305206
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekseyxxxx--winner (ForeignKey(user.id))
--loser (ForeignKey(user.id))
--date (DateTime)
Что именно хранится в этих полях. Понятно что ИД игрока, но какая логика заполнения полей.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305342
alekseyxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр,

По действию 'окончание игры' с клиента на сервер посылается запрос. В нем айди победителя, и проигравшего. В этот момент в таблицу вставляется запись: winner_id, loser_id, ну и дата
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305400
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekseyxxxx,

Ну дык ниче менять и ненужно. Делай селект и выводи нужную инфу. Все данные у тебя уже в таблице есть. Единственное построй индекс что б отбирало быстрее.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305498
alekseyxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр,
Что значит ничего менять не нужно? Мне надо знать старое место игрока на прошедший час. Т.е. его надо хранить.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38305538
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekseyxxxxЗлой Бобр,
Что значит ничего менять не нужно? Мне надо знать старое место игрока на прошедший час. Т.е. его надо хранить.
Код: sql
1.
2.
3.
select *
from *
where * between * and *


Ну где-то так вот. У тебя ж датавремя есть, вот по нему и ставь условие.
...
Рейтинг: 0 / 0
Спроектировать систему рейтингов
    #38306082
Фотография Infernal V. Raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заняться было нечем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
-- Создание таблиц
if object_id('tempdb..#player') is not null
	drop table #player;
go
if object_id('tempdb..#change_rating') is not null
	drop table #change_rating;
go
create table #player(id_user varchar(50), score int);
go
create table #change_rating(id_rating int identity, id_user varchar(50), rt_dt datetime, rt_current int, rt_prev int);
go
-- Заполнение данными
insert into #player(id_user, score) values ('player1', 20);
insert into #player(id_user, score) values ('player2', 10);
insert into #player(id_user, score) values ('player3', 30);
go
select * from #player order by score desc;
go
-- Добавление позиций рейтинга
insert into #change_rating(id_user, rt_current, rt_dt, rt_prev)
select id_user, ROW_NUMBER() OVER(ORDER BY score desc) AS rt, getdate() as dt,
	(select max(rt_current) from #change_rating r where r.id_user = a.id_user and r.rt_dt = (select max(rt_dt) from #change_rating r2 where r2.id_user = r.id_user)) as prev_rt
from #player a;
go
-- Меняем количество очков
update #player
	set score = 100
where id_user = 'player2';
select * from #player order by score desc;
go
-- Добавление позиций рейтинга
insert into #change_rating(id_user, rt_current, rt_dt, rt_prev)
select id_user, ROW_NUMBER() OVER(ORDER BY score desc) AS rt, getdate() as dt,
	(select max(rt_current) from #change_rating r where r.id_user = a.id_user and r.rt_dt = (select max(rt_dt) from #change_rating r2 where r2.id_user = r.id_user)) as prev_rt
from #player a;
go
-- История изменения рейтинга
select r.*, (r.rt_current - r.rt_prev) change_rt 
from #change_rating r
order by r.rt_dt desc, r.rt_current asc;
go
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Спроектировать систему рейтингов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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