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

Asi*_*dri 22 sql sql-server email database-design

我想制作像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]
Run Code Online (Sandbox Code Playgroud)

但我面临着上述结构的一些问题.现在,如果用户A向用户BI发送msessage,则在该表中存储行但是如果用户B删除了该消息,则它也会被用户的A发送消息删除.这是错误的,我想要像正常的电子邮件消息系统那样.如果A从他发送的项目中删除了消息,那么B不应该从他的收件箱中删除.我正在考虑其他问题,假设用户A一次向500个用户发送邮件,因此根据我的设计,我将有500行具有重复的主体,即不是存储有效存储它的方式.你们可以帮我制作一个消息传递系统的设计吗?

Rag*_*hav 33

你需要拆分它的表.您可以拥有以下架构和结构

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 

    )
Run Code Online (Sandbox Code Playgroud)

在users表中,您可以拥有用户."Messages"表示消息表."MessagePlaceHolders"表示消息占位符的表.占位符可以是收件箱,已发送项目,草稿,垃圾邮件或垃圾箱."Users_Messages_Mapped"表示用户和消息的映射表."UserID"和"PlaceHolderID"是外键."IsRead"和"IsStarred"表示他们的名字代表什么.如果在"Users_Messages_Mapped"表中找不到特定messageid的记录,则该记录将从Messages表中删除,因为我们不再需要它.


Tim*_*ara 5

如果您正在进行面向文档的工作,我建议您看看CouchDB。它是无模式的,这意味着这样的问题就会消失。

我们看一下例子:A向B发送一条消息,被B删除了。

您将拥有该文档的单个实例,并列recipients为电子邮件的属性。当用户删除邮件时,您可以将其从收件人列表中删除,也可以将其添加到deleted_by您选择的列表中。

这是一种与您习惯的数据处理方法截然不同的方法,但花一些时间考虑可能会非常有益。