小编典典

电子邮件系统的数据库设计

sql

我想制作一个像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向用户BI发送消息,则在该表中存储一行,但是如果用户B删除该消息,它也会从用户A发送的消息中删除。这是错误的,我想完全像普通的电子邮件系统一样。如果A从他的已发送邮件中删除邮件,则B不应从他的收件箱中删除。我在考虑另一个问题,假设用户A一次向500个用户发送了一封邮件,因此根据我的设计,我将有500行带有重复的正文,即不是一种有效的存储方式。你们能帮我设计消息系统吗?


阅读 361

收藏
2021-04-15

共1个答案

小编典典

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

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”表中没有找到特定messageid的记录,则该记录将从Messages表中删除,因为我们不再需要它。

2021-04-15