我想制作一个像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行带有重复的正文,即不是一种有效的存储方式。你们能帮我设计消息系统吗?
您需要为此拆分表格。您可能具有以下架构和结构
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表中删除,因为我们不再需要它。