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

问题描述:

我想制作一个类似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发送msessage,我在此表中存储了一行但如果用户B删除了该消息,它将被删除frm user's 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 

    ) 

数据库图表: alt text http://codeasp.net/Assets/Uploaded-CMS-Files/13f15882-7ed9-4e22-8e2c-20c6527522317-31-2010%2012-51-50%20AM.png

在用户表中,可以让用户“信息”是指对信息的表格。 “MessagePlaceHolders”表示消息占位符的表。占位符可以是收件箱,发送项目,草稿,垃圾邮件或垃圾。 “Users_Messages_Mapped”表示用户和消息的映射表。 “UserID”和“PlaceHolderID”是外键,“IsRead”和“IsStarred”表示他们的名字代表什么。 如果在“Users_Messages_Mapped”表中找不到记录,该记录将从Messages表中删除,因为我们不再需要它。

+0

您能否描述一下,我们如何能够在这个设计中知道哪些消息来自用户和用户? – zarpio 2014-04-20 12:15:01

+0

@zarpio消息表中的authorID是发件人ID。 – 2014-05-21 20:01:16

+0

如果在Users_Messages_Mapped表中没有组合键? – user3308043 2014-06-06 21:58:52

我认为你需要分解一些你的模式。分开存储电子邮件,并将收件箱映射到它们包含的邮件。

如果你做文档为导向的工作,我建议考虑看看CouchDB。它是无模式的,意味着这样的问题消失。

让我们来看看这个例子:A发送消息给B,而它是由B.

删除您将有该文件的一个实例,并列出作为电子邮件的属性recipients。当用户删除消息时,您可以将它们从收件人列表中删除,或将它们添加到deleted_by或您选择的任何列表中。

这是一个非常不同的方法比你习惯什么样的数据,但可能是非常有益的花费一些时间来考虑。

的消息只能是一个文件夹中的时间,所以你想一个文件夹表(包含文件夹“已​​删除邮件”,“收件箱”,“存档”等),从消息到文件夹中的外键。 对于标签,你有一个多对多的关系,所以你需要一个标签表和一个链接表(messages_labels)。 对于主演,一个简单的位列应该做,'未读'相同。

如果我是你,我会设置两个标志一个发送者和另一个用于接收器如果两个标志是真,那么信息应该从数据库中删除,否则保留在数据库中,但是从谁删除了隐藏。

对垃圾做同样的事情。如果发件人和收件人都删除邮件,然后将其从数据库中删除,则可能需要手动运行cron或手动检查。

您可以创建一个表,它连接每个消息,谁拥有它在邮箱中的人MessageContacts。当用户删除消息时,将从MessageContacts中删除一行,但保留原始消息。

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

为什么要删除?我认为没有必要删除任何东西。只需将其隐藏起来,删除后即可。因为,当发送者向多个收件人发送相同的消息时,双方都会遇到问题。然后,您必须检查并标记所有收件人。如果一切正常,然后删除... 我认为没有必要删除任何东西。

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`) 
) 

您可以使用此表存储邮件并根据邮箱操作查询。我正在避免其他表格,如用户详细信息和登录详细信息表格。你可以根据你的需要制作它们。