2010-11-17 122 views
2

我正在开发一个自定义论坛,并且想知道人们会认为什么是将线程标记为已读的最佳方法。将论坛帖子标记为已读?

我想显示线程的帖子图标,如果线程还没有被读取,它有一个未读的图标和主题标题为粗体。如果已经阅读,则主题标题是正常的字体重量,并且帖子图标变为读取图标。

最好的方法是在用户会话中存储他们已经查看的线程,并将其设置为标记所有超过48小时左右的线程以读取?

谢谢!

回答

2

创建第二个表,例如:

基本上特定于该部件和线程就可以去参加什么那里。当拉出线程列表时,LEFT JOIN针对该表。如果read_flag是0NULL,那么它是新的。

SELECT * FROM thread t 
LEFT JOIN thread_member tm ON t.id=tm.thread_id AND tm.member_id=$member_id 
WHERE t.id=$thread_id 

每当有人在线程发布消息,只需要运行这个查询:

UPDATE thread_member SET read_flag=0 WHERE thread_id=$thread_Id 

posted_flag可以用来确定人在线程写了一个消息。

bookmarked_flag可用于确定人员是否为该线程添加书签。

要保留表格修剪,您可以截断所有没有设置任何重要标志的旧记录。在本例中,您可以删除没有设置bookmark_flag的所有X日/周/月之前的记录。

+0

虽然这似乎是一个明智的方式来做到这一点,我不知道是什么您每次发布帖子时都会对(可能)数百条记录进行更新,而不是进行数据比较。你应该已经知道线程的最后一篇文章是什么时候了 - 在我看来,你基本上只是用int来替换日期,但在这个过程中做了更多的工作。你真的在减少桌面尺寸吗? – Dutchie432 2010-11-17 21:28:48

+0

一个公平的观点,但我怀疑这样做会有什么重大的惩罚,因为论坛的回复可能不是很频繁。 (另外,添加'AND read_flag = 1'会限制更新的次数。)我更喜欢这个标志,因为它与其他类型的数据相匹配(它甚至可以被压缩成一个位域),同时准确地描述它的目的,但是如果有人我更喜欢时间戳,我不会反驳它。 – Matthew 2010-11-18 00:05:57

2

关闭我的头顶,我会保留一个单独的表,其中包含userId,threadId和lastVisted日期/时间。只需在用户查看线程时添加/更新相应的userId/ThreadId记录。

然后,当一个访问者查看一个线程时,你知道在用户的lastVistedDate是新的后发生的任何帖子,显然,如果没有LastVisted日期,你知道线程中的所有帖子都是新的。

2

保持日期时间的表中的用户上次访问线程

viewed_threads

列:USER_ID,thread_id单,日期时间

而且一定要保持的最后时间线进行了更新

轨道

当用户打开一个线程

replace into viewed_thread (user_id, thread_id, datetime) values($user_id, $thread_id, now()) 

现在,当列出线程时,您可以检查用户会话中用户上次访问该线程的日期时间。如果最后观看的日期时间是最后一次线程被更新之前那么它的“新”

+0

击败我吧! :) – Dutchie432 2010-11-17 20:40:11

+0

其实我想你打我 – Galen 2010-11-17 20:40:30

+0

谢谢。不过桌子变得有点长了? – Cory 2010-11-17 20:43:57

相关问题