Я думаю многие из нас задумывались на тему реализации рейтинга в своих проектах. Как лучше сделать рейтинг того или иного объекта? Голосованием «звездочками» или же «плюс/минус один»?
Хочу рассказать вам одну историю концовкой которой являлось решение — использовать только вариант «плюс/минус один». А случилось все так: на одном из проектов было решено использовать звезды. Был создан универсальный плагин для symfony framework, в который в свою очередь был интегрирован плагин jQuery Star Ajax (кажется он так называется). Все шло хорошо, пока не понадобилось сделать рейтинг пользователей. Тут появился вопрос, а как его собственно считать? Т.е. у нас есть таблица:
Где с. о. = с. в. о. / к. в. о.. Так вот каким образом адекватно считать «Топ100 пользователей»? Если у нас к примеру следующая ситуация:
Сортируем по с. о. и получаем следующий результат
Считаю, что результат не удовлетворителен, т.к. первая и вторая позиция не равнозначны третьей. Ведь каждый новый пользователь (только что зарегистрировавшийся), который получит одну оценку — 5, будет в Топ100, а человек за которого голосовали 20 раз, но средняя оценка его 4 будет на более низкой позиции. То есть данный вариант не справедлив.
Сортируем по с. в. о., получаем:
Глядя на результат, полагаю, что не требуется даже объяснение причины по которой данный вариант отпадает без разговоров.
Я пытался использовать и двойную сортировку, но все это не приводит к желаемому результату.
Что я хотел этим сказать? Я всегда был против «звезданутого» рейтинга, но никогда не мог строго объяснить причину. Теперь могу, и объяснил. Используйте ± голосование.
P.S. Проблема актуальна, может кто предложит изящный выход из ситуации?
Хочу рассказать вам одну историю концовкой которой являлось решение — использовать только вариант «плюс/минус один». А случилось все так: на одном из проектов было решено использовать звезды. Был создан универсальный плагин для symfony framework, в который в свою очередь был интегрирован плагин jQuery Star Ajax (кажется он так называется). Все шло хорошо, пока не понадобилось сделать рейтинг пользователей. Тут появился вопрос, а как его собственно считать? Т.е. у нас есть таблица:
Средняя оценка (с. о.) |
Сумма всех оценок (с. в. о.) |
Кол-во всех оценок (к. в. о) |
Где с. о. = с. в. о. / к. в. о.. Так вот каким образом адекватно считать «Топ100 пользователей»? Если у нас к примеру следующая ситуация:
Средняя оценка (с. о.) |
Сумма всех оценок (с. в. о.) |
Кол-во всех оценок (к. в. о) |
5 |
10 |
2 |
4 |
800 |
20 |
2 |
1800 |
900 |
5 |
5 |
1 |
Рассмотрим первый вариант выбора первой топ-сотни:
Сортируем по с. о. и получаем следующий результат
Средняя оценка (с. о.) |
Сумма всех оценок (с. в. о.) |
Кол-во всех оценок (к. в. о) |
5 |
10 |
2 |
5 |
5 |
1 |
4 |
800 |
20 |
2 |
1800 |
900 |
Считаю, что результат не удовлетворителен, т.к. первая и вторая позиция не равнозначны третьей. Ведь каждый новый пользователь (только что зарегистрировавшийся), который получит одну оценку — 5, будет в Топ100, а человек за которого голосовали 20 раз, но средняя оценка его 4 будет на более низкой позиции. То есть данный вариант не справедлив.
Вариант номер два. Сумма всех оценок:
Сортируем по с. в. о., получаем:
Средняя оценка (с. о.) |
Сумма всех оценок (с. в. о.) |
Кол-во всех оценок (к. в. о) |
2 |
1800 |
900 |
4 |
800 |
20 |
5 |
10 |
2 |
5 |
5 |
1 |
Глядя на результат, полагаю, что не требуется даже объяснение причины по которой данный вариант отпадает без разговоров.
Я пытался использовать и двойную сортировку, но все это не приводит к желаемому результату.
Итог
Что я хотел этим сказать? Я всегда был против «звезданутого» рейтинга, но никогда не мог строго объяснить причину. Теперь могу, и объяснил. Используйте ± голосование.
P.S. Проблема актуальна, может кто предложит изящный выход из ситуации?