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