Я пытаюсь запрограммировать плагин для bbPress (программное обеспечение форума с открытым исходным кодом), который будет работать аналогично Hacker News (http://news.ycombinator.com/).
)
В частности, я хочу отсортировать порядок разделов форума (bbPress называет их "темами"), используя следующий алгоритм:
sort_value = (p - 1) / (t + 2)^1.5
where p = total votes for each topic from users
t = time since submission of each topic in hours
Я хотел бы иметь возможность сортировать темы по этому вычисленному sort_value, используя MySQL.
Соответствующие поля в таблице topics
выглядят примерно так:
topic_id bigint(20)
topic_start_time datetime
Это в воздухе, но я подумал, что будет еще одна таблица, в которой хранятся отдельные голоса пользователей, поэтому мы сможем узнать, проголосовал ли пользователь уже. А в другой таблице будут храниться текущие итоги голосования по каждой теме. Может быть, в этой таблице будет еще одно поле, в котором будет храниться последнее вычисленное значение sort_Value?
Чтобы быть точным на 100%, значение sort_value должно обновляться после каждого нового голосования. Однако это добавит слишком много нагрузки на сервер базы данных, особенно если мы попытаемся обновить ВСЕ темы. Если нам нужно, мы можем ограничить набор данных, только вычисляя sort_value для последних X # тем. Мы также можем ограничить загрузку, только периодически обновляя sort_value (например, каждые 5 минут с помощью задания cron).
Эти сочетания клавиш могут сделать нагрузку приемлемой, но я бы предпочел более элегантное решение, которое могло бы масштабироваться лучше.
Как бы вы это структурировали? : -)