日期:2014-05-16  浏览次数:22029 次

QQ群离线消息怎么存的?
离线消息指的是当群中一部分人不在线时,将其他人发到群的消息。离线消息需要保存起来,等到当初没上线的用户上线的时候发给他们。发送完的消息需要删除掉。
乍一想,想到了以下几种数据库表结构,但是都不理想。主要从存储空间和存取性能方面衡量。
结构一:
HTML code

思路:每条消息对应着各个离线的群员。比如一个群有100人,80人不在线,那么每个群员发出一条消息,就需要插入80条离线消息。
离线消息表(消息ID,用户ID,消息内容,群ID)
优点:用户上线后,只需取出该用户的离线消息后删除该消息就可以了。
缺点:数据冗余极大。插入数据时也比较费时。


结构二:
HTML code

思路:拆分结构一中的表,将用户剥离出来,消息和用户为一对多的关系。
离线消息表(消息ID,消息内容,群ID)
消息用户表(消息ID,用户ID)
优点:相对结构一而言,数据冗余少了。
缺点:
1、判断某条消息何时已经发送完给所有应该发送的群员,以便删除该消息时不方便,每次离线群员上线都要做判断。
2、虽然冗余相对少了,但是数据量还是太大了。


结构三:
HTML code

思路:在群成员表中将群员排序,并给出排序号。然后在离线消息表中加个标志位字段,每个位对应着一个群员的已读状态(假设为未读为0,已读为1),类似10010100101这种形式的值。
离线消息表(消息ID,消息内容,群ID)
优点:
1、没有数据冗余。
2、写入速度快。
缺点:
1、判断某条消息何时已经发送完给所有应该发送的群员,以删除该消息时不方便,每次离线群员上线都要做判断。
2、群员变动,比如有新成员或成员退群时不好处理。



不知各位大牛有何高见,或者其他方案?

------解决方案--------------------
消息表(群ID,消息ID,时间,内容,。。。)
用户表(ID,。。。)
用户消息表(用户ID,群ID,最后访问时间)
------解决方案--------------------
可以从群号%1000来分一千张表。

也可以根据群号%10分10个数据库,然后在各个库里面,根据群号%1000 来分1000张表,这样就是10万张。

群号 用户ID 消息内容 时间

用户每次取完数据,就全部删除该用户的数据。

后台任务定时清除用户的最近的20条消息以外的消息,要把表的大小给控制住,一旦表的大小失控,比如每张表大小超过一定的限度,比如10G,那查询,删除,插入的性能可想而知,最主要的,就是要控制数据表的记录条数。要根据情况分库,分表,来解决这样的问题。