Я работал над функцией моего приложения для реализации списка лидеров - в основном, составление рейтинга пользователей в соответствии с их оценкой. Я в настоящее время отслеживаю счет на индивидуальной основе. Я думаю, что эта таблица лидеров должна быть относительной, а не абсолютной, то есть вместо того, чтобы иметь 10 лучших пользователей с наибольшим количеством баллов по всему сайту, это 10 лучших среди друзей в сети пользователя. Это кажется лучше, потому что у всех есть шанс быть # 1 в их сети, и есть форма дружеского соревнования для тех, кто интересуется такими вещами. Я уже храню счет для каждого пользователя, поэтому задача состоит в том, как эффективно вычислить рейтинг этого счета в режиме реального времени. Я использую Google App Engine, поэтому есть некоторые преимущества и ограничения (например, IN [массив]), запросы выполняют подзапрос для каждого элемента массива, а также ограничены 30 элементами на оператор
Например
1-й Джек 100
2-й Иоанн, 50
Вот подходы, которые я предложил, но все они кажутся неэффективными, и я подумал, что это сообщество может придумать что-то более элегантное. Я чувствую, что любое решение, вероятно, будет сделано с помощью cron, и что я буду хранить ежедневный ранг и порядок списков для оптимизации операций чтения, но было бы здорово, если есть что-то более легкое и в реальном времени
- Потяните список всех пользователей сайта, упорядоченных по счету.
Для каждого пользователя выберите своих друзей из этого списка и создайте новый рейтинг.
Сохраните звание и порядок списков.
Обновлять ежедневно.
Минусы - если я получу много пользователей, это займет вечность
2a. Для каждого пользователя выберите своих друзей и для каждого друга выберите балл.
Сортировать этот список.
Сохраните звание и порядок списков.
Обновлять ежедневно.
Запишите последнюю позицию каждого пользователя, чтобы существующий список можно было использовать для повторного заказа на следующее обновление, чтобы сделать его более эффективным (может сэкономить время сортировки)
2b. То же, что и выше, за исключением того, что вычисляются только ранги и порядок списков для людей, чьи профили были просмотрены в последний день
Минусы - рейтинг актуален только для 2-го лица, просматривающего профиль