структура БД почтовой системы, нужна помощь

0

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

пользователи (userID, имя пользователя, пароль)
сообщения (messageID, текст)
list (id, senderID, receiverID, messageID)

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

sender_x_ID - receiver_1_ID - message_1_ID
sender_x_ID - receiver_2_ID - message_1_ID
sender_x_ID - receiver_3_ID - message_1_ID

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

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

sender_x_ID - receiver_4_ID - message_1_ID
sender_x_ID - receiver_5_ID - message_1_ID

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

sender_x_ID - receiver_1_ID - message_1_ID

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

  • 1
    Почему бы не иметь SenderId в качестве столбца в таблице сообщений?
  • 0
    спасибо Морон, хорошая мысль! :)
Теги:
one-to-many

1 ответ

2
Лучший ответ

Ваша первая проблема проста. Вы можете сделать это, установив внешний ключ на 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
  • 1
    Я надеюсь, что кто-то скоро спасет вас от фабрики штрих-кодов.
  • 0
    Спасибо за помощь. Только одна проблема, я не знаю, какую строку удалить из списка :( мой скрипт получает список получателей (например: rec1, rec2, rec10, rec12 ..) и, возможно, сначала мне придется удалить из таблицы «list» все строки с message_1_ID, а затем вставьте новые строки с новыми получателями. Можно ли сделать это проще? Спасибо еще раз :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню