2010-09-01 36 views
5

我想知道如何在我的數據庫上最好地實現「最受歡迎的」功能(如youtube)。「最受歡迎」功能數據庫的實現

讓我來解釋一下「最多觀看」功能更好一點: 基本上我想列出從這天/周/月訪問最多的網頁/視頻/等,見 http://www.youtube.com/charts/videos_views爲例。

所以我想知道如何最好地實現這個功能,因爲我可以想到許多方法,但他們都有他們的+和 - 。

另外我也很想聽到各種程序員對其他程序員的想法的評論。另外我想就這個話題開始一個很好的對話。

Ps。我特別關注如何計算時間,比如在本月最受關注的時間,沒有一個巨大的表格用日期時間保存每一個視圖。任何想法是受歡迎的。
Pps。我使用Mysql和PHP,這兩個額外提示非常受歡迎。

回答

3

具有以下表: 1.觀點 2. views_hourly_summary 3. views_daily_summary 4. views_monthly_summary 5。views_alltime_summary

必須按照以下時間間隔一個cron作業運行:

  1. 每隔一小時運行,preaggregate從意見表時間的看法和保存預先聚集的結果在views_hourly_summary表,還更新views_alltime_summary表

  2. 在每天結束時運行,並preaggregate從小時表日的意見,並保存預先聚集的結果在views_daily_summary表

  3. 在everymonth結束運行,preaggregate從小時表日的意見,並保存預先聚集的結果在views_daily_summary表

下一個取結果時,你將不得不做一些數學如下:

  1. 例如,你希望獲取的最後4小時的意見,你會從小時表中提取整整3點小時的數據,併爲剩餘的數據從意見表中提取,如下所示:

    選擇item_i d,總和(視圖)作爲視圖 從views_hourly_summary 其中的concat之間小時(左(現在的() - 間隔3小時,14),'00:00' )和CONCAT(左(現在的(),14),'00 :00' ) 組由ITEM_ID

    工會

    選擇ITEM_ID,計數(1)的觀點 從視圖 其中間(現(日期時間) - 間隔4小時)和CONCAT(左(現在的() - 間隔3小時,14),'00:00 ') 或日期時間>的concat(左(現在的(),14),'00:00') 組由ITEM_ID

0

關閉我的頭頂,我會有一個ItemViews表,它將視圖數量映射到一個項目ID(假設只有一個項目類型)。該表可以有2列:ItemId和ViewCount。當一個新功能收到它的第一個視圖時,我會在該表中插入一個新行並將ViewCount初始化爲0.然後,每次檢測到新視圖時,我都會在該行中增加計數器。

我然後可以從該表中計算統計數據。如果存在類別的概念(如在Youtube中),我可以用ItemId加入類別ID,並按照這種方式組合我的查看次數。

+0

是的,這是一個簡單的想法,但你最終有一個巨大的表格,例如說,如果我有1個億頁,每個頁面都有類似10K的觀點則1mx10k = 100億行。現在想象一下計算每一行的時間,以獲得本月最多的觀看次數。我只需要一整臺服務器,肯定會有一個更簡單的方法。 – StfnoPad 2010-09-01 10:37:33

+0

我認爲重點是你只爲新的頁面/項目做一個插入。在那之後,你只需增加計數器 - 所以你只能得到'x'行 - 其中'x'是查看的項目數。如果你有100萬個物品,但只有10K個物品,你只能有10K個物品,甚至沒有物品。進一步節省。一個好主意和我想在我的解決方案中實現的東西。 – 2010-09-01 10:45:17

+0

是的,但如果你只有一個計數器,那麼你不能計算本週最多觀看,因爲你沒有日期和時間信息。我確信必須有一種簡單的方法,否則我不知道YouTube視頻是如何處理它們的視頻和視頻的。總之,很多謝謝你們。 – StfnoPad 2010-09-01 11:04:04

1

首先,我試圖通過使用cookie跟蹤用戶,爲他們提供唯一的ID作爲訪問和訪問。這應該有助於識別。

我會嘗試移動邏輯以將最常查看的項目更新到網站代碼庫之外。所以這只是表示每個Web請求都將訪問信息發佈到消息隊列中 - 可能包括時間/日期,正在查看的項目,來自Cookie的跟蹤信息以及可能的IP地址/請求標頭。

然後,我會設置一個服務來讀取該隊列並處理信息。這將允許您在不影響站點的情況下升級/修改該邏輯。你可能會想要處理多個刷新等,以阻止人們搞亂結果 - 無論是有意或無意的。同樣,通過從主站點抽象這種處理,您不會減慢頁面請求時間 - 您可以根據自己的喜好制定邏輯來確定/更新項目視圖。

1

簡單的方法讓我記住,對於加載該頁面的用戶的每個唯一IP,將您的表上的ViewCount字段值遞增1。

+0

只需使用IP地址,如果您的網站被公司代理人等多人訪問,您將被限制爲每個公司登錄一個請求。 – 2010-09-01 10:15:01

+0

是的,但您無法及時計算「最受歡迎」不保存任何時間信息。所以通過這樣做,我不能計算本週最受歡迎的例子。 – StfnoPad 2010-09-01 10:30:52

+0

哦,是的,時間信息也是需要的。這是非常簡單的方法思考只需10秒鐘:))無論如何,這將導致正確的做法。 也只檢查唯一的IP是不夠的,cookie信息是好的。因此,將所有這些添加到解決方案中,唯一的IP,cookie,訪問時間,還有隊列來更新數據庫,並且所有信息都在單獨的表格中,而不僅僅是字段。它看起來已經非常複雜了。 – apprich 2010-09-01 10:50:15

0

這是一個非常簡單的解決方案。這不是完全最佳的,但可以改善,以更好的沒有太多的悲傷。

基本上只是時間劃分成間隔,說每次5分鐘。在db中記錄一列videoID,一列標識特定時間間隔,然後一列記錄視頻在該時間間隔內獲得的視圖數量。然後,如果您想知道某個視頻在最後一天獲得了多少觀看次數,那麼只需將所有那些時間間隔/時間戳大於一天前的內容相加即可。這並不是完全最佳的,因爲最後的時間間隔只會被視圖部分填滿,根據計算時間的不同,這會給您一些額外時間或少一點時間的意見。但對於需要兩秒鐘完成的解決方案來說,這已經足夠了。要計算年度視圖,請執行相同的操作,除非使用完全獨立的表格(時間間隔爲1天),以便您不必存儲數據並總計超過100,000個五分鐘間隔即可創建一整年。

只要確保有[視頻ID,時間戳]複合索引,使您可以快速總結意見。