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 中删除相关记录。
此外,如果邮件在 TblMessageToRecipientMessage_DeletedFromOutbox = 1 上没有引用,您可以从 tblMessage 中完全删除该邮件 (这可以通过计划的 sql 代理作业来完成,以防止 tblMessages 变得太大)

更新:

我希望这会回答您在评论中的问题:

收件人有几种可能的状态:

  1. 新建 - 当MTR_ReadDate is null.
  2. 读取 - 当MTR_ReadDate is not null, and MTR_DeleteDate is null
  3. 回收 - 当MTR_DeleteDate is null.
  4. 已删除 - 当记录从 TblMessageToRecipient.
  5. 中删除时

发件人只有 3 种可能的状态:

  1. 草稿.
    我在 TblMessage 中添加了一个名为 IsDraft 的位列。注意草稿也要保存收件人信息,所以要保存在两个table中,只在草稿箱里给发件人看,不要给收件人看。请注意,当发件人丢弃草稿时,您应该从 tables.

  2. 中删除邮件
  3. 已发送.
    一旦消息在 table 和 IsDraft = 0IsDeletedFromOutbox = 0 中,则表示消息已发送。在这种情况下,在已发消息框中显示给发件人,并显示给收件人。

  4. 已从发件箱中删除
    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