我正在创建一个发送数据库架构的小邮件/消息。它不是真正的邮件系统,而是一种带有组织的消息传递门户,具有以下用例:
我的问题 如何跟踪特定邮件是否是对邮件的回复,在电子邮件中,我相信它嵌入在标题中。我是否保留了一个'repliedto'id字段,该字段指向另一条消息,它是回复?
如何创建线程或链?
答案 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
由于一条消息可以发送给许多人,因此MESSAGE和RECIPIENTS之间存在一对多的关系。每个收件人都会在不同的时间阅读邮件,并且会有不同的状态(未读,已阅读,已删除,未读删除等)。