邮件系统DB结构,需要帮助

时间:2010-06-16 17:07:27

标签: php sql mysql one-to-many

我有一个系统,用户(发送者)可以给朋友(接收者)写一个音符,接收者数量> = 0。消息文本保存在数据库中,发送者和所有接收者都可以看到,然后他们登录到系统。发件人可以随时添加更多接收器。任何接收器的更多内容都可以编辑消息,甚至可以从DB中删除它。对于这个系统,我很快创建了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.如果用户从表“messages”中删除消息,如何自动删除表“list”中对应于已删除消息的所有行。我必须包含一些外键吗?

更重要的是:
2.如果发件人已经为他的message1(username1,username2和username3)说了3个接收者,并且在某个时刻决定添加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

并从表“list”中删除与user1对应的行(不再在列表或接收者中)

  

sender_x_ID - receiver_1_ID - message_1_ID

从PHP发送哪个sql查询使其以简单明了的方式进行?请帮忙! SQL查询的例子很完美!

1 个答案:

答案 0 :(得分:2)

你的第一个问题很简单。您可以通过在list上设置外键来完成此操作。您将其设置为CASCADE更新和删除(以便DELETE FROM messages WHERE messageID = 5自动删除list messageID = 5 的所有行。您' d需要使用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