關於點擊排行榜的數據庫設計的一點心得

        最近在作一個項目,忽然遇到了一個問題就是須要實現點擊數的排行榜。剛開始想的時候感受挺簡單的,可是在設計數據庫的時候才發現,其實並不像想象中那麼簡單。如今就把這個過程寫下來。數據庫

       一開始想的時候,就是在內容表裏添加一個字段,級點擊數,而後每次都點擊都加1,取出來的時候再按照這個字段逆序查出就好了,但是後來忽然發現不對勁,這樣子只能是得出內容從發佈到目前的點擊數,這樣字的話侷限性很大,由於這樣子的話,在排行的時候明顯先發布的內容有必定的優點,沒法真正反映出最近比較熱門的內容,這種排行實際意義不大,由於沒法爲用戶提供必定的指引做用。性能

        就這樣第一種想法宣告失敗,後來又有人提供一種想法給我,大致上是這樣的,爲每一個內容添加7個字段,每一個字段記錄一天的點擊數,這樣就能夠記錄最近7天的點擊數,天天修改一個字段,已累計就能夠得出最近一週的點擊排行,當時聽了以後,感受這種作法太過極端了,雖然這樣能夠解決必定的問題,可是這樣的話拓展性很差,這樣只是針對一週的排行,若是忽然改成一個月的排行,一年的排行,就沒轍了,難道加30個356個字段嗎?學習

        繼續研究,忽然閃過一個念頭,排行榜的側重點在於時間,每週每個月的排行是一些特例,能夠從通常狀況出發,這樣得出通常狀況再應有到特例中就能夠解決問題了,因此從時間入手,想到了一種方法是:新建一個表經過內容id外鍵到內容表,這個表的結構是:(id     時間      內容Id     點擊數 )四個字段,記錄的是每一個內容天天的記錄數,以後根據時間段累計得出排行設計

最後查找的排行是it

select  a.title ,c.hit from  date

(SELECT TOP 10 [content],sum(b.hit) as hitselect

  FROM  contenthit b方法

  where b.date < '2012-03-05 00:00:00' im

  GROUP BY b.[content]數據

  order by SUM(b.hit) desc)c left join content a on c.content = a.id order by c.hit desc

經過這樣的語句就能夠讀出,一段時間內的點擊排行了。

        固然,在這裏只是實現功能,並未考慮性能,還有不少不足的地方,或許還有更好的方法,歡迎你們提出意見和建議,一塊兒交流學習。

相關文章
相關標籤/搜索