8

我只有一个一般的数据库理论问题。我需要做一些类似于显示用户查看或未查看的帖子/项目(例如在论坛中)或未读电子邮件的内容。我所拥有的是多个用户可以查看的帖子,但它需要由实际查看过的用户分开。因此,如果用户 A 查看了帖子 1,它将不再显示帖子 1 是要查看的新项目,但对于用户 B,它仍然会显示帖子 1 是要查看的新项目。

我已经搜索了其他想法,其中一个是获取用户上次登录时间的时间戳,但我实际上需要跟踪他们看到的帖子,而不是他们上次登录后发生的帖子.

如果可能的话,我想要一个 MySQL 数据库解决方案,但如果这是必须的,我愿意接受 cookie。我可以自己做这件事并弄清楚,但我会很感激任何关于如何正确构建表格以使其最有效的建议。此外,带宽和存储也不是问题。

4

3 回答 3

7

在查看phpBB 的相关架构时,我发现了以下内容:

# Table: 'phpbb_topics_track'
CREATE TABLE phpbb_topics_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    topic_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
    PRIMARY KEY (user_id, topic_id),
    KEY topic_id (topic_id),
    KEY forum_id (forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;

和:

# Table: 'phpbb_forums_track'
CREATE TABLE phpbb_forums_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
    PRIMARY KEY (user_id, forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;

然后我在他们的 wiki 中查看

该表记录访问过的主题,以便将它们标记为已读或未读。我们使用 mark_time 时间戳和主题 x 的最后一篇文章的时间戳来了解主题 x 是否被读取。

为了准确判断一个主题是否被阅读,还必须检查 phpbb_forums_track。

所以本质上他们有一个查找表来存储与用户查看主题(线程)相关的数据,然后将其与论坛视图表中的时间戳进行检查,以确定用户是否查看了该主题。

于 2012-06-08T17:10:01.080 回答
2

只需创建一个简单的交叉引用表(read_posts或其他东西):

user_id|post_id
----------------
2      | 132
53     | 43
....

确保这两个列都被索引(特别重要的user_id是被索引),然后使用连接(或子查询)为登录用户选择未读帖子。例如,如果您只是想显示未读帖子列表,则只需运行:

SELECT * FROM `posts` WHERE `post_id` NOT IN (
    SELECT `post_id` FROM `read_posts` WHERE `user_id`='[$USER ID]')
ORDER BY [your ordering clause]
于 2012-06-08T16:56:04.973 回答
1

根据这个描述,我会使用一个可能有 3 列的简单表格。

  1. 用户身份
  2. 帖子编号
  3. 首次查看的时间戳

当用户查看帖子时,在表格中添加一行。如果给定用户/帖子 ID 组合的表中不存在一行,则他们没有查看该帖子。

于 2012-06-08T16:57:31.103 回答