您的位置:首页 > 其它

一个群发站内信的设计

2010-05-06 01:48 176 查看
开始做发送消息的时候没意识到群发很复杂,草草写了一个消息/公告表,然后在前台用两个菜单“个人消息”,“系统消息”取出不同的信息,然后两边用同样的逻辑做“已读,未读,删除”的操作,然后继续后面的流程,今天突然发现我用私信的方式设了公共消息为未读那也太搞了,才发现做群发还是值得仔细考虑番的。
开始的表为:

代码

select a.*,
isnull((select d.unread from wgi_noticestat d where d.usertype=0 and d.userid=1 and d.noticeid=a.id),0) readed  --从状态表读出已读未读状态
from wgi_notice a
where objid=-1 and --查询公共消息,如果要分用户组,在此加条件
((select (select top 1 deleted from wgi_noticestat b where b.usertype=0 and b.userid=1 and b.noticeid=a.id))<>1 --条件:删除状态不为真
or
(select count(c.noticeid) from wgi_noticestat c where c.usertype=0 and c.userid=1 and c.noticeid=a.id)=0) --条件:或在状态表中没有记录
order by a.pubdate desc


一个表就查询出来了,修改状态的时候怎么做呢?
只需要根据“联合主键”查询状态库,假如没有记录,则新增一条记录,设状态值为需要的值;假如查到了这条记录,则update状态值。
另外删除操作会简单些,只需要简单地新增/修改为1就行,因为一旦你”删除“了,你就没机会对它”恢复删除“的,所以你写后台sql的时候可以少送一个状态参数进去,当然,这个不重要了。

最后,结果就是,不管这个系统有多少用户,不管这个系统有多少沉默用户,只有用户在”操作“某条公共消息的时候,才会insert一条公共消息的记录,这样数据库消耗是最少的。既不需要把一条消息重复插N次,也避免了沉默用户而产生的冗余信息,不操作则无记录。
不知道朋友们看明白没有,只是初步设计,希望能提出改进建议。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: