处理PHP/MySQL中的未读帖子

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

对于一个个人项目,我需要建立一个论坛使用PHP和MySQL。我不可能使用已经建立的论坛包(如phpBB)。

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

tbl_userReadPosts: user_id, post_id, read_timestamp

显然,如果用户的ID出现在这个表中,我们知道他们已经阅读了帖子。这是伟大的,除非我们每天有上千个帖子(在提议的系统中这是非常可能的),以及上千个用户。如果不是几个小时,这张桌子就会在几天内变得巨大。

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

有没有人有这方面的经验,你是如何处理的?

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

提问于
用户回答回答于

对不起,我的回答很快,但我只有一秒钟。你肯定不想将读取的信息存储在数据库中,正如你已经推断的那样,这个表将变得巨大。

在你已经建议的内容之间的一些内容:存储用户最后的活动,并结合存储他们在cookie中看到的信息来确定他们已经读过的线程/帖子。

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

用户回答回答于

容纳所有用户的表[医]ID和POST[医]ID是个坏主意,因为它会以指数级增长。想象一下,如果你的论坛解决方案增加到一百万条帖子和50000用户。现在你有五百亿张唱片了。那就成问题了。

诀窍是像你所说的那样使用一个表,但它只包含自此登录后已读取的帖子,即上次登录到此登录之间发布的帖子。

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

呃,我最后一次登录是在2011年3月4日,然后我今天登录了。2011年4月3日前发布的所有帖子都被视为阅读(对我来说并不新鲜)。2011年3月4日至现在的所有帖子,除非在已阅读的表格中看到,否则将未读。每次登录时,Read表都会被刷新。

这样,你的Readpost表就不应该超过每个成员的几百条记录。

扫码关注云+社区