仿微信IM软件的客户端数据库设计

发布于 2022-09-02 00:24:18 字数 553 浏览 29 评论 0

软件主要有两个界面:会话界面和联系人界面,会话包括两人会话和群组会话。
界面里的列表元素分别对应两个实体类:Room(代表一个会话)和User。而会话里的消息对应实体类Message。
当涉及持久化以供离线时使用时,该如何设计数据库呢?
目前的想法是客户端登录的不同用户对应不同数据库(比如用户labmem对应labmem.db),所有Room放在表roomtable中,然后每个会话对应的成员列表和消息列表该如何存放呢?
有个想法是把某个会话相应的成员表表名和消息表表名作为roomtable的两列进行存放。
但这样用RecyclerView显示时将十分麻烦,比如会话界面,需要先查询roomtable,再根据结果一个个查询相应的成员表和消息表。
该怎样设计数据库的表比较好呢?
如果知道有比较好的demo的话也请提供链接,谢谢。

补充:
上面说的可能有些不清楚。我拿微信做例子说明:当网络联接不可用时,微信依然是可以查看会话列表、会话的所有聊天记录(只要你没把这个会话删除)和群组会话的所有成员的,还有通讯录列表。
我就想知道实现这样的设计需要怎样设计数据库的表,以方便地将所有信息像微信那样,离线时也可以显示出来。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

安稳善良 2022-09-09 00:24:18

最近我也在写一款开源的IM系统,就说说一些心得吧。

  1. 首先,你需要一个用户资料服务器,用来存储用户信息,用户名,以及用户ID等,这一块的数据库可以用一个单独的服务器来托管。

  2. 其次,你还需要一个IM服务器,IM服务器用来接受客户端的长连接,当客户端登陆IM服务器时,需要 携带着ID发送连接命令,IM服务器用一个HashMap来保存<ID,Socket Object>,另外还需要一个HashMap来保存<ID,Socket State>来进行用户状态的一些逻辑。

  3. 对于IM这种高并发的项目,建议用Redis这种内存数据库,我的做法是,一个Redis库来保存用户的待发送消息,用ID做Key,待发送的消息编号列表做Value;另一个Redis库来储存消息实体,自增ID做Key,序列化后的消息做Value。

  4. 其次是保证消息的不丢失,我现在的方案是,每个客户端发送的每条消息都有一个uid,格式化是客户端发送消息时的时间戳-客户端ID,这样只要客户端没收到服务端的ACK信号(应用层),就一直重发这条消息,但是uid不变,服务端检查uid,如果和数据库里面的重复,就把消息丢弃,再发送一个ACK信号,这样就可以保证客户端发出的消息能到达服务端。

  5. 服务器每次接收到新的消息时,都查看收信者,假设收信者ID是5,那我们就把5所有待接收的消息全发送给5。
    具体的可以看一下NoNOIM

∝单色的世界 2022-09-09 00:24:18

群聊和私聊的信息应该设计成统一一种格式
msg_id
msg_content
msg_from
msg_to
msg_isprivate
还是分成两种格式?
群聊
public_msg_id
public_msg_content
public_msg_from
public_msg_to
私聊
privite_msg_id
privite_msg_content
privite_msg_from
privite_msg_to

太阳公公是暖光 2022-09-09 00:24:18

建议使用ejabberd,XMPP协议,很成熟,系统使用erlang,就是文档不多,我们现在的IM就是基于ejabberd的,可以咨询我

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文