【问题标题】:See which posts user has viewed查看用户查看了哪些帖子
【发布时间】:2013-09-03 07:18:03
【问题描述】:

我有一个表用户:

id INT PRIMARY AUTO_INCREMENT
name VARCHAR(30) NOT NULL

我也有桌帖

id INT PRIMARY AUTO_INCREMENT
post TEXT NOT NULL

如果用户访问某个帖子,我想在数据库中存储他已经查看过该帖子的某个位置。我将如何修改数据库以适应这种情况,以及我将如何查询用户没有看到的帖子。我应该创建一个新表来存储该信息吗?还是有什么其他妙招?
我的想法是,我只是想要一种方式,如果用户一旦查看该帖子,他就无法再次查看它。
抱歉,我只是想学习数据库,这是我觉得非常有趣和困难的一项挑战。

【问题讨论】:

    标签: mysql database postgresql database-design


    【解决方案1】:

    你需要实现一个many-to-many relationship:一个用户访问多个帖子,一个帖子被多个用户访问。

    这将采用只有两列的表格形式,每列都是您现有表格之一的外键:

    CREATE TABLE user_post_visit (
        user_id INT NOT NULL,
        post_id INT NOT NULL,
        PRIMARY KEY (user_id, post_id),
        FOREIGN KEY (user_id) REFERENCES user(id),
        FOREIGN KEY (post_id) REFERENCES post(id)
    );
    

    每次用户查看帖子时,都会在此表中添加一条记录。要查找给定用户查看过的帖子:

    SELECT post.*
    FROM post
    LEFT JOIN user_post_visit AS upv
        ON (upv.post_id = post.id AND upv.user_id = <your user ID here>)
    WHERE upv.post_id IS NULL;
    

    【讨论】:

    • 这么简单的O_o我简直惊呆了,我完全没有想到,非常感谢:)
    【解决方案2】:

    使用 RandomSeed 建议在用户和帖子之间创建桥接表,然后使用以下内容查询用户查看的帖子:

    SELECT post_id, post FROM user_post_visit, post WHERE user_post_visit.user_id=<user id>
    

    【讨论】:

      【解决方案3】:

      看来我跟在@RandomSeed 后面。 :D

      在我看来,您需要多对多关系,因此您需要一个新表。你如何做到的并不严格,但例如

      表“read_post”或“unread_post”:

      user_id, post_id

      如果表格是 unread_post(但您必须在创建新帖子时为每个用户创建新行),您可以显示未读帖子:

      从 post INNER JOIN unread_post ON post.id 中选择文本 = unread_post.post_id WHERE user_id = ?

      如果表是 read_post 则未读,请参阅 RandomSeeds 答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-25
        • 2018-12-11
        相关资源
        最近更新 更多