群发“站内信”---一点个人感想

   注: 本文只是看了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我想的是点对点信息时直接对数量加一,在登录后再累加未读的群信息再累加。

posted @ 2010-04-10 20:58  actberw  Views(368)  Comments(0Edit  收藏  举报