基本内部消息传递数据库设计

问题描述 投票:0回答:2

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

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)

这个数据库设计对于内部消息系统来说似乎足够了,还是缺乏任何/任何方法来改进它?

mysql sql database database-design
2个回答
3
投票
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....)

“限制一条未读消息”应通过查询获取 count thread_id with status='new' 来处理。


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

(对过时的连接语法表示歉意)

© www.soinside.com 2019 - 2024. All rights reserved.