我正在尝试创建一个基本的内部消息系统。唯一的“特殊”考虑是用户可以向多个收件人发送消息,并且消息的接收者可以回复所有人(如果适用)。这是我目前拥有的:
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)
这个数据库设计对于内部消息系统来说似乎足够了,还是缺乏任何/任何方法来改进它?
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' 来处理。
消息和收件人之间似乎存在多对多关系。因此,我会将其分解到连接表中;您也可以在该连接表上放置“已读”标志。
这会给你类似的东西:
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
(对过时的连接语法表示歉意)