Я могу придумать несколько вариантов от верхней части головы:
-
Как вы уже упоминали, суммируйте очки репутации, полученные за время, и подсчитайте на них процентильные ряды.
-
Отслеживайте обновления до репутации_total на ежедневной основе - так что у вас есть таблица с user_id, date, reputation_total.
-
Добавьте несколько новых столбцов в таблицу пользователей (репутация_total, репутация_total_today, репутация_total_last30days и т. Д.) Для каждого временного диапазона. Вы также можете нормализовать это в отдельной таблице (репутация_трега), чтобы предотвратить добавление нового столбца для каждого промежутка времени, который вы хотите отслеживать.
Вариант №1 является самым простым, но, вероятно, он будет медленным, если у вас много строк в таблице транзакций вашей репутации - он не будет масштабироваться очень хорошо, особенно если вам нужно рассчитать их в реальном времени.
Вариант № 2 потребует большего времени на хранение (одна строка на пользователя в день), но, вероятно, будет значительно быстрее, чем напрямую запрашивать таблицу транзакций.
Вариант № 3 менее гибок, но, скорее всего, будет самым быстрым вариантом.
Оба варианта 2 и 3, вероятно, потребуют периодического процесса для расчета итогов на ежедневной основе, так что это тоже нужно учитывать.
Я не думаю, что какой-либо вариант обязательно является лучшим - все они связаны с различными компромиссами скорости / пространства / сложности / гибкости. То, что вы делаете, в конечном итоге будет зависеть от требований для вашего применения.