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表中删除,因为我们不再需要它.
| 归档时间: |
|
| 查看次数: |
29600 次 |
| 最近记录: |