查看用户查看了哪些帖子

时间:2013-08-30 14:07:44

标签: mysql database postgresql database-design

我有一个表用户:

id INT PRIMARY AUTO_INCREMENT
name VARCHAR(30) NOT NULL

我也有桌子帖子

id INT PRIMARY AUTO_INCREMENT
post TEXT NOT NULL

如果用户访问某个帖子,我想在数据库中的某个地方存储他已经查看过的帖子。我将如何修改数据库以适应这一点以及如何查询用户未见过的帖子。我应该创建一个新表来存储该信息吗?还是有其他一些漂亮的伎俩? 我的想法是,我只想找到一种方式,如果用户再次无法查看该帖子,则可以查看该帖子 对不起,我只是想学习数据库,这是一个我觉得非常有趣和困难的挑战。

3 个答案:

答案 0 :(得分:3)

您需要实施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;

答案 1 :(得分:0)

似乎我跟在@RandomSeed后面。 :D

在我看来,你想要多对多的关系,所以你需要一个新的表。你怎么做并不严格,但例如

表“read_post”或“unread_post”:

  

user_id,post_id

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

  

SELECT text FROM post INNER JOIN unread_post ON post.id =   unread_post.post_id WHERE user_id =?

如果table是read_post得到未读,请参阅RandomSeeds回答。

答案 2 :(得分:0)

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

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