【问题标题】:PHP idea for storing unread posts and notifications用于存储未读帖子和通知的 PHP 想法
【发布时间】:2012-03-20 21:08:50
【问题描述】:

所以我一直在玩我正在建立的一个论坛,并且一直停留在它的一个方面,即如何在不将大量数据存储在数据库中的情况下跟踪未读帖子和通知。在查看了一些解决方案之后,我相信我想出了一个可能适合我需要但需要一组新的眼睛来指出我没有想到的解决方案。这是我的想法的架构。

1) 当用户登录时,检查当前time() 和上次登录time() 之间的帖子。

2)如果找到帖子,添加到数组,然后serialize()数组并保存到数据库中的成员行。

3) 如果数组不为空,则输出给用户。

这样,它只会检查未读帖子并存储在实际登录论坛的用户上,而不是占用不必要的空间来保存非活动用户的未读 ID。我仍然想知道这是否不是一个好主意,因为如果用户不阅读帖子,那么数据库中的序列化可能会变得太大而无法管理。

有人发现我的思维方式有问题吗?如果有,请告诉我。

【问题讨论】:

  • 我建议你在 search.php 中查看 PHPBB 的 newposts 部分
  • SMF 存储阅读主题。是的,每个用户,每个主题都阅读。因此,正如您所说,不存储所有“未读”项目的诀窍是存储“已读”项目。

标签: php mysql serialization


【解决方案1】:

在真正出现问题之前不要担心空间问题。存储帖子 ID(整数)和用户 ID(另一个整数)的表会很小。即使您有成千上万的帖子和成千上万的用户,您也可以放心地假设:

  • 大部分用户将处于非活动状态(一次性注册发布内容而忘记整个问题)
  • 即使是活跃成员也不会阅读所有帖子,而只会阅读他们感兴趣的主题中的一小部分(相对较小)。

另一件事:如果您真的想最小化空间,请不要存储未读帖子。仅存储每个线程中最后阅读的帖子。这是每个用户每个线程一条记录,并且仅假设用户曾经打开过该线程。

【讨论】:

    【解决方案2】:
    1. 如果用户登录但未阅读帖子,您的方案仍将其标记为已读。
    2. 如果用户一次登录两次(从台式计算机和 iPad 登录),会发生什么情况?

    用一个标志来保持每个用户对论坛的看法,以表明他们是否阅读了每个人,这有什么问题?这样的机制显然对于扩展到支持、收藏等方面很有用。

    【讨论】:

    • 将每个用户读取的每个主题的 topic_id 和 member_id 存储在一个表中会呈指数级增长。如果用户将所有帖子标记为已读怎么办?
    • 它会随着帖子数和用户数线性变大。如果这些以相同的速度增长,它将随着时间的推移呈几何增长,这并不像指数增长那么糟糕。如果您只是存储 ID 和标志,则每条记录应该是真正微不足道的东西,例如 10 个字节。在 2,000 个用户和 10,000 个帖子之后,最大可能大小为 200M。对我来说听起来相当安全。
    • @EdR:这不是指数的;它对于两个维度中的每一个都是线性的。 Topic_id * member_id 对于 200 万用户和 20000 个主题来说只有大约 320 GB 的存储空间。按照目前的价格,这将消耗 21 美元的购买磁盘空间。没什么大不了的。
    • 我认为它会线性变大,而不是指数增长。此外,您可以随时删除对超过 30 天或其他时间的帖子的引用。
    • 我的错误。我决定为每个主题/用户使用一个表,并相应地编制索引。感谢您的帮助。
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多