Mysql 标记/标记自用户上次看到以来已更改的内容

Mysql 标记/标记自用户上次看到以来已更改的内容,mysql,database-design,Mysql,Database Design,我想知道对于以下情况是否有一个通用的数据库结构 在我的web应用程序中,有用户和项目 现在,无论何时创建或修改项目,都必须以某种方式通知尚未看到该新项目/修改项目的所有用户(例如,项目标题前的图标或其他) 有没有一个通用的方法?如果是这样的话,该怎么做?我该如何做才是最有效的方法?我要做的是创建某种“通知”实体(表)。然后,当有人添加新项目时,您可以让数据库客户机代码插入新通知。或者,您可以在数据库中自动执行此操作 具体如何设计通知(需要哪些表和哪些属性)实际上取决于应用程序的设计 users_

我想知道对于以下情况是否有一个通用的数据库结构

在我的web应用程序中,有用户和项目

现在,无论何时创建或修改项目,都必须以某种方式通知尚未看到该新项目/修改项目的所有用户(例如,项目标题前的图标或其他)


有没有一个通用的方法?如果是这样的话,该怎么做?我该如何做才是最有效的方法?

我要做的是创建某种“通知”实体(表)。然后,当有人添加新项目时,您可以让数据库客户机代码插入新通知。或者,您可以在数据库中自动执行此操作

具体如何设计通知(需要哪些表和哪些属性)实际上取决于应用程序的设计

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所提到的,您可以使用触发器来自动执行部分操作。

希望这是不言自明的