处理 PHP /MySQL 中的未读帖子

2022-08-31 01:05:56

对于个人项目,我需要使用PHP和MySQL构建一个论坛。我无法使用已经构建的论坛包(例如phpBB)。

我目前正在研究构建这样一个应用程序所需的逻辑,但已经是漫长的一天,我正在为用户处理未读帖子的概念而苦苦挣扎。我的一个解决方案是有一个单独的表,它基本上保存所有帖子ID和用户ID,以确定它们是否已被读取:

tbl_userReadPosts: user_id, post_id, read_timestamp

显然,如果用户的 ID 出现在此表中,则表示我们知道他们已阅读该帖子。这很好,除非我们每天有数以百计的帖子(这在所提议的系统中是可能的),以及数以万计的用户。这张桌子将在几天内变得很大,如果不是几个小时的话。

另一种选择是将用户的最后一次活动作为时间戳进行跟踪,然后检索在上次活动更新后发布的所有帖子。这在理论上是可行的,但假设一个用户正在写一个极长的帖子,同时几个成员也开始新线程或回复其他线程中的帖子。当用户提交他的新帖子时,他的最后一个活动将被更新,因此与在此期间所做的活动不匹配。

有没有人有这方面的经验,你是怎么解决的?

我已经检查了phpBB,似乎系统为每个用户分配了一个自定义会话,并在此基础上工作,但是关于如何处理未读帖子的文档非常稀疏。

一如既往地感激地收到想法和意见。


答案 1

很抱歉快速回答,但我只有一秒钟。您肯定不希望将读取信息存储在数据库中,正如您已经推断的那样,此表将变得巨大。

介于您已经建议的内容之间:存储用户上次活动,并结合存储他们在Cookie中看到的内容的信息,以确定他们已经阅读了哪些线程/帖子。

这会将存储卸载到客户端 Cookie,这样效率要高得多。


答案 2

一张桌子包含所有user_ids和post_ids是一个坏主意,因为它呈指数级增长。想象一下,如果您的论坛解决方案增长到100万个帖子和50,000个用户。现在你有 500 亿条记录。这将是一个问题。

诀窍是使用您所说的表格,但它只包含自此登录以来已阅读的帖子,这些帖子是在上次登录和此登录之间发布的帖子。

在上次登录之前发布的所有帖子均被视为已阅读。

IE,我上次登录是在2011年4月3日,然后我今天登录。2011 年 4 月 3 日之前发布的所有帖子都被视为已阅读(它们对我来说并不陌生)。2011 年 4 月 3 日到现在的所有帖子都未读,除非在阅读表中看到它们。每次登录时,读取表都会被刷新。

这样,您的阅读帖子表的每个成员的记录不应超过几百条。


推荐