Database design 创建简单的电子邮件/消息数据库模式

Database design 创建简单的电子邮件/消息数据库模式,database-design,database-schema,Database Design,Database Schema,我正在创建一个小型邮件/消息发送数据库模式。它不是一个真正的邮件系统,而是一个组织的消息传递门户,具有以下用例: 员工可以向所有员工广播消息 员工可以互相发送消息 员工可以回复收到的邮件 员工可以通过查看收件箱中的“时间戳”栏查看他/她已回复的邮件(即,收件箱中必须有一个“repliedat”栏,该栏应显示回复此邮件时的时间戳,如果没有,则应为空) 当他打开一条特定的消息时,他会看到一个消息的线程视图,最新消息在顶部 我的问题 我如何跟踪某条消息是否是对任何消息的回复,在电子邮件中,我相信它嵌入

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

  • 员工可以向所有员工广播消息
  • 员工可以互相发送消息
  • 员工可以回复收到的邮件
  • 员工可以通过查看收件箱中的“时间戳”栏查看他/她已回复的邮件(即,收件箱中必须有一个“repliedat”栏,该栏应显示回复此邮件时的时间戳,如果没有,则应为空)
  • 当他打开一条特定的消息时,他会看到一个消息的线程视图,最新消息在顶部
  • 我的问题 我如何跟踪某条消息是否是对任何消息的回复,在电子邮件中,我相信它嵌入在邮件头中。我是否保留一个“repliedto”id字段,该字段指向另一条作为回复的消息


    如何创建线程或链

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

    这也是创建线程或链的方式:线程中的第一条消息的“父”字段将等于0,但稍后的消息将在此字段中包含其他值。如果您维护一个名为“thread”或“conversation”的字段,这也会有所帮助,这样就可以很容易地知道哪些消息连接到了哪些线程

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

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

    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
    

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

    你自己已经走了多远?我在如何向每封邮件/消息添加收件人方面遇到了问题,然后我发现收件人不是每封邮件的收件人,而是与线程关联的,谢谢你的帮助help@No“阿姆纽曼:如果信息来自两种类型的人,员工和客户会怎样?”@史密斯:消息来源应该不会太重要。请注意,我的模式有一个字段“from_id”,它是“users”表的外键。通过此字段,可以访问用户的属性。是的,但这是用户表的FK,而不是另一个表我致力于回答[1]问题,这是最好的[1]: