对于“什么用户已经看到了什么项目”来说,它看起来像是多对多的关系,最好用正好有两列的表来实现–在用户表中插入外键,在项目表中插入外键.创建项目时,您尚未向该表中添加条目(除非您可以将某个用户标识为被视为已查看该项目的创建者,在这种情况下,您确实要添加该条目)-您添加了一个条目(U,P)每次发生“用户U看到项目P”.修改项目后,请删除表中与该项目有关的所有条目(同样,如果您知道谁,则可能是正在进行修改的用户的条目除外).
需要该表的架构和我用文字概述的操作的SQL吗?
编辑:一个注释者请求了SQL,因此(假设是InnoDb,在mysql的情况下),假设表user和project分别具有int主键uid和pid:
create table Seen (uid int, pid int,
foreign key uid references user(uid) on delete cascade,
foreign key pid references project(pid) on delete cascade,
primary key (uid, pid))
当修改了一个具有pid为P的现有项目时,因此现在没有用户被视为“看到”了,请从Seen的pid = P处删除(即,从该表中删除所有P的条目);如果修改是由用户U进行的,因此实际上认为用户U已看到它,则可以将uid!= U添加到delete的where子句中.
要标记某个用户U现在已经看到项目P的事实,请将ignore插入到Seen(uid,pid)值(U,P)中(忽略部分的意思是“如果该行已经存在,则不执行任何操作”,以便记录“见过”的情况不止一次是无害的,尽管当然是多余的).