我正在尝试使用 PHP 和 MySQL 构建一个论坛系统。我想知道的是,如何设置它,以便当用户阅读论坛条目时,它显示为仅针对该用户阅读,无论他们在哪个论坛,直到其他人在其上发帖。
目前,对于每个线程,我有一个带有 PostID 的表,并具有发布它的 UserID、将其链接到的 ThreadID、实际的帖子(作为文本),然后是发布的日期/时间。
对于每个论坛中的线程列表,有线程ID(主键)、线程名称、所属论坛ID、NumPosts、NumViews、LastPostDateTime 和CreateDateTime。有什么帮助吗?
传统的解决方案是连接表大致如下:
CREATE TABLE topicviews (
userid INTEGER NOT NULL,
topicid INTEGER NOT NULL,
lastread TIMESTAMP NOT NULL,
PRIMARY KEY (userid, topicid),
FOREIGN KEY (userid) REFERENCES users(id),
FOREIGN KEY (topicid) REFERENCES topics(id)
);
每次阅读主题时,lastread 都会更新。显示主题列表时,如果topics.lastupdated > topicviews.lastread,则有新帖子。
传统的解决方案是垃圾,会毁掉你的数据库!不要这样做!
第一个问题是,在繁忙的论坛上,对每个主题视图进行写入很快就会使数据库服务器崩溃,尤其是在只有表级锁的 MyISAM 表上。 (不要使用 MyISAM 表,使用 InnoDB 进行除全文搜索之外的所有操作)。
您可以通过仅在主题中实际读取新消息时编写上次读取时间来稍微改善这种情况。如果 topic.lastupdated
第二个问题是组合爆炸。每个用户每个主题一行很快就会加起来:只需一千个用户和一千个主题,您就可能有一百万行主题视图要存储!
您可以通过限制每个用户记住的主题数量来稍微改善这种情况。例如,当视图表的年龄超过一定年龄时,您可以从视图表中删除任何主题,并假设所有旧主题都已“读取”。这通常需要在后台完成清理任务。
其他强度较低的方法包括:
- 每个论坛仅存储一次最后阅读时间
- 在整个网站上仅存储每个用户的最后访问时间,这将仅显示自用户上次访问(会话)以来更新的内容
- 根本不存储任何上次读取的信息,但在主题的 URL 本身中包含上次更新时间。如果用户的浏览器最近看到过该主题,它会记住该 URL 并将其标记为已访问。然后,您可以使用 CSS 将访问的链接设置为“不包含新消息的主题”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)