php - 邮件系统数据库结构,需要帮助

标签 php sql mysql one-to-many

我有一个系统,用户(发送者)可以给 friend (接收者)写一条便条,接收者数量> = 0。消息文本保存在数据库中,发送者和所有接收者都可以看到,然后他们登录系统。发送者可以随时添加更多接收者。更重要的是,任何接收者都可以编辑消息,甚至将其从数据库中删除。对于这个系统,我很快创建了 3 个表:

users(userID, username, password)
messages(messageID, text)
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. 如果发送者为他的消息 1 指定了 3 个接收者(用户名 1、用户名 2 和用户名 3),并且在某个时刻决定添加用户名 4 和用户名 5,同时从接收者列表中排除用户名 1。 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查询的例子就完美了!

最佳答案

你的第一个问题很简单。您可以通过在 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

关于php - 邮件系统数据库结构,需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3055542/

相关文章:

PHP Session 过期事件

javascript - ajax表单提交不起作用

mysql - 检查外键上的所有插入是否成功

MySQL - 显示记录及其父项

javascript - 在 Javascript 中迭代不同的 div 并将参数传递给脚本

php - MySQL 中使用 PHP undefined variable 的 CONCAT 函数

php - 如何使用dreamweaver在MySQL中插入值

php - 如何从 mysql 数据库中的序列化字段进行搜索?

sql - 如何在 SQL 中表示和插入有序列表?

sql - 将订单量四舍五入至限制总数