2016-09-16 9 views
0

У меня есть приложение 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, так как графический интерфейс такой же, как для users..there нет никакой разницы между user_one и user_two с точки зрения как выглядит GUI. Таким образом, выбор, который получает все разговоры выглядит следующим образом:

select * from conversation where (user_one=? or user_two=?) and filter=? order by id desc 

Как следует изменить структуру БД, чтобы сделать операции над (перемещение и удаление) работают правильно, потому что, как я сказал, когда я двигаюсь, как user_one, он также переместится на user_two, удалив разговор из одного, он также удалит его из другого.

Предложения?

Заранее спасибо.

+0

Простейшее решение: добавьте второе поле фильтра в таблицу бесед. – Shadow

ответ

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

Это также готовит вас к какой-то будущей функции, чтобы обеспечить многоканальные разговоры между тремя или более участниками ,

 Смежные вопросы

  • Нет связанных вопросов^_^