时间:2011-06-16 16:04:40

标签: php mysql database forum

我使用php编写了一个自定义论坛脚本。我决定不使用phpbb和其他人,因为我希望我正在做的事情具有100%的灵活性。

我遇到了一个问题:

如果帖子是新的/未读的,如何向用户显示。

我想到了两个解决方案:

1)Cookies 2)数据库

我不想使用cookie,因为它们可以被用户删除,而firefox方面的东西意味着它们会被自动删除。无论哪种方式,我都不想使用cookies。

数据库导致我出现问题,因为我似乎无法将数据库结构排在脑后!我能想到的第一个解决方案是:

  • 当用户加载论坛时,请检查他们上次加载论坛的时间
  • 查看自上次查看论坛以来所有帖子
  • 将这些值输入到包含字段(user_id,post_id)的表中的数据库中。
  • 该值在查看帖子时会从数据库中删除

我正在考虑的问题是这是一个巨大的数据库流失。它似乎效率低下。我确定在字段中有数组的方法,但我对数组的确不太好。

有人能给我一个良好的数据库设计的指示,以及任何必须使用它的代码吗?它让我发疯,因为我无法想到一个对服务器来说效率和效率的解决方案。

非常感谢您提供的帮助和帮助,

詹姆斯。

5 个答案:

答案 0 :(得分:11)

这在某种程度上是一个很好的问题,我以前从未经历过这个问题所以我只能建议你一个我无法保证其正确性的想法。

我的想法基本上是:

  1. 在主题表中创建一个名为is_new的新字段。此字段包含字符串形式的值列表,遵循特定模式。例如:5|6|12|110|2|45|之间的每个值代表已阅读该主题的用户ID。

  2. 每当用户跳入论坛时,在获取主题列表时,您将检查该用户是否读取了每个主题,简单地说:

    • 使用is_new
    • explode('|', $row['is_new']);中分解字符串
    • 现在您有一个包含值的数组,只需要检查in_array($user['id'], $list_of_ids);
  3. 如果false,请标记主题unread,否则请将其标记为read,并将该用户的ID更新为is_new列表。

    < / LI>

    这种方法似乎不像原始方法那么“痛苦”,因为它只会检查比普通方法更多的内容,同时还会提取主题列表。我认为如果你有很多用户,它会影响更多。

    注意:您不必担心规范化问题,因为is_new包含多个值,您只能用它来检查和更新,不需要选择。

    此外,您也可以使用时间比较检查主题是否为新主题。例如,如果一个主题持续4周并且用户没有阅读它,那么即使它未读,它也会返回旧的(这有意义不是吗?就像报纸一样)。我认为你可以做到这一点,确实很容易。

    这种方法特别适用于相当多的论坛软件,因为它很快且更有意义。请记住,浏览器最初支持您确定已读/未读主题,即如果访问该主题,将更改主题超链接的颜色。现在它又回到了 Cookies 解决方案。我不担心用户删除他们的cookie。这种情况很少发生,用户不会因为read主题在删除Cookie后转为unread而死亡。

    相当开放的主题不是吗?希望这会有所帮助(:

答案 1 :(得分:5)

很多较大的论坛软件使用跟踪表来跟上谁读过什么,这样的事情(大大简化):

CREATE TABLE topic_tracking (
    user_id INT NOT NULL,
    topic_id INT NOT NULL,
    last_visit DATETIME NOT NULL,
    PRIMARY KEY (user_id, topic_id)
)

然后,您可以在此表上使用联接来检查您正在显示的帖子是否已被阅读。由于你将分页你的线程,这应该产生相对较少的额外查询(取决于你每页显示的帖子数量)。

当用户访问该主题时,请使用其访问的时间戳更新此跟踪表。然后在显示您的线程链接时,检查此表以查看它们的last_visit是否早于线程中的最后一个帖子。这也可以让你显示“更新”的线程,而不仅仅是“新的”线程。

答案 2 :(得分:1)

嗯,好问题。

我将把我的两分钱投入到如何处理这个问题上,它可能不是最有效的解决方案,但是这里有:

我会使用数据库来解决这个问题。如果可能,请在数据库中创建一个附加到特定用户的字段。在此字段(或列或表中,如果您愿意)内,按文章ID存储“已查看”文章列表。

在为用户呈现页面时,检索他们的“已查看”文章列表以及所有可用文章ID的列表。

循环浏览您的文章/论坛/主题结果集,看看该ID是否与任何“已查看”ID匹配。对于没有相应“已查看”匹配的每个文章/论坛/主题条目,那么对于该用户,它将是“新”文章。

这是处理器/数据库/网络密集型,每次加载包含文章引用的页面时都需要查看数据库。虽然我有一些聪明的查询设计,但我认为你可以将这种操作几乎全部卸载到数据库中。

使用该数据库的另一个潜在解决方案是,当用户首次登录该站点时,您将在该第一个加载点获取读取文章/论坛列表并将其添加到cookie或会话中,这样您就可以点击该列表的数据库一次(在第一次加载时),并将其存储在会话/ cookie /隐藏字段中,以便在后续请求中您只需要转到该cookie / session / hidden字段而不是执行Db外观每次用户查看带有文章/论坛/主题列表的页面时都会出现。每次用户单击链接时,捕获并将其存储在数据库中,并将该文章/论坛ID存储在cookie / session / hidden字段中。再一次,也许不是最有效的方法,但是有了一些老式的好事,我相信你会占上风。 :)

祝你好运!

ħ

答案 3 :(得分:0)

会话将是存储它的好地方。我想你只想存储用户查看的最后“n”个线程的数据,或者只存储过去“n”天内线程的数据。

正如有人在其中一条评论中建议的那样,值得查看一些现有的论坛,看看他们是如何实现的。

虽然我认为自己编写自己的论坛软件是一个很好的学习机会,但我认为你在某种程度上重新发明了它。

答案 4 :(得分:0)

我的方法是保存特定用户在数据库中看到的每个主题的最后一个帖子ID:

user_id   topic_id   post_id
1         2          3

所以,在这里,您知道用户1访问了第二个主题中的第三个帖子,但根本没有查看第一个主题。

要检查用户是否有新的/未读主题,您可以先检查该用户不在此表中的topic_id。要检查已知主题是否有新消息,您可以将post_id与每个主题的最后一个post_id进行比较。如果它们不相等,则会有新消息。