我正在尝试实现一个数据库设计系统,该系统将向人(即1对1)或许多人(1对多)发送消息。
table --users
|u_id | Name |
| 01 | Aku |
| 02 | Sika |
| 03 | Admin|
table --messages
|m_id | sender_id | Body | Time |
| 100 | 01 | hello | 16:04|
| 200 | 02 | Hi | 16:08|
| 300 | 03 | hi Guys| 19:12|
table --recipient
|r_id| m_id | recipient_id|
| 50 | 100 | 02 |
| 51 | 200 | 01 |
| 52 | 300 | 01 |
| 53 | 300 | 02 |
table --message_status
|m_id | recipient_id | status | deleted |
|100 | 02 | read | no |
|200 | 01 | unread | no |
|300 | 01 | read | yes |
|300 | 02 | unread | no |
从我上面的架构中,用户可以向一个人发送消息,他也可以向许多人发送消息。一旦用户向某人发送消息,我们将让所有收件人userid
进入recipient
表以及message_status
表中的recipient
表。因此,假设用户一次向100万用户发送一条消息,这意味着message_status
和u_id = 02
表中将有100万行。
当用户向许多用户发送消息或者这是正确的事情时,请通过减少行的多次插入来解决这个问题。
注意
请系统允许每个收件人删除收到的邮件,如果他/她愿意,但删除不应影响其他收件人。因此,如果u_id=01
用户删除了收到的邮件,则{{1}}的用户仍应查看其邮件。
感谢您的帮助。
答案 0 :(得分:1)
为什么不组合message_status
表和recipient table
?然后你只更新/插入一个表而不是两个。
<强>收件人:强>
|r_id| m_id | recipient_id| status | deleted |
| 50 | 100 | 02 | read | no |
| 51 | 200 | 01 | unread | no |
| 52 | 300 | 01 | read | yes |
| 53 | 300 | 02 | unread | no |