Mysql 标记/标记自用户上次看到以来已更改的内容
我想知道对于以下情况是否有一个通用的数据库结构 在我的web应用程序中,有用户和项目 现在,无论何时创建或修改项目,都必须以某种方式通知尚未看到该新项目/修改项目的所有用户(例如,项目标题前的图标或其他)Mysql 标记/标记自用户上次看到以来已更改的内容,mysql,database-design,Mysql,Database Design,我想知道对于以下情况是否有一个通用的数据库结构 在我的web应用程序中,有用户和项目 现在,无论何时创建或修改项目,都必须以某种方式通知尚未看到该新项目/修改项目的所有用户(例如,项目标题前的图标或其他) 有没有一个通用的方法?如果是这样的话,该怎么做?我该如何做才是最有效的方法?我要做的是创建某种“通知”实体(表)。然后,当有人添加新项目时,您可以让数据库客户机代码插入新通知。或者,您可以在数据库中自动执行此操作 具体如何设计通知(需要哪些表和哪些属性)实际上取决于应用程序的设计 users_
有没有一个通用的方法?如果是这样的话,该怎么做?我该如何做才是最有效的方法?我要做的是创建某种“通知”实体(表)。然后,当有人添加新项目时,您可以让数据库客户机代码插入新通知。或者,您可以在数据库中自动执行此操作 具体如何设计通知(需要哪些表和哪些属性)实际上取决于应用程序的设计 users_viewed_projects +--------+-----------+ + userId | projectId | 用户\u查看\u项目 +--------+-----------+ +用户ID | projectId|
一旦用户查看了userId/projectd,就为该表添加一个条目。看起来像是“什么用户看到了什么项目”的多个关系,最好使用一个正好有两列的表来实现——一个外键进入用户表,一个外键进入项目表。创建项目时,您尚未向该表添加条目(除非您可以将某个用户标识为被视为已看到该项目的创建者,在这种情况下,您确实添加了该条目)——每次出现“用户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的现有项目被修改,因此现在没有用户被视为“看到”了它,从pid=p的SEED中删除(即,从该表中删除p的所有条目);如果修改是由用户U进行的,那么用户U实际上被认为已经看到了它,那么您可以添加和uid=U
到删除
的where
子句
为了标记某个用户U现在已经看到了项目p,将ignore插入SEED(uid,pid)值(U,p)
(ignore部分的意思是“如果行已经存在,则什么也不做”,因此多次记录“SEED”条件是无害的,尽管这当然是多余的)。您需要一个表来显示何时开始(如果有)每个用户最后一次看到每个项目
create table user_seen_project
(
user_id int,
project_id int,
last_seen datetime
);
对于每个项目,您需要最后更改时间
create table project
(
project_id int
...
last_changed datetime
);
然后可以为当前用户执行正确的外部联接,如下所示
select project_id, /* other fields*/ last_changed, last_seen
from project p outer join user_seen_project up
on p.project_id=up.project_id
where up.user_id=$currentUser
在结果集中:
- 上次看到时为空-用户未看到此项目(新项目)
- 上次查看时<上次更改-更新项目
- 上次查看>上次更改时-“旧”项目
当然,这确实会产生一些开销。一旦用户注意到更新,您就必须更新项目的版本号,并且每次项目发生任何更改时,您都需要增加版本号。正如kigurai所提到的,您可以使用触发器来自动执行部分操作。希望这是不言自明的