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

sha*_*bby 5 database-design database-schema

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

  1. 员工可以向所有员工发送消息
  2. 员工可以向彼此发送消息
  3. 员工可以回复收到的邮件
  4. 员工可以通过查看收件箱中"timestamp"列的回复来查看他/她已回复的邮件(即收件箱中必须有一个'repedat'列,该列应显示回复此邮件时的时间戳,它如果没有,应该是空的)
  5. 当他打开一个特定的消息时,他会看到消息的线索视图,最新消息在顶部.

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

如何创建线程或链?

No'*_*man 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
Run Code Online (Sandbox Code Playgroud)

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