制作简单的电子邮件/邮件数据库架构

时间:2012-10-31 11:38:54

标签: database-design database-schema

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

  1. 员工可以向所有员工发送消息
  2. 员工可以向对方发送消息
  3. 员工可以回复已收到的消息
  4. 员工可以通过查看收件箱中“timestamp”列的回复来查看他/她已回复的邮件(即收件箱中必须有一个'repedat'列,该列应显示此邮件的时间戳回答说,如果没有,它应该是空的)
  5. 当他打开特定消息时,他会看到消息的线索视图,最新消息显示在顶部。
  6. 我的问题 如何跟踪特定邮件是否是对邮件的回复,在电子邮件中,我相信它嵌入在标题中。我是否保留了一个'repliedto'id字段,该字段指向另一条消息,它是回复?

    如何创建线程或链?

1 个答案:

答案 0 :(得分:6)

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

这也是您创建线程或链的方式:线程中的第一条消息将使其“父”字段等于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

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