структура БД почтовой системы, нужна помощь - PullRequest
0 голосов
/ 16 июня 2010

У меня есть система, в которой пользователь (отправитель) может написать заметку друзьям (получателям), количество получателей> = 0. Текст сообщения сохраняется в БД и виден отправителю и всем получателям, после чего они входят в систему. Отправитель может добавить больше получателей в любое время. Более того, любой из получателей может отредактировать сообщение и даже удалить его из БД. Для этой системы я создал 3 таблицы, коротко:

пользователи (userID, имя пользователя, пароль)
сообщения (messageID, текст)
список (идентификатор, идентификатор отправителя, идентификатор получателя, идентификатор сообщения)

в таблице «список» каждая строка соответствует паре отправитель-получатель, например

sender_x_ID - receive_1_ID - message_1_ID
sender_x_ID - получатель_2_ID - сообщение_1_ID
sender_x_ID - получатель_3_ID - сообщение_1_ID

Теперь проблема:
1. если пользователь удаляет сообщение из таблицы «messages», как автоматически удалить все строки из таблицы «list», которые соответствуют удаленному сообщению. Нужно ли включать некоторые внешние ключи?

Более важно:
2. если отправитель разрешил сказать 3 получателям своего сообщения1 (имя пользователя1, имя пользователя2 и имя пользователя3) и в определенный момент решает добавить имя пользователя4 и имя пользователя5 и одновременно исключить имя пользователя1 из списка получателей. PHP-код получит новый список получателей (username2, username3, username4, username5), что означает вставку в таблицу «list»

sender_x_ID - receive_4_ID - message_1_ID
sender_x_ID - receive_5_ID - message_1_ID

, а также удалить из таблицы «список» строку, соответствующую user1 (которого больше нет в списке или получателях)

sender_x_ID - receive_1_ID - message_1_ID

какой SQL-запрос отправить из PHP, чтобы сделать его простым и интеллектуальным способом? Пожалуйста помоги! Примеры запросов SQL были бы идеальными!

1 Ответ

2 голосов
/ 16 июня 2010

Ваша первая проблема проста.Вы можете сделать это, установив внешний ключ на list.Вы установили бы на CASCADE обновления и удаления (чтобы DELETE FROM messages WHERE messageID = 5 автоматически удаляло все строки в list, где messageID = 5 . Вам нужно будет использовать InnoDBкак механизм хранения, чтобы это работало ...

Для второй проблемы это тоже просто: просто вставьте новые строки в один запрос:

INSERT INTO list (senderID, receiverID, messageID)
VALUES (sender_x_id, receiver_4_id, message_1_id),
       (sender_x_id, receiver_5_id, message_1_id);

И затем удалите остальныев другом:

DELETE FROM list
WHERE receiverID = receiver_1_id
  AND messageID = message_1_id
...