在数据库表中保留一个指向原始电子邮件的字段。每封电子邮件只能有一个前任(或“父亲”),而任何电子邮件都可以没有或有多个继任者(或“儿子”)。因此,最好保留前身的记录。
这也是您创建线程或链的方式:线程中的第一条消息的“父亲”字段将等于 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 之间存在一对多的关系。每个收件人将在不同的时间阅读消息,并且将具有不同的状态(未读、已读、已删除、已删除未读等)。