Как реализовать алгоритм ранжирования на моем сайте для сортировки данных базы данных? - PullRequest
4 голосов
/ 04 ноября 2010

Я хочу внедрить систему ранжирования на веб-сайте, над которым я работаю, и решил использовать алгоритм Hacker News.Я выбрал этот алгоритм просто потому, что он был описан здесь .

Я искал этот код Python (язык, который я использую для создания своего сайта) и не мог понятькак я бы это реализовал.

def calculate_score(votes, item_hour_age, gravity=1.8):
    return (votes - 1) / pow((item_hour_age+2), gravity)

Учитывая таблицы:

posts:
    id | title | time_submitted

votes:
    id | postid | userid | score

Как бы я вытащил данные из базы данных?Идеальным решением (наиболее эффективным) было бы создание запроса MySQL для получения 10 лучших постов, ранжированных с использованием алгоритма.Но, учитывая, что в Hacker News это реализовано в Arc, я думаю, что они извлекают все посты, а затем запускают их с помощью алгоритма их ранжирования.

Reddit также приходит на ум для этого ... Они используютсхема нереляционной базы данных, поэтому я предполагаю, что они, подобно Hacker News, выполняют ранжирование в своем коде, а не в базе данных.

Как бы вы это реализовали?

РЕДАКТИРОВАТЬ: В одном сообщении может быть много голосов, так как я хотел бы записать, какой пользователь за какой пост проголосовал.

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Вы можете использовать необходимые данные в предложении ORDER BY.

SELECT p.id, p.title, p.time_submitted, SUM(v.score) as num_votes 
  FROM posts p, votes v
 WHERE v.postid = p.id
GROUP BY p.id
ORDER BY 
   (SUM(v.score) - 1) / POW(TIMESTAMPDIFF(HOUR,p.time_submitted,NOW()) + INTERVAL 2 HOUR, 1.8) DESC
LIMIT 100
0 голосов
/ 04 ноября 2010

В вашем случае число голосов будет возвращено следующим образом:

SELECT count(*) FROM votes WHERE postid=<THE POST'S ID>;

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

Возраст элемента в часах - это просто текущее время, вычтенное из предоставленного времени:

SELECT HOUR(TIMEDIFF(NOW(), time_submitted)) FROM posts WHERE id=<THE POST'S ID>;

Это также можно сделать полностью в SQL:

SELECT id FROM posts ORDER BY (((SELECT count(*) FROM votes WHERE postid=posts.id) - 1) / MOD(HOUR(TIMEDIFF(NOW(), time_submitted) + INTERVAL 2 HOURS), <GRAVITY>)) LIMIT 10;
...