Mysql 基本内部消息数据库设计

Mysql 基本内部消息数据库设计,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我正在尝试创建一个基本的内部消息传递系统。唯一的“特殊”考虑是用户可以向多个收件人发送消息,并且消息的收件人可以回复所有收件人(如果适用)。这就是我目前拥有的: MESSAGE TABLE - thread_id - message_id - subject - content - date_sent - from (FK to user_id) - to (FK to user_id(s)) READ TABLE - message_id (FK) - recipient (FK to us

我正在尝试创建一个基本的内部消息传递系统。唯一的“特殊”考虑是用户可以向多个收件人发送消息,并且消息的收件人可以回复所有收件人(如果适用)。这就是我目前拥有的:

MESSAGE TABLE
- thread_id
- message_id
- subject
- content
- date_sent
- from (FK to user_id)
- to (FK to user_id(s))

READ TABLE
- message_id (FK)
- recipient (FK to user_id, limit one un-read message per thread)
- read (boolean)

对于内部消息传递系统来说,这种DB设计似乎足够了,还是缺少任何改进的方法?谢谢。

邮件和收件人之间似乎存在多对多关系。因此,我将把它考虑到一个联接表中;您还可以将“read”标志放在该联接表上

这会给你一些类似的东西:

MESSAGE TABLE
- thread_id
- message_id
- subject
- content
- date_sent
- from (FK to user_id)


MESSAGE_RECIPIENT TABLE
- message_id (FK)
- recipient (FK to user_id)
- read (boolean)
您要求一个线程只显示一条未读消息,这是一个显示问题,我将把它排除在数据库之外。在前端代码中,在计算要显示的未读消息数时,逻辑上可以显示实际未读消息数与1中的较小者

要查找邮件的所有收件人(因此您可以执行“全部回复”),您需要连接到message_RECIPIENT表,如下所示:

select u.email_address
from   users u, 
       message m, 
       message_recipient mr
where  u.user_id   = mr.recipient
and    mr.message_id = m.message_id
and    m.message_id  = $whateverYourCurrentMessageIDis
(为古老的连接语法道歉)


“限制一条未读邮件”应该通过查询获取count thread\u id,status='new'来处理。

关于您的“thread”概念。显然,您希望将消息作为给定线程的一部分(我假设每当有人编写新消息而不是回复另一条消息时,您都会生成一个新的线程ID),并在发送日期对其进行排序。但是,当有人回复前一条消息时,没有办法拥有线程的分支。可以吗?请你澄清一下“支行”是什么意思?如果有人回复了前一条消息,这难道不是现有线程的延续吗?a发送一条消息。答案A.C.答案B.答案A.答案A.答案A.答案E.答案B.答案C.答案D.这或多或少是:(A(B(C)(E))(D(C)),而你会有,暂时的:ABCDEC(抱歉,在评论中很难画出图表)-所以你在C的最后一条消息和C要回答的D消息之间没有具体的联系。因此,我建议添加一个“回复到”字段,该字段是消息id的FK,即使所有消息都是同一个线程的一部分。所谓“限制一条未读消息”,我的意思是,如果一个用户在一个线程中,而十个人在该线程中回复所有消息,它将显示一条未读消息,而不是十条。此外,如果线程中有多个用户,那么这样分离收件人表不会使“全部回复”问题复杂化吗。这到底是怎么回事?
user
    user_id   

message
    thread_id (surrogate id to grant easy access to whole conversation)
    message_id
    parent_message_id (message replied on can be used to show replies in tree-view form. FK to message)
    subject
    contect
    date
    from_id (FK to user)

message_user
    message_id (FK to message)
    user_id (FK to user_id)
    status (readed, deleted, new....)