如何为每个用户构建未读项目警报的数据库

时间:2012-06-08 16:49:35

标签: php mysql database-design cookies

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

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

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

3 个答案:

答案 0 :(得分:6)

在审核relevant schema for 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`;

然后我look here in their wiki

  

此表记录已访问的主题,以便将其标记为   读或未读。我们结合使用mark_time时间戳   主题x的时间戳的最后一篇文章,以了解是否读取主题x。

     

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

所以基本上他们有一个查找表来存储与用户查看主题(线程)相关联的数据,然后根据论坛视图表中的时间戳检查它,以确定用户是否已查看该主题

答案 1 :(得分: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]

答案 2 :(得分:1)

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

  1. 用户ID
  2. 帖子ID
  3. 首次查看时间戳
  4. 当用户查看帖子时,请在表格中添加一行。如果表中不存在给定用户/帖子ID组合的行,则他们没有查看帖子。