【发布时间】:2015-02-16 09:28:54
【问题描述】:
这是我想出的,但我不确定其中哪一个是“最好的”。也许还有另一种更好的我可能不知道的。请记住,我的应用中同时包含收件箱和发件箱,并且由发件人或收件人删除的邮件仍应对其他相关用户可见,除非他们自己删除。
选项 1 - 简单的多对多:
表:
用户 - 只是用户字段
消息 - 只是消息字段
User_Message - 包含 2 个外键:user_id 和 message_id
示例:当用户发送消息时,消息表中添加了 ONE 消息行,而 User_Message 中添加了 2 行消息,显然将发送者和接收者与添加的消息联系起来。
现在,这可能会有点问题假设我只想获取收件箱消息,因为 ManyToMany 会获取所有这些消息,所以我想出了选项 2。
选项 2 - OneToMany:
表:
用户 - 只是用户字段
MessageReceived - user_id 的消息字段和外键
MessageSent - user_id 的消息字段和外键
示例:当用户发送消息时,该消息将添加到接收表和已发送表中,但 user_id 不同。当然,发件人 ID 将在发送表中,收件人 ID 在接收表中。
现在,当我只想获取收件箱消息时,我正在从 MessageReceived 表中获取消息,并且在删除例如收件箱 (MessageReceived) 消息时,它的副本仍然保留在 MessageSent 中并且可供发件人使用,所以一切都很好,但是我觉得就像这个有一些“不酷”的地方,因为我基本上在两个表中都保留了几乎相同的数据。
请让我知道您对此有何看法,如果有更好的方法,我也在倾听。感谢您的宝贵时间。
编辑:
Madbreaks 和 Tab Alleman 都提供了非常好的且有些相似的解决方案,因此非常感谢。我将使用 Madbreaks 之一,只是因为我更喜欢删除连接表中的关系而不是保留“已删除”列,但这只是我的口味。不过,感谢您的时间和回答。
【问题讨论】:
-
一封邮件可以有多个发件人吗?
-
为什么要添加两行
user_message?有 3 列,sender_id、receiver_id、message_id。您还怎么知道发件人和收件人是谁? -
不,用户是发件人,仅此而已。
-
一对多怎么样。 Messages 有两个 FK 指向 User 表。 FK1 ReceivingUserId,FK2 SendingUserId
-
Madbreaks,是的,你是对的。这是有道理的,但我有一个关于删除它们的问题。当收件人删除一条消息时,它必须为发件人留在那里,那么除了在其中一侧设置 NULL 之外,还有其他方法可以实现吗?
标签: mysql database database-design foreign-keys relational-database