2013-07-07 59 views
0

我正在構建讀取帖子時注意到的RSS閱讀器(如Google Reader所做的那樣)。我有它的工作範圍,當我向下滾動時,它通過將行插入到「讀取文章」表中來標記帖子爲已讀,該表中記錄讀取的項目(ciid),讀取它的用戶(uid)和讀取的日期dateRead)。高效地在SQL表中創建大量條目

現在,我正在考慮如何提供「全部標記爲已讀」功能。如果只有25篇未讀文章,那就夠簡單了。我會查詢25篇文章的主要文章表 - 我有一個子查詢來確定哪些文章未​​讀 - 當前用戶未讀取,收集需要標記爲已讀的ciid,並插入新的讀取條目。但是,如果有20,000個條目未讀?檢索20,000條未讀條目似乎相當低效,收集那些ciid秒,然後發送回MySQL服務器20,000條插入命令。

有沒有更高效的方法來做到這一點,也許有一個SQL查詢直接處理所有這些?如果系統中只有一兩個用戶,我想我的低效方法不會成爲問題,但我希望系統能夠相對較好地擴展。

回答

2

你可以做類似

REPLACE INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles 

,你必須指定要插入用戶ID。 REPLACE INTO將刪除任何現有的日期讀取。如果你不希望這種行爲,你可以這樣做

INSERT INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles 
ON DUPLICATE KEY UPDATE uid=uid; 

不過,我不認爲你正在服用(存儲在閱讀每篇文章的基礎篇)的方法是可擴展的。當用戶點擊標記所有時,可以將該事件的日期時間存儲在用戶表中。所有比上一次標記全部日期更早的文章都被視爲已讀。

也許你應該只考慮表中最後7天的文章,即。定期刪除超過一週的read_articles記錄。所有超過7天的文章你只是忽略(所以實際上你假設他們已被閱讀)。

+0

謝謝,@ user1853955!這聽起來像它會做的伎倆。我認爲你對文章的老化是正確的 - 我需要考慮如何最好地實現這一點。我正在考慮從數據庫中完全刪除文章,假設他們有一定的年齡,除非特定的ciid只有非常少的文章。我不想標記每個用戶「全部閱讀」,因爲用戶可以標記訂閱源,因此讀取全部可能僅適用於「技術」訂閱源,而不適用於「國際新聞」訂閱源。 –

+0

我想我可以標記每個標籤的全部標誌,儘管現在標籤沒有任何獨立的存在;它們只是作爲不同Feed的屬性而存在。嗯... –

+0

你可以爲每個用戶存儲閱讀文章,可選地有一些超時,沒有太多的問題(假設正確的索引)。問題是您的「全部讀取」功能會爲此表添加大量數據。我認爲「最後閱讀」日期(每個標籤)是一個好主意。 – apartridge