Table 消息功能设置(电子邮件)
Table setup for Messaging Functionality (email)
我们创建了一个应用程序,public 的成员可以通过该应用程序相互搜索并取得联系(将其视为约会网站),如果他们愿意的话,我目前正在开发中构建消息传递功能,但我很好奇如何在数据库中创建 table(s)。
应用当前流程如下:
用户 1 单击用户 2 查看 his/her 个人资料,向下滚动到 his/her 个人资料的底部并在文本区域中键入一些文本,此时单击“发送”,然后我传入数据到数据库,然后我向 User2 发送一封电子邮件,内容为 "you have mail etc"。
考虑到这一点,我假设我在 SQL 服务器中的电子邮件 table 看起来像这样:
Id (PK)(递增1)
ToUserId (FK) // 他们正在联系的用户
FromUserId (FK) // 发送消息的用户
内容 (nvarchar(3000)
Status (int) // 读取,新建,删除,发送
EmailDate(日期时间)
电子邮件已删除(日期时间)
但是这个设置的问题是两个用户可能互相发送/回复,所以我会在一个 table 中有多个条目/状态,这可能成为管理/控制的噩梦(除非我是想多了)
我花了好几个小时试图通过浏览 Web 来获取解决方案,以获取构建消息传递功能的知识,但结果却很糟糕。有没有人能够构建这样的功能,不介意与我分享知识。
你可以把它分成两个 table,像这样:
TblMessage
(
Message_Id int identity(1,1) primary key,
Message_SentDate datetime not null default(getDate()),
Message_Title varchar(100),
Message_Content varchar(max),
Message_SenderId int, -- (fk to users)
Message_IsDraft bit not null default(0), -- when 1 it's saved as draft.
Message_IsDeletedFromOutbox bit not null default(0)-- when 1 don't show on sender outbox
)
TblMessageToRecipient
(
MTR_UserId int, -- (fk to users)
MTR_Message_Id int, -- (fk to message)
MTR_ReadDate datetime null, (if null then status is new)
MTR_DeleteDate datetime null, (if not null then status is deleted)
PRIMARY KEY (MTR_UserId, MTR_Message_Id)
)
通过这种方式,您可以为收件人提供 "delete forever" 消息的选项,并且只需从 TblMessageToRecipient
中删除相关记录。
此外,如果邮件在 TblMessageToRecipient
和 Message_DeletedFromOutbox = 1
上没有引用,您可以从 tblMessage
中完全删除该邮件
(这可以通过计划的 sql 代理作业来完成,以防止 tblMessages
变得太大)
更新:
我希望这会回答您在评论中的问题:
收件人有几种可能的状态:
- 新建 - 当
MTR_ReadDate is null
.
- 读取 - 当
MTR_ReadDate is not null, and MTR_DeleteDate is null
。
- 回收 - 当
MTR_DeleteDate is null
.
- 已删除 - 当记录从
TblMessageToRecipient
. 中删除时
发件人只有 3 种可能的状态:
草稿.
我在 TblMessage 中添加了一个名为 IsDraft 的位列。注意草稿也要保存收件人信息,所以要保存在两个table中,只在草稿箱里给发件人看,不要给收件人看。请注意,当发件人丢弃草稿时,您应该从 tables.
中删除邮件
已发送.
一旦消息在 table 和 IsDraft = 0
和 IsDeletedFromOutbox = 0
中,则表示消息已发送。在这种情况下,在已发消息框中显示给发件人,并显示给收件人。
已从发件箱中删除。
当 IsDeletedFromOutbox = 1
您根本不向发件人显示消息。
如果消息记录在 TblMessageToRecipient
中没有任何引用,您可以从 TblMessages
中删除该记录,因为它已被发件人及其所有收件人删除。
更新二:
为了总结我们在评论中的对话,有两种主要的方式来保持对话结构(意思是 link 消息和回复之间的 [以及它的回复等等...])
一种方法是在 TblMessages
中保留一个 Message_ParentId
可为空的列。
对于不是对旧消息的回复的任何消息,此列将包含 null,但对于回复,它将包含它所回复的消息的消息 ID。
第二种方法是保留一个 Message_ConversationId
列,该列将始终包含一个值。当一条消息是对旧消息的回复时,它的 Message_ConversationId
应该与其父消息相同。当它不是回复时,应该生成它的 ConversationId。由于我们谈论的是 sql 服务器 2008,这意味着每次生成新对话 ID 的最简单方法是添加一个名为 TblConversation
的新 table。这个 table 可以保留一个列 Conversation_Id
,这将是一个 int 标识列,并且要获得一个新的对话 ID,请执行以下操作:
DECLARE @ConversationId int
INSERT INTO TblConversation DEFAULT VALUES
SELECT @ConversationId = SCOPE_IDENTITY()
然后在插入新根消息时使用 @ConversationId
。
我们创建了一个应用程序,public 的成员可以通过该应用程序相互搜索并取得联系(将其视为约会网站),如果他们愿意的话,我目前正在开发中构建消息传递功能,但我很好奇如何在数据库中创建 table(s)。
应用当前流程如下:
用户 1 单击用户 2 查看 his/her 个人资料,向下滚动到 his/her 个人资料的底部并在文本区域中键入一些文本,此时单击“发送”,然后我传入数据到数据库,然后我向 User2 发送一封电子邮件,内容为 "you have mail etc"。
考虑到这一点,我假设我在 SQL 服务器中的电子邮件 table 看起来像这样:
Id (PK)(递增1)
ToUserId (FK) // 他们正在联系的用户
FromUserId (FK) // 发送消息的用户
内容 (nvarchar(3000)
Status (int) // 读取,新建,删除,发送
EmailDate(日期时间)
电子邮件已删除(日期时间)
但是这个设置的问题是两个用户可能互相发送/回复,所以我会在一个 table 中有多个条目/状态,这可能成为管理/控制的噩梦(除非我是想多了)
我花了好几个小时试图通过浏览 Web 来获取解决方案,以获取构建消息传递功能的知识,但结果却很糟糕。有没有人能够构建这样的功能,不介意与我分享知识。
你可以把它分成两个 table,像这样:
TblMessage
(
Message_Id int identity(1,1) primary key,
Message_SentDate datetime not null default(getDate()),
Message_Title varchar(100),
Message_Content varchar(max),
Message_SenderId int, -- (fk to users)
Message_IsDraft bit not null default(0), -- when 1 it's saved as draft.
Message_IsDeletedFromOutbox bit not null default(0)-- when 1 don't show on sender outbox
)
TblMessageToRecipient
(
MTR_UserId int, -- (fk to users)
MTR_Message_Id int, -- (fk to message)
MTR_ReadDate datetime null, (if null then status is new)
MTR_DeleteDate datetime null, (if not null then status is deleted)
PRIMARY KEY (MTR_UserId, MTR_Message_Id)
)
通过这种方式,您可以为收件人提供 "delete forever" 消息的选项,并且只需从 TblMessageToRecipient
中删除相关记录。
此外,如果邮件在 TblMessageToRecipient
和 Message_DeletedFromOutbox = 1
上没有引用,您可以从 tblMessage
中完全删除该邮件
(这可以通过计划的 sql 代理作业来完成,以防止 tblMessages
变得太大)
更新:
我希望这会回答您在评论中的问题:
收件人有几种可能的状态:
- 新建 - 当
MTR_ReadDate is null
. - 读取 - 当
MTR_ReadDate is not null, and MTR_DeleteDate is null
。 - 回收 - 当
MTR_DeleteDate is null
. - 已删除 - 当记录从
TblMessageToRecipient
. 中删除时
发件人只有 3 种可能的状态:
草稿.
我在 TblMessage 中添加了一个名为 IsDraft 的位列。注意草稿也要保存收件人信息,所以要保存在两个table中,只在草稿箱里给发件人看,不要给收件人看。请注意,当发件人丢弃草稿时,您应该从 tables. 中删除邮件
已发送.
一旦消息在 table 和IsDraft = 0
和IsDeletedFromOutbox = 0
中,则表示消息已发送。在这种情况下,在已发消息框中显示给发件人,并显示给收件人。已从发件箱中删除。
当IsDeletedFromOutbox = 1
您根本不向发件人显示消息。
如果消息记录在TblMessageToRecipient
中没有任何引用,您可以从TblMessages
中删除该记录,因为它已被发件人及其所有收件人删除。
更新二:
为了总结我们在评论中的对话,有两种主要的方式来保持对话结构(意思是 link 消息和回复之间的 [以及它的回复等等...])
一种方法是在 TblMessages
中保留一个 Message_ParentId
可为空的列。
对于不是对旧消息的回复的任何消息,此列将包含 null,但对于回复,它将包含它所回复的消息的消息 ID。
第二种方法是保留一个 Message_ConversationId
列,该列将始终包含一个值。当一条消息是对旧消息的回复时,它的 Message_ConversationId
应该与其父消息相同。当它不是回复时,应该生成它的 ConversationId。由于我们谈论的是 sql 服务器 2008,这意味着每次生成新对话 ID 的最简单方法是添加一个名为 TblConversation
的新 table。这个 table 可以保留一个列 Conversation_Id
,这将是一个 int 标识列,并且要获得一个新的对话 ID,请执行以下操作:
DECLARE @ConversationId int
INSERT INTO TblConversation DEFAULT VALUES
SELECT @ConversationId = SCOPE_IDENTITY()
然后在插入新根消息时使用 @ConversationId
。