群发“站内信”---一点个人感想
注: 本文只是看了http://www.cnblogs.com/grenet/archive/2010/03/08/1680655.html,后的一点感想,不妥之处欢迎大家拍砖!
今天在看了上面链接的一篇关于群发站内信的文章,正好我最近一个项目中涉及到这方面的问题,以下只是个人的一点感想!
针对原文的第二种情况,作者提出了以下解决方案,
"将原先的表格拆分为两个表,将Message的主体放在一个表内,节省空间的占用,数据库的设计如下:
表名:Message
ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);MessageID:站内信编号;Statue:站内信的查看状态;
表名:MessageText
ID:编号;Message:站内信的内容;PDate:站内信发送时间;
"
在message表中,RecID为零时表示接受者为所有人,这样的话站内信的查看状态的管理是个问题,个人认为RecID为零时不能够和状态列同处在一个表中,我的解决方式如下两种:
方案1:
也是分为两个表:
MessageText:MessageTextID(消息文本ID),RecID(接受者ID,当为零时接受者为所有人),MessageContent(消息文本),Date(时间)
Message表: MessageTextID,RecID,Status(消息状态0表示未读,1表示已读),(MessageTextID,RecID为主键)
对于这种方式也分为两种情况:
第一种方式:在发消息时首先在MessageText中插入一条记录,然后在Message中给所有的用户插入一条记录,这样的话在查询时
select t.MessageContent
from Message m inner join MessageText t on m.MessageTextID = t.MessageTextID
where m.RecID = UserID and status=0
但是考虑到活跃的用户只占其中的一部分,
第二种方式:
在发消息时在MessageText中插入一条记录,Message里不插入记录。当用户登录时往Message表中插入记录(或者先在用户登录时提示,察看时在插入)
select MessageID
from MessageText
where (RecID = UserID or RecID = 0)and MessageTextID not in( select MessageTextID from Message where RecID= UserID)
再插入
insert
into Message(MessageTextID,RecID,Status)
values(MessageID,UserID,0)
//是否可以直接写成类似于INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
因为要插入当前登录的用户的ID,所以不知道是否可以?
当用户查看信息时就可以使用
select t.MessageContent
from Message m inner join MessageText t on m.MessageTextID = t.MessageTextID
where m.RecID = UserID and status=0
即可。
方案2:群发和点对点发进行区分,增加一个新表,就是存储点对点信息。对于群发部分还是跟方案1第二种情况一样,查看的时候union就可以了
一点疑问:在登录时一般会有多少条的未读信息的提示,对于未读信息数量的统计,方案1的第二种情况直接在原有数量的基础上累加,对于方案2我想的是点对点信息时直接对数量加一,在登录后再累加未读的群信息再累加。