我正在尝试创建一个基本的内部邮件系统。唯一的“特殊”考虑因素是用户可以向多个收件人发送消息,而消息的接收者可以回复所有人(如果适用)。这就是我目前所拥有的:
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)
这个数据库设计是否足以用于内部消息传递系统,或者它缺少什么/以任何方式来改进它?谢谢。
答案 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
(为古老的连接语法道歉)