2010-09-29 104 views
7

好吧,在路線50什麼是創建論壇燈泡(未讀)系統的最有效方式?

另一個有趣的問題比我們想,直到狀態被清除,以實現真正的論壇燈泡系統中的職位未讀用戶(在創建用戶帳戶後)顯示爲未讀或直到用戶閱讀它們。

我們認爲做到這一點的最好和最簡單的方法是實現一個未讀消息表。

的列有:user_idboard_idthread_idpost_idtimestamp,並hidden

這對於查看該板/線程/職位是每個用戶未讀(並鏈接到他們)的工作非常好,非常快,但它是慢得令人難以置信的用戶在論壇中發帖即使正在運行一個SQL查詢:

INSERT IGNORE INTO `forums_lightbulb` SELECT `id`,'x','x','x',UNIX_TIMESTAMP(),0 FROM `users` 

我敢肯定,這是一種具有3065個的用戶帳戶的結果。我怎樣才能加快這個過程?我寧願將系統儘可能保持爲實時。

重要說明:請將您的答案限制在共享主機環境中,且不要增加預算。限制在PHP和MySQL 53年1月5日,登錄

+0

如果你可以,你想使用布隆過濾器 – amirouche 2012-01-28 22:34:58

回答

9

PHPBB做了什麼是一個非常快速的方法。當用戶最後一次打開它時,它會爲每個線程和每個論壇保留一個表格。並用它來確定是否有未讀消息。它允許用戶*主題+用戶*,同時允許非常簡單和快捷的查詢支票論壇存儲使用方案。

你可以看到它從數據庫結構是如何工作的。

# Table: 'phpbb_forums_track' 
CREATE TABLE phpbb_forums_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL, 
    PRIMARY KEY (user_id, forum_id) 
) CHARACTER SET `utf8` COLLATE `utf8_bin`; 

# Table: 'phpbb_topics_track' 
CREATE TABLE phpbb_topics_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    topic_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, 
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL, 
    PRIMARY KEY (user_id, topic_id), 
    KEY topic_id (topic_id), 
    KEY forum_id (forum_id) 
) CHARACTER SET `utf8` COLLATE `utf8_bin`; 
+0

這可能是我要找的!謝謝!我會獎勵賞金除非有人帶有一個更好的答案一起,但我敢肯定,這就是我試圖找出! – Navarr 2012-01-30 02:21:12

+1

這就是開源軟件是正確的?相互學習:D – Beanow 2012-01-30 07:08:10

1

上閱讀:

insert into read_articles(user_id, article_id); 

上顯示:

SELECT a.*, r.user_id FROM articles a 
LEFT OUTER JOIN read_articles r ON (a.article_id = r.article_id and r.user_id = $user_id) 
WHERE (article_filter, like forum or thread id, or whatever) 

在您的結果集,如果user_id是不爲空,那麼他們」已閱讀文章。否則,他們沒有。

適當的索引。服務器用餅乾和果醬保溫。

+0

這真的是一種相反的方式,我想處理這個.. – Navarr 2010-10-10 08:41:42

4

很抱歉地說,但問題中提出的解決方案是一種不可擴展的設計。

我正在通過here調查這個問題,對此進行了合理的討論(在我出現之前)。看看那裏。

在你的情況下,存儲U * M記錄以跟蹤「未讀」帖子,其中U是用戶數量,M是消息數量,將非常迅速地失去控制。這是因爲它的最佳效率要求所有用戶閱讀每條消息(並且大多數用戶不關心所有事情,因爲論壇上的大多數內容都是噪音)。平均情況下,可能有20%的用戶閱讀了100%的帖子,但是80%的用戶閱讀了接近0%的帖子,並且從未讀過其他內容。這意味着你被迫存儲0.8 * U * M,而U和M只能在幾何上增加。沒有索引量可以解決這個問題。

以前@ will-hartung答案有更有效的方法。

我發現這已經很老了,我希望你在此期間找到了更好的解決方案。

+0

我推理了一個更好的解決方案,這是一個混合了時間戳和存儲消息讀取,或類似那。我還沒有完全計劃好。但與此同時,我只是禁用了燈泡系統。 – Navarr 2011-02-22 04:37:48

2

這裏是最有效的方法:

  1. 有一個表稱爲read_threads存儲的thread_iduser_id
  2. 必須在users表中的列稱爲mark_read_date存儲日期用戶點擊鏈接mark all threads read在您的論壇
  3. ,以確定如果一個線程讀取,您的查詢將檢查它是否在read_threads表,或者如果它last_post_date(最後一個職位是向它提出的日期)是比舊的usersmark_read_date

當用戶點擊mark all threads read鏈接,您還刪除從read_threads表中的所有行是非常重要的在你的論壇中。

相關問題