基本内部消息数据库设计

时间:2011-10-27 08:46:15

标签: 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 user_id, limit one un-read message per thread)
- read (boolean)

这个数据库设计是否足以用于内部消息传递系统,或者它缺少什么/以任何方式来改进它?谢谢。

2 个答案:

答案 0 :(得分:2)

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....)

“限制一条未读消息”应该通过查询获取计数thread_id并使用status ='new'来处理。

答案 1 :(得分:0)

似乎消息和收件人之间存在多对多的关系。因此,我会将其分解为连接表;你也可以把“读”标志放在那个连接表上。

这会给你类似的东西:

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

(为古老的连接语法道歉)