搜尋

首頁  >  問答  >  主體

mysql - 如何设计一个“已读”系统?

首页内容源全部用户是一致的,是若干新闻
每个用户点开一个新闻后,该新闻将标记为“已读”,该用户再刷新首页这条新闻就在首页不存在了,也就是说首页仅存在用户未读过的新闻

那么这样的数据库表结构应如何设计?
每个用户首页列出新闻的 SQL 语句应该是怎样的?

(主要的问题并不是如何设计表结构来储存用户“已读”的新闻,而是首页如何根据用户已读的新闻列出每个用户不同的首页内容,即首页 SQL 应该是怎样的)

伊谢尔伦伊谢尔伦2864 天前686

全部回覆(5)我來回復

  • PHPz

    PHPz2017-04-17 13:15:35

    這個問題是一個很綜合的問題,不是單靠 SQL 就能很好解決的(雖然也能)。

    依你的思路分析技術可行性

    新聞和每個人的已讀狀態,其實是一張二維表,橫縱座標分別是新聞ID和用戶ID,這張二維表的大小是新聞數和用戶數的乘積,那是相當的大。

    所以,從建表來說,不管你是建一張新聞與用戶的狀態關係表,還是為用戶建一張已讀新聞狀態表或者為新聞建一張已讀用戶狀態表,都不是很好的方案。

    • 如果是新聞用戶狀態關係表,假如有10,000用戶,1,000新聞,這張表的數據在最大的情況會有10,000,000筆記錄。

    • 建用戶的新聞狀態表和建新聞的用戶狀態表都一樣,需要個巨大的字段,一般可能是TEXT和BLOB,非常不利用搜尋。

    在這種情況下,即使使用 No-SQL,都難以解決問題。所以需要變通。

    分析合理的需求

    首先一個問題,你顯示在首頁上的新聞可能會顯示很舊的新聞麼?換句話說,如果所有近一個月的新聞該用戶都讀完了,你會把上個月的新聞顯示給他麼…?不會吧!這樣的話,新聞本身已經沒有意義了。

    那麼,合理的作法是什麼呢?應該是顯示在某個時間段內的新聞,例如最近3天。先限定一個範圍,再來思考這個範圍內的邏輯。

    但要加一個邏輯處理,就是這3天的新聞,用戶都看完了怎麼辦?理論上來說,應該要顯示最新的新聞出來,即使已經看過了。

    當然這只是一個粗略的分析,具體是什麼情況我並不清楚,需要你自己根據需求去研究細化。

    合理需求下的實現

    近3天的新聞已經是一個不大的量了,在這個範圍內,完全可以按照之前的想法進行實施,不管用上面哪種方法,都不會有巨大的數據量(當然要記得刪舊數據,即3天前的相關數據)。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:15:35

    給每篇文章一個獨立的id
    給每個用戶一個已讀的列
    把它看到的文章的id保存到這個列
    刷新首頁裡判斷一下,如果提取的新聞的id已經在他的已讀列裡,不顯示;
    然後再提取一次。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:15:35

    使用中間表儲存新聞與使用者的關係,並保存已讀標記,不過如果是互聯網方面產品不建議沒次讀資料庫,可以透過快取等來提高存取效率

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:15:35

    取新聞的時候,就不要取已讀ID的新聞不就行了嗎? select news.news from isread_news,news where isread_news.id <> news.id

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:15:35

    從 ID 不存在的新聞中選擇 *(從 red_news 中選擇 news_id,其中 user_id = ?)限制 10;

    回覆
    0
  • 取消回覆