个人和全球消息数据库设计

时间:2014-07-04 14:46:07

标签: mysql database

我正在尝试实现一个数据库设计系统,该系统将向人(即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_statusu_id = 02表中将有100万行。

当用户向许多用户发送消息或者这是正确的事情时,请通过减少行的多次插入来解决这个问题。

注意

请系统允许每个收件人删除收到的邮件,如果他/她愿意,但删除不应影响其他收件人。因此,如果u_id=01用户删除了收到的邮件,则{{1}}的用户仍应查看其邮件。

感谢您的帮助。

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     |