消息功能的表设置(电子邮件)

时间:2015-07-21 09:10:48

标签: sql-server-2008 database-design

我们已经创建了一个应用程序,公众可以互相搜索并联系(如果他们愿意,可以将其视为约会网站),我目前正在建设中消息传递功能,但我对如何在数据库中创建表格感到好奇。

申请的当前流程如下:

User1点击User2查看他/她的个人资料,向下滚动到他/她的个人资料的底部,然后在文本区域中键入一些文本并点击发送,然后我将数据传递到数据库然后发送User2一封电子邮件说"你有邮件等"。

考虑到这一点,我会假设SQL Server中的电子邮件表看起来像这样:

Id(PK)(增加1)

ToUserId(FK)//他们与

联系的用户

FromUserId(FK)//发送消息的用户

内容(nvarchar(3000)

Status(int)// read,new,deleted,sent

EmailDate(datetime)

EmailDeleted(datetime)

但是这个设置的问题是用户可能会相互发送/回复,所以我会在一个表中有多个条目/状态,这可能会成为管理/控制的噩梦(除非我是&m; m过度思考)

我花了几个小时试图想出一个解决方案,从网上浏览试图获得构建消息功能的知识,但它回来后非常害羞。有没有人能够建立这样的功能,不介意与我分享知识。

1 个答案:

答案 0 :(得分:1)

您可以将它分成两个表,如下所示:

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)
)

通过这种方式,您可以向收件人提供“永久删除”邮件的选项,只需从TblMessageToRecipient删除相关记录。
此外,如果邮件没有tblMessageTblMessageToRecipient的引用,您可以完全从Message_DeletedFromOutbox = 1删除邮件 (这可以通过预定的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的列。请注意,草稿还应保存收件人信息,因此应将其保存在两个表中,只需将其显示在草稿框中的发件人,并且不要将其显示给收件人。请注意,当发件人丢弃草稿时,您应该从两个表中删除该消息。

    2. <强>已发即可。
      一旦消息出现在两个表中,IsDraft = 0IsDeletedFromOutbox = 0,就意味着消息已发送。在这种情况下,请在发送的消息框中将其显示给发件人,并将其显示给收件人。

    3. 从发件箱中删除
      IsDeletedFromOutbox = 1您只是不向发件人显示邮件时 如果邮件记录在TblMessageToRecipient中没有任何引用,则可以从TblMessages删除该记录,因为它已被发件人及其所有收件人删除。

    4. 更新2:
      为了总结我们在评论中的对话,有两种方法来保持对话结构(意味着消息和回复之间的联系[以及它的回复等等......)

      一种方法是在Message_ParentId中保留TblMessages可空列。 对于任何不是对旧邮件的回复的邮件,此列将包含null,但对于回复,它将包含作为回复的邮件的邮件ID。

      第二种方法是保留一个始终包含值的Message_ConversationId列。当消息是对旧消息的回复时,它的Message_ConversationId应该与其父消息相同。当它不是回复时,应该生成ConversationId。由于我们讨论的是sql server 2008,这意味着每次生成新会话ID的最简单方法是添加一个名为TblConversation的新表。这个表可以保留一个列Conversation_Id,它将是一个int标识列,并且为了得到一个新的会话ID,可以这样做:

      DECLARE @ConversationId int
      INSERT INTO TblConversation DEFAULT VALUES
      SELECT @ConversationId = SCOPE_IDENTITY()
      

      然后在插入新根消息时使用@ConversationId