sql - 电子邮件消息系统的数据库设计

标签 sql sql-server database-design email

我想制作一个像 Gmail 一样的电子邮件消息系统。我想要有以下选项:已加星标、垃圾邮件、垃圾邮件、草稿、已读、未读。我的数据库:

CREATE TABLE [MyInbox](
    [InboxID] [int] IDENTITY(1,1) NOT NULL,
    [FromUserID] [int] NOT NULL,
    [ToUserID] [int] NOT NULL,
    [Created] [datetime] NOT NULL,
    [Subject] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Body] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [IsRead] [bit] NOT NULL,
    [IsReceived] [bit] NOT NULL,
    [IsSent] [bit] NOT NULL,
    [IsStar] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsStarred]  DEFAULT ((0)),
    [IsTrash] [bit] NOT NULL CONSTRAINT [DF_MyInbox_IsTrashed]  DEFAULT ((0)),
    [IsDraft] [bit] NOT NULL CONSTRAINT [DF_MyInbox_Isdrafted]  DEFAULT ((0))
) ON [PRIMARY]

当用户 A 向用户 B 发送消息时,我将其存储在该表中。但如果用户 B 删除该消息,它也会从用户 A 发送的消息中删除。这是错误的,如果 A 从他发送的邮件中删除该消息,那么 B 也不应该将其从他的收件箱中删除。

另一个问题是,当用户 A 向 500 个用户发送邮件时,我有 500 个重复邮件(这不是有效的存储方式)。如何正确设计电子邮件消息系统?

最佳答案

您需要为其拆分表格。您可以具有以下架构和结构

CREATE TABLE [Users]
    (
      [UserID] INT ,
      [UserName] NVARCHAR(50) ,
      [FirstName] NVARCHAR(50) ,
      [LastName] NVARCHAR(50)
    )

CREATE TABLE [Messages]
    (
      [MessageID] INT ,
      [Subject] NVARCHAR(MAX) ,
      [Body] NVARCHAR(MAX) ,
      [Date] DATETIME,
      [AuthorID] INT,
    )

CREATE TABLE [MessagePlaceHolders]
    (
      [PlaceHolderID] INT ,
      [PlaceHolder] NVARCHAR(255)--For example: InBox, SentItems, Draft, Trash, Spam 
    )

CREATE TABLE [Users_Messages_Mapped]
    (
      [MessageID] INT ,
      [UserID] INT ,
      [PlaceHolderID] INT,
      [IsRead] BIT ,
      [IsStarred] BIT 

    )

在用户表中,您可以拥有用户。“消息”表示消息表。 “MessagePlaceHolders”表示消息占位符表。占位符可以是收件箱、已发送项目、草稿、垃圾邮件或垃圾邮件。 “Users_Messages_Mapped”表示用户和消息的映射表。 “UserID”和“PlaceHolderID”是外键。“IsRead”和“IsStarred”表示它们的名称所代表的含义。 如果在“Users_Messages_Mapped”表中没有找到特定消息 ID 的记录,则该记录将从 Messages 表中删除,因为我们不再需要它。

关于sql - 电子邮件消息系统的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3370647/

相关文章:

sql - 拆分 SQL 函数,计算字符串长度 b/w 第 2 个和第 7 个逗号

mysql - 具有两列之一的导航菜单的 SQL 设计

database-design - 如何克服EAV数据库报告的缺点?

mysql:设计实践

sql - 与 ROW_NUM 一起使用时,Oracle 查询行顺序不同

mysql - Rails 查询/范围 : exclude objects according to attribute of joined model

sql - 从周数获取周开始日期和周结束日期

sql - View 中的日期减法应该创建哪些索引?

sql - 将 Excel 从 Azure Blob 存储导入到 Sql Server 时出现数据截断问题

c# - 批量插入最好的办法是什么? + 帮助我完全理解我目前的发现