簡體   English   中英

人氣算法

[英]Popularity Algorithm

我正在創建一個類似digg的網站,它將有一個不同類別的主頁。 我想顯示最受歡迎的提交。

我們的評級系統只是“喜歡”,比如“我喜歡這個”等等。 我們基本上希望每次顯示“喜歡”次數最多的提交。 我們希望有三個類別:歷史人氣,上周和最后一天。

有人知道幫助的方法嗎? 我不知道如何做到這一點並使其高效。 我認為我們可以使用某種類型的cron-job每10分鍾運行一次並且在過去的10分鍾內吸收喜歡的數量......但是我被告知這樣效率很低?

救命?

謝謝!

通常,Digg和Reddit類似的站點在提交日期之前而不是投票時間。 這種方式只需要一個簡單的SQL查詢來查找X時間段的頂級提交。 這是一個偽查詢,使用此方法查找過去24小時內最受歡迎的10個鏈接:

select * from submissions
 where (current_time - post_time) < 86400
 order by score desc limit 10

基本上,這個查詢說找到所有提交的文件,其中從現在到發布的時間之間的秒數小於86400,這在UNIX時間是24小時。

如果您真的想在X時間間隔內測量受歡迎程度,則需要將每個投票的帖子和時間存儲在另一個表中:

create table votes (
 post foreign key references submissions(id),
 time datetime,
 vote integer); -- +1 for upvote, -1 for downvote

然后你可以生成一個X和Y次之間最受歡迎的帖子列表,如下所示:

select sum(vote), post from votes
 where X < time and time < Y
 group by post
 order by sum(vote) desc limit 10;

從這里開始,你只是一個跳躍,跳過和內部聯接,而不是將后期數據與返回的id綁定。

你有一個像樣的數據庫設置? 我們能否聽到您的CREATE TABLE詳細信息和索引? 假設設置合理,數據庫應該能夠足夠快地提取您需要的計數以滿足您的需求! 例如(索引和鍵的網絡,在某種程度上取決於您正在使用的數據庫引擎),給出兩個表:

CREATE TABLE submissions (subid INT, when DATETIME, etc etc)
CREATE TABLE likes (subid INT, when DATETIME, etc etc)

你可以獲得前33個最受歡迎的提交作為

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

以及在一定時間范圍內投票的人

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
WHERE likes.when BETWEEN initial_time AND final_time
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

如果你在likes中存儲“投票”(正面或負面),而不是僅將每個條目計為+1 ,你可以簡單地使用SUM(likes.vote)而不是COUNT

對於像alltime,lastweek這樣的穩定​​列表,因為它們不應該變得非常快,所以我認為你應該將列表保存在緩存中,到期時間大約是1天或更長。

如果您實時關注正確的計數,則可以通過將頁面與緩存中的最低頁面進行比較來檢查每個頁面視圖。

您需要做的就是關心緩存和實際數據庫之間的同步。

thethanghn

查詢順序是當前時間的某些功能可能會成為真正的性能問題。 如果您可以按日歷時間進行操作並在人們投票時更新每個桶的分數,事情會變得更加簡單。

為了完成nobody_的答案,我建議您閱讀文檔 (如果您當然使用MySQL)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM