database-design - 制作简单的电子邮件/消息数据库架构

标签 database-design database-schema

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

  • 员工可以将消息广播给所有员工
  • 员工可以向彼此发送消息
  • 员工可以回复收到的消息
  • 员工可以通过在收件箱中的“时间戳”列中看到已回复来查看他/她已回复的邮件(即,收件箱中必须有一个“repliedat”列,该列应显示该邮件被回复时的时间戳,如果没有则应该为空)
  • 当他打开一条特定的消息时,他看到了该消息的一个线程 View ,最近一次显示在顶部。

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

    如何创建线程或链条?

    最佳答案

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

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

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

    关于database-design - 制作简单的电子邮件/消息数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157049/

    相关文章:

    session 消息系统的SQL表设计

    database-design - 数据库设计 - 文章、博客文章、照片、故事

    sql - 对多对一关系的聚合数据建模的有效方法(例如,stackoverflow 问题的投票数)

    mysql - 用户自定义字段 PHP Mysql

    mysql - 我可以将一个产品的多个附加组件存储为 JSON 形式的表列中吗?

    mysql - 唯一目的是指定另一个表的子集的表

    database - 表模块与领域模型

    php - 如何制作 n :1 multiple tags system for a blog & which database schema is better?

    asp.net - SQL Server 2008 架构更改的最佳实践

    mysql - 带有非识别键的表