离线消息指的是当群中一部分人不在线时,将其他人发到群的消息。离线消息需要保存起来,等到当初没上线的用户上线的时候发给他们。发送完的消息需要删除掉。
乍一想,想到了以下几种数据库表结构,但是都不理想。主要从存储空间和存取性能方面衡量。
结构一:思路:每条消息对应着各个离线的群员。比如一个群有100人,80人不在线,那么每个群员发出一条消息,就需要插入80条离线消息。
离线消息表(消息ID,用户ID,消息内容,群ID)
优点:用户上线后,只需取出该用户的离线消息后删除该消息就可以了。
缺点:数据冗余极大。插入数据时也比较费时。结构二:思路:拆分结构一中的表,将用户剥离出来,消息和用户为一对多的关系。
离线消息表(消息ID,消息内容,群ID)
消息用户表(消息ID,用户ID)
优点:相对结构一而言,数据冗余少了。
缺点:
1、判断某条消息何时已经发送完给所有应该发送的群员,以便删除该消息时不方便,每次离线群员上线都要做判断。
2、虽然冗余相对少了,但是数据量还是太大了。结构三:思路:在群成员表中将群员排序,并给出排序号。然后在离线消息表中加个标志位字段,每个位对应着一个群员的已读状态(假设为未读为0,已读为1),类似10010100101这种形式的值。
离线消息表(消息ID,消息内容,群ID)
优点:
1、没有数据冗余。
2、写入速度快。
缺点:
1、判断某条消息何时已经发送完给所有应该发送的群员,以删除该消息时不方便,每次离线群员上线都要做判断。
2、群员变动,比如有新成员或成员退群时不好处理。
不知各位大牛有何高见,或者其他方案?
乍一想,想到了以下几种数据库表结构,但是都不理想。主要从存储空间和存取性能方面衡量。
结构一:思路:每条消息对应着各个离线的群员。比如一个群有100人,80人不在线,那么每个群员发出一条消息,就需要插入80条离线消息。
离线消息表(消息ID,用户ID,消息内容,群ID)
优点:用户上线后,只需取出该用户的离线消息后删除该消息就可以了。
缺点:数据冗余极大。插入数据时也比较费时。结构二:思路:拆分结构一中的表,将用户剥离出来,消息和用户为一对多的关系。
离线消息表(消息ID,消息内容,群ID)
消息用户表(消息ID,用户ID)
优点:相对结构一而言,数据冗余少了。
缺点:
1、判断某条消息何时已经发送完给所有应该发送的群员,以便删除该消息时不方便,每次离线群员上线都要做判断。
2、虽然冗余相对少了,但是数据量还是太大了。结构三:思路:在群成员表中将群员排序,并给出排序号。然后在离线消息表中加个标志位字段,每个位对应着一个群员的已读状态(假设为未读为0,已读为1),类似10010100101这种形式的值。
离线消息表(消息ID,消息内容,群ID)
优点:
1、没有数据冗余。
2、写入速度快。
缺点:
1、判断某条消息何时已经发送完给所有应该发送的群员,以删除该消息时不方便,每次离线群员上线都要做判断。
2、群员变动,比如有新成员或成员退群时不好处理。
不知各位大牛有何高见,或者其他方案?
用户表(ID,)
用户消息表(用户ID,群ID,最后访问时间)