站内信设计文档
一、数据库结构
1)发信表,存邮件内容(CRM_MessageText):
字段 | 类型 | 说明 | 备注 |
TextId | int | 信件id | 主键,自增长 |
SendId | nvarchar(50) | 发信人id | 即邮件作者 |
Titel | nvarchar(50) | 信件标题 |
|
Text | text | 信件正文 | nvarchar(max)看需求 |
MsgType | int | 发送类型 | 0所有人;1指定某人 |
PostDate | datetime | 发信时间 |
|
2)收信表,存收信用户和状态(CRM_Message):
字段 | 类型 | 说明 | 备注 |
MessageID | int | 收信id | 主键,自增长 |
TextId | int | 信件id(外键) | MessageText表主键 |
RecId | nvarchar(50) | 收信人id |
|
Statue | int | 信件状态 | 0未读,1已读,2删除 |
MsgDate | datetime | 收信时间 |
|
注:发信表中的1条数据可以发送给收件表多个人,是1对多关系。
二、功能描述
1)情景1:发起站内所有人都收到的信息
① 作者(张三)发送邮件,不指定用户(MsgType=0),仅在发件表表添加一条记录:
INSERT INTO [CRM_MessageText] ([TextId],[SendId],[Titel],[Text],[MsgType],[SendDate]) VALUES('张三','标题','信件正文',0,'时间')
②收件人(李四)登录后,加载并处理:
a.将发信表,MsgType=0的记录,取出TextId插入到收信表(已有数据不保存)
SELECT TextId from [CRM_MessageText] where MsgType=0and TextId not in (select TextId from CRM_Message where RecId='李四')--可能有多条记录,程序循环插入收信表
B.插入收信表
INSERT INTO [CRM_Message]([TextId],[RecId],[Statue],[GetDate]) VALUES(1,'李四',0,'时间')
c.读取收信表
select * from CRM_Message a left join CRM_MessageText b on a.TextId=b.TextId where a.Statue !=2and a.RecId='李四' order by b.SendDate desc
至此李四获得了最新的全站信息,且不重复
2)情景2:发起站内指定N个人收的信息
①作者(张三)发送信件,指定了张三等人(MsgType=1),除了发件表添加一条记录以外,还要在收件表添加记录给张三
a.给发信表添加记录(注意:MsgType=1)
INSERT INTO [CRM_MessageText] ([TextId],[SendId],[Titel],[Text],[MsgType],[SendDate]) VALUES('张三','标题','信件正文',1,'时间')--insert后获取这条记录TextId,用于写入收信表
b.给收信表添加记录(这就是和情景1的区别,此步骤是在张三环节完成。情景1是拉数据;情景2是推数据。)
INSERT INTO [CRM_Message]([TextId],[RecId],[Statue],[GetDate]) VALUES(2,'李四',0,'时间')--N个收信人,添加N条数据
②收件人(李四)登录后,获取收信表写入的信息
select * from CRM_Message a left join CRM_MessageText b on a.TextId=b.TextId where a.Statue !=2and a.RecId='李四' order by b.SendDate desc
3)综合情景1和情景2,收件人李四登录后是做了两件事:
①拉取全站信息(MsgType=0),写入收件表(CRM_Message),如果没有全站信息就不插入;
②读取收件表(CRM_Message),此时读取的信件是包含了:全站信息+某人指定给他的信息。
4)修改信息的状态
①将状态改为已阅读(张三打开邮件后自动修改此状态)
UPDATE [CRM_Message] SET [Statue] = 1WHERE MessageID = 1
②将状已阅读设置为未读状态(手动点击按钮改此状态,某些情景需要此功能)
UPDATE [CRM_Message] SET [Statue] = 0 WHERE MessageID = 1
③将状态改为已删除(点击删除按钮。已删除的信息不会被再次拉取,也不会出现在我的信息列表中)
UPDATE [CRM_Message] SET [Statue] = 2 WHERE MessageID = 1
5)情景1可以有效减少数据库冗余。
本文配套源代码CSDN下载地址:http://download.csdn.net/detail/djk8888/9687192