2010-12-13 48 views
0

我正在開發一個網站,其中有200.000頁。還有一個瀏覽部分,顯示最受歡迎,評分最高的文檔。然而,這一部分幾周後將在發佈後幾乎變成靜止。所以我也想實現一個過濾系統,它將顯示今天的本週的本月最受歡迎的項目,就像youtube一樣。使用日/周/月篩選受歡迎的項目

就像這樣:

http://www.youtube.com/videos?c=2

我應該如何實現這個功能呢?我是否需要另一張桌子,每天有一個新的條目供每個文檔使用?

文檔ID,日期,VIEW_COUNT,評級

因此,我將用一天取得今天的過濾行,或者使用周計算,每週(7行)進行過濾?這似乎沒有效率。你有什麼建議嗎?

我正在使用LAMP堆棧。

感謝,

+0

請記住安全問題,例如,如果您不希望單個用戶能夠(例如)每秒生成1000個視圖。祝你好運實現一種方式來阻止一個堅定的攻擊者,儘管.. – 2016-09-14 06:20:48

回答

0

我想我會計算代碼日期的,然後將它們作爲參數傳遞,你所使用的SQL。

1

假設你爲表中的記錄添加時間戳記,你應該能夠放置一個where子句,將時間戳限制到你想要的任何時間範圍。

您可以緩存結果,尤其是較長的結果足夠長的時間,以使請求無關緊要。

編輯

但也許今天你的意思是最流行的,而不是最流行這是今天加入?

在這種情況下,我沒有答案。

1

最直接的方法是每次在recent_views(what, when)中顯示資源時保存時間戳和資源ID。可以使用適當的WHERE子句(如WHERE when > $beginOfPeriod AND when < $endOfPeriod)創建每日/每週/每月圖表。

由於性能方面的原因,您可以每晚彙總這些值,將這些總和保存在單獨的表中,如daily_views(what, sum)並截斷源表。

0

我會用編譯器來做。考慮到流量和響應時間,Youtube可能也會這樣做。

原理很容易理解。您在page_view表中記錄每個視圖或評分。您定義編譯期間(小時,每日,每週,每月)。每次你打的好時機(例如:在一天結束)時,你執行的編譯器,它本質上執行一個查詢一拉......

SELECT * FROM page_view WHERE date > $from_date AND date < $to_date 

...和存儲結果。這可能在cron工作中效果更好。

下一次需要顯示信息時,您可以獲取存儲的結果並顯示它,而無需重新計算。您可以使用多種存儲方法:MySQL表(例如:page_view_compiled),memcached等。