5

我正在创建一个小型邮件/消息发送数据库模式。它不是真正的邮件系统,而是一个组织的消息传递门户,具有以下用例:

  1. 员工可以向所有员工广播消息
  2. 员工可以互相发送消息
  3. 员工可以回复收到的消息
  4. 员工可以通过在收件箱中的“时间戳”列中查看他/她已回复的邮件来查看他/她已回复的邮件(即收件箱中必须有一个“已回复”列,该列应显示回复该邮件时的时间戳,它如果没有,则应为空)
  5. 当他打开特定消息时,他会看到消息的线程视图,最新消息位于顶部。

我的问题 我如何跟踪特定消息是否是对任何消息的回复,在电子邮件中,我相信它嵌入在标题中。我是否保留一个“repliedto”id 字段,该字段指向另一条作为回复的消息?

如何创建线程或链?

4

1 回答 1

7

在数据库表中保留一个指向原始电子邮件的字段。每封电子邮件只能有一个前任(或“父亲”),而任何电子邮件都可以没有或有多个继任者(或“儿子”)。因此,最好保留前身的记录。

这也是您创建线程或链的方式:线程中的第一条消息的“父亲”字段将等于 0,但后面的消息将在该字段中包含其他值。如果您维护一个名为“线程”或“对话”的字段,这也将有所帮助,从而可以轻松了解哪些消息与哪些线程相关联。

有趣的部分不一定是您如何将链接存储在链中,而是您如何遍历链。

以下是一个简单的数据模式

USERS
id - autoinc
name - varchar

THREADS
id - autoinc
name - varchar

STATUSES
id - autoinc
name - varchar

MESSAGES
msg_id - autoinc
from_id (fk to users table) - int
datesent - date
thread (fk to threads table) - int
father (pointer to previous message in this thread) - int
text - varchar

RECIPIENTS
id - autoinc
msg_id (fk to messages table) - int
to_id (fk to users table) - int
status (fk to statuses table) - int 
dateread - date

由于一条消息可以发送给许多人,因此在 MESSAGE 和 RECIPIENTS 之间存在一对多的关系。每个收件人将在不同的时间阅读消息,并且将具有不同的状态(未读、已读、已删除、已删除未读等)。

于 2012-10-31T12:33:01.713 回答