我们已经创建了一个应用程序,公众可以互相搜索并联系(如果他们愿意,可以将其视为约会网站),我目前正在建设中消息传递功能,但我对如何在数据库中创建表格感到好奇。
申请的当前流程如下:
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过度思考)
我花了几个小时试图想出一个解决方案,从网上浏览试图获得构建消息功能的知识,但它回来后非常害羞。有没有人能够建立这样的功能,不介意与我分享知识。
答案 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
删除相关记录。
此外,如果邮件没有tblMessage
和TblMessageToRecipient
的引用,您可以完全从Message_DeletedFromOutbox = 1
删除邮件
(这可以通过预定的sql代理作业来完成,以防止tblMessages
变得太大)
我希望这会在评论中回答你的问题:
收件人有几种可能的状态:
MTR_ReadDate is null
。MTR_ReadDate is not null, and MTR_DeleteDate is null
时。 MTR_DeleteDate is null
。TblMessageToRecipient
删除记录。发件人只有3种可能的状态:
<强>草稿即可。
我在TblMessage中添加了一个名为IsDraft的列。请注意,草稿还应保存收件人信息,因此应将其保存在两个表中,只需将其显示在草稿框中的发件人,并且不要将其显示给收件人。请注意,当发件人丢弃草稿时,您应该从两个表中删除该消息。
<强>已发即可。
一旦消息出现在两个表中,IsDraft = 0
和IsDeletedFromOutbox = 0
,就意味着消息已发送。在这种情况下,请在发送的消息框中将其显示给发件人,并将其显示给收件人。
从发件箱中删除。
当IsDeletedFromOutbox = 1
您只是不向发件人显示邮件时
如果邮件记录在TblMessageToRecipient
中没有任何引用,则可以从TblMessages
删除该记录,因为它已被发件人及其所有收件人删除。
更新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
。