代码之家  ›  专栏  ›  技术社区  ›  AsifQadri

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

  •  20
  • AsifQadri  · 技术社区  · 14 年前

    我想做一个像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]
    

    8 回复  |  直到 14 年前
        1
  •  36
  •   Raghav    6 年前

    你得把桌子分开。您可以有以下模式和结构

    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”表示消息占位符的表格。占位符可以是收件箱、已发送邮件、草稿、垃圾邮件或垃圾。”用户\消息\映射”表示用户和消息的映射表。“UserID”和“PlaceHolderID”是外键。“IsRead”和“IsStarred”表示它们的名称代表什么。

        2
  •  4
  •   pauljwilliams    14 年前

    我认为你需要进一步分解你的模式。分别存储电子邮件,并将收件箱映射到其中包含的邮件。

        3
  •  4
  •   Tim McNamara    14 年前

    如果你在做面向文档的工作,我建议你看看 CouchDB . 它是无模式的,意味着这样的问题消失了。

    让我们看一看这个例子:a向B发送一条消息,然后被B删除。

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

    这是一个与你过去习惯不同的数据处理方法,但可能需要花费一些时间来考虑。

        4
  •  2
  •   Maximus    14 年前

    若我是你们,我会设置两个标志,一个是发送方的,另一个是接收方的。若这两个标志都是真的,那个么消息应该从数据库中删除,否则就把它保存在数据库中,但对删除它的人隐藏它。

        5
  •  1
  •   tdammers    14 年前

    一封邮件一次只能在一个文件夹中,因此您需要一个文件夹表(包含文件夹“Trash”、“Inbox”、“Archive”等)和一个从邮件到文件夹的外键。 对于标签,您有一个多对多关系,因此您需要一个标签表和一个链接表(messages\u labels)。 对于星号,一个简单的位列应该做,同样的'未读'。

        6
  •  1
  •   nvogel    14 年前

    您可以为MessageContacts创建一个表,该表将每条消息连接到邮箱中的联系人。当用户删除一条消息时,会从MessageContacts中删除一行,但会保留原始消息。

    你可以这么做。。。但我建议你不要。除非这是你的导师设定的学术练习,否则开发你自己的消息传递系统肯定是完全浪费时间。如果是家庭作业,那么你应该这么说。如果没有,那就去做一些更有用的事情。

        7
  •  1
  •   Dan Is Fiddling By Firelight Leniency    11 年前
    CREATE TABLE `mails` (  
      `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
      `message` varchar(10000) NOT NULL DEFAULT '',  
      `file` longblob,  
      `mailingdate` varchar(40) DEFAULT NULL,  
      `starred_status` int(10) unsigned NOT NULL DEFAULT '0',  
      `sender_email` varchar(200) NOT NULL DEFAULT '',  
      `reciever_email` varchar(200) NOT NULL DEFAULT '',  
      `inbox_status` int(10) unsigned NOT NULL DEFAULT '0',   
      `sent_status` int(10) unsigned NOT NULL DEFAULT '0',  
      `draft_status` int(10) unsigned NOT NULL DEFAULT '0',  
      `trash_status` int(10) unsigned NOT NULL DEFAULT '0',  
      `subject` varchar(200) DEFAULT NULL,  
      `read_status` int(10) unsigned NOT NULL DEFAULT '0',  
      `delete_status` int(10) unsigned NOT NULL DEFAULT '0',  
      PRIMARY KEY (`message_id`)  
    )
    

        8
  •  0
  •   Elvin Nagiyev    13 年前

    为什么要删除?我认为没有必要删除任何内容。只是隐藏它,从用户删除时。因为,当发送者向许多接收者发送相同的消息时,检查双方都会有问题。然后您必须检查并标记所有收件人。如果一切正常,则删除。。。 我认为没有必要删除任何内容。

        9
  •  -1
  •   P. Lusine    5 年前

    在我的结构中,我设置了“deleted:bool”标志并根据其值显示消息或隐藏。