调整DB结构以支持过滤对话并删除它们

时间:2016-09-16 12:15:50

标签: mysql sql messaging

我有一个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,从一个将删除对话从另一个中删除它。

建议?

提前致谢。

1 个答案:

答案 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=?;

这也为您准备一些未来功能,以允许三个或更多参与者之间的多方对话。