我想知道以下情况是否存在通用数据库结构。
在我的网络应用中,有用户和项目。
现在,无论何时创建或修改项目,所有尚未看到新/修改项目的用户都必须以某种方式得到通知(例如项目标题前面的图标或其他内容)
有一般的方法吗?如果是这样,那么方法是什么?如何以最有效的方式实现这一目标?
答案 0 :(得分:3)
“用户看到了什么项目”看起来像很多关系,最好用一个只有两列的表来实现 - 一个是用户表的外键,一个是项目表。创建项目时,您还没有向此表添加条目(除非您可以将某个用户标识为被视为已经看过该项目的创建者,在这种情况下您确实添加了该条目) - 您添加了一个条目(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))
当修改p的pid的现有项目时,现在没有用户被视为“看到”它delete from Seen where pid=P
(即,从该表中删除P的所有条目);如果修改是由用户U进行的,那么用户U实际上被视为已经看过它,您可以将and uid!=U
添加到where
的{{1}}子句中。
为了标记某个用户U现在已经看到项目P的事实,delete
(insert ignore into Seen(uid, pid) values (U, P)
部分意味着“如果该行已经存在则不执行任何操作”,以便记录“看到”条件不止一次是无害的,虽然当然是多余的。)
答案 1 :(得分:1)
您需要一个表格,显示每个用户上次看到每个项目的时间(如果有的话)。
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
在结果集中:
答案 2 :(得分:1)
答案 3 :(得分:0)
我要做的是创建某种“通知”实体(表格)。然后,当有人添加新项目时,您可以让数据库客户端代码插入新通知。或者您可以使用数据库本身中的triggers自动执行此操作。
您设计通知的确切方式(需要哪些表和哪些属性)完全取决于您的应用程序的设计。
答案 4 :(得分:0)
也许像
users_viewed_projects +--------+-----------+ + userId | projectId |
在该用户查看userId / projectId后,为该表添加一个条目。
答案 5 :(得分:0)
您想要在项目表中添加版本列。然后,无论您在哪里引用用户有权访问的项目,都要添加一列以显示用户使用的项目的最新版本。
现在,每当您填写有关用户及其项目的信息时,您都可以检查用户项目当前版本号的最新版本号,如果项目中有更改,您就会知道它。
当然,这确实会产生一些开销。您必须在注意到更新后更新项目的用户版本号,并且每次项目发生任何更改时都需要增加版本号。如kigurai所述,您可以使用触发器自动执行其中一些操作。