我想制作一个像 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 发送消息时,我将其存储在该表中。但如果用户 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”表中没有找到特定消息 ID 的记录,则该记录将从 Messages 表中删除,因为我们不再需要它。
关于sql - 电子邮件消息系统的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3370647/