2010-01-04 23 views

回答

7

最簡單的方法是跟蹤上次某人登錄的時間。當他們回來訪問時,自那時起更新的所有內容顯然都是「新的」。

雖然這有一些問題,因爲有效註銷會將所有項目標記爲已讀。

我唯一能想到的方法就是維護一個包含每個用戶都看過的所有線程和最新帖子的表格。

user_id thread_id post_id 
     1   5  15 
     1   6  19 

有了這些信息,如果線程#5中有一個ID大於15的帖子,那麼你知道那裏有未讀的帖子。僅使用該頁面上的最新帖子的post_id更新此表格。這意味着如果有3頁新帖子,並且用戶只查看第一個帖子,它仍然會知道有未讀帖子。

+2

當然,困難的方法是記錄每個用戶對每個線程的每次訪問。 – 2010-01-04 03:54:12

+1

我認爲大名字論壇與使用cookies有關,所以沒有一個龐大的數據庫記錄表和只爲這個功能進行讀/寫操作 – JasonDavis 2010-01-04 04:09:26

+1

'如果我換了電腦和論壇,將會是一個龐大的PITA告訴我一切都是新的... – nickf 2010-01-04 05:46:50

0

如上所述,除了用戶實際訪問的線程被跟蹤之外。所以用戶沒有訪問過的任何東西都被認爲是該訪問者的新東西。爲了更細粒度的控制,在用戶註冊之前創建的任何線程都將被忽略,並且可能忽略在一段時間內未訪問的任何線程。這會阻止每一個未訪問的線程成爲他們的新線程。

當然有很多方法對皮膚一隻貓,並根據什麼論壇創想上面可以改變,以適應

DC

+1

vbulletin和phpbb等論壇,他們將允許您點擊一個鏈接,並將每個主題設置爲已讀 – JasonDavis 2010-01-04 04:02:25

0

您可以登錄他們選擇該主題的最後時間,然後看看帖子是否有更晚的時間戳,然後是他們最後的「點擊」線程。

0

您可以在數據庫中使用USER_ID和THREAD_ID列以及對USER和THREAD表以及包含USER和THREAD ID的主鍵的適當約束在數據庫中創建一個特殊表。

現在,當有人打開一個線程時,只需將該USER-THREAD-PAIR插入到該特殊表中即可。

在您的線程列表中,您現在可以簡單地將該表外連接到適合您使用的那個表上。如果你的新表在任何特定點上都包含NULL,那麼這個線程是未讀的。這將使像列表:

  • 所有主題爲「未讀」標記
  • 所有未讀線程
  • 線程如果添加日期列這個表由用戶XY

閱讀,可以做更有趣的東西。

只要留意您的鑰匙和索引,以防止過重的負面性能影響。嘗試從USER-THREAD表中讀取,只需將其加入到您現有的查詢中即可。這將比始終執行單個查詢的速度快得多。

0

如果讀取的線程尚未讀取,您可以有一張表,每次線程讀取時都會獲取插入。然後,當有人添加到該線程時,您可以刪除該線程表中的所有條目,從而使所有用戶都不讀取。

表結構會是這樣的

forum_id thread_id user_id 

通過可選的額外has_read_id爲您的主鍵,與其他領域做一個複合鍵。

+0

是的我在想,但希望有一個更好的解決方案(少讀和寫)我要研究如何vbulletin和phpbb和其他工作可能會揭示更好的解決方案 – JasonDavis 2010-01-04 16:05:26

+0

phpBB必須做一些不同的事情。當我登錄到elitebastards.com並查看新帖子列表(自從我上次訪問後新增)時,在會話超時後,新帖子列表爲空,即使我沒有訪問過列表中的所有線程。但是,如果我去尋找它們,線程仍然被標記爲未讀。 – 2010-01-04 16:46:26