我有一个GWT应用程序,其中集成了会话系统。对于这个会话系统,我有以下数据库结构。
create table if not exists conversation(
id int(11) PRIMARY KEY AUTO_INCREMENT,
user_one varchar(25) NOT NULL,
user_two varchar(25) NOT NULL,
subject varchar(15) NOT NULL,
ip varchar(30) DEFAULT NULL,
date varchar(50) NOT NULL,
filter varchar(20) DEFAULT 'Inbox'
);
create table if not exists conversation_reply(
id int(11) PRIMARY KEY AUTO_INCREMENT,
reply text,
username varchar(25) NOT NULL,
ip varchar(30) DEFAULT NULL,
date varchar(50) NOT NULL,
conv_id_fk int(11) NOT NULL REFERENCES conversation(id)
);
我实施了一种过滤机制,您可以将对话从“收件箱”移动到“存档”或“重要”或其他。但是当我执行更新过滤器的查询时:
update conversation set filter=? where id=?;
它会将这两个更新到user_one和user_two,因为GUI对两个用户都是相同的...就GUI的外观而言,user_one和user_two之间没有区别。因此,获取所有会话的选择如下所示:
select * from conversation where (user_one=? or user_two=?) and filter=? order by id desc
我应该如何更改数据库结构以使上面的操作(移动和删除)正常工作,因为正如我所说的,当我作为user_one移动时,它也将移动到user_two,从一个将删除对话从另一个中删除它。
建议?
提前致谢。
答案 0 :(得分:0)
重组表的方法是将用户参与者移动到一个单独的表中,在这个表中为两个参与者存储两行,并且它们都在同一列中。
create table if not exists conversation(
id int(11) PRIMARY KEY AUTO_INCREMENT,
subject varchar(15) NOT NULL,
ip varchar(30) DEFAULT NULL,
date varchar(50) NOT NULL,
filter varchar(20) DEFAULT 'Inbox'
);
create table if not exists participants(
conversation_id int NOT NULL,
user_id id NOT NULL,
PRIMARY KEY (conversation_id, user_id),
FOREIGN KEY (conversation_id) REFERENCES conversation(id),
FOREIGN KEY (user_id) REFERENCES user(id)
);
然后,您可以对涉及给定用户的所有会话使用多表更新:
update participant p join conversation c on p.conversation_id = c.id
set c.filter=?
where p.conversation_id=? and p.user_id=?;
这也为您准备一些未来功能,以允许三个或更多参与者之间的多方对话。