IM 的数据库设计 即时通信 聊天
本文主要是给一些开始接触IM系统,做客户端本地数据库的人员介绍的。如有错误还请指出,thx.
自己目前做过两个IM系统,接触过一般常用的IM,都是自己开发没用第三方的,所以就总结一下IM系统中客户端的数据库的基本设计的字段。
这里只是一般需要字段,针对自己的需求(很多时候需要根据UI进行修改定制),需要自己看需求添加or删除。
主要表
一般主要需要建立的表包括:
会话表
聊天详情表
群组表
群组信息表
群成员
联系人表
表字段设计
a. 会话表
一般主要的字段如下:
id->auto increament primary key 自增长主键uid->integer/varchar 该条消息所属消息,比如我登陆了,我发送/接收到消息入库的时候写入自己的uid,他的作用是多用户登陆的时候区分回话表chatId->integet/varchar 服务器生产回话 id当前的回话id,它作用是标识一个回话,比如我跟你聊天or 你跟我聊天,我们的回话id应该是一致的,对于群聊也是,在群中发送消息,每个人的回话id是一致的。c_id->varchar unique,他是标记一台设备上某个用户的唯一回话,用于更新避免插入多条数据的,可以用到sqlite的update or replace,他的值可以是hash(uid+chatid)或者其他,该字段可以只是客户端具有,客户端生成并且自己维护。from->integer/varchar 发送人id(自己发送就是自己的uid,不然就是别人的uid)to->integer/varchar 接收人id(uid/group_id)last_msg->varchar 最后的一条消息内容
last_msg_id->integer/varchar 最后一条消息的id,作用是用于比较,比如在聊天页面中,删除了一条消息,撤回了一条消息之类的,这时候可以根据这个msg_id进行删除修改和更新。
chat_name -> varchar 聊天者的名称,比如我与你聊天,我的表中的这个字段就是你的name,你的表中就是我的name.last_user_name->varchar 最后的发送者名称last_time->integer 最后消息发送时间chat_type->integer 回话类型(群组消息/个人聊天/系统消息)msg_type->integer 消息类型(文字/图片/文件/音乐等)unread_count->integer 改回话未读数目复制代码
该表注意的问题:同一个回话不要插入多条数据,利用c_id来进行replace数据,比如收到一个新的回话消息存在就更新就好了。可以用触发器也可以用sql语句。
b. 聊天详情表
字段设计:
id->integer auto increament primary key 自增长主键msg_id 消息唯一id,一般服务器生成,或者客户端本地使用UUID生成uid->Interger/varchar 所属者uidis_me->Integer 是否是自己发送的(UI显示区分)from->Interger/varchar 发送者uid(可以是自己)from_avatar->Interger/varchar 发送者头像from_name-> varchar 发送者名称to-> Interger/varchar 接受者(uid/group_id)chat_type 会话类型msg_type 消息类型msg-> 消息内容file_info->文件信息json格式send_time->发送时间send_status->发送状态 发送中,发送完成,发送失败extra->把人插入 一般可以为null,预留的额外字段,使用JOSN字符串存储复制代码
c. 群组表
字段设计
id->integer auto increament primary key 自增长主键group_id Integer/varchar uniquegroup_name varchar 群组名称group_name 群组头像group_type 群组类型group_num 群组数量group_create_uid 群组创建者uid复制代码
d. 群组信息表
群组信息的字段可以继承群列表的字段。字段设计
id->integer auto increament primary key 自增长主键group_id Integer/varchar uniquegroup_name varchar 群组名称group_name 群组头像group_type 群组类型group_num 群组数量create_time 创建时间group_create_uid 群组创建者uidgroup_intrduce 群组简介nick_name 个人的群昵称字段。group_role 群组角色字段,比如你是管理员/群主/普通成员等 该字段的作用是可以用来做一个权限控制,比如在一些群里面,需要特定的人才可以拉人,需要群主才可以删除成员等,该字段是server下发的,根据不同的uid请求返回不同的role。group_members 部分群成员的List的JSON数据,该字段看UI设计,可能有的UI在群信息页面默认显示几个群成员,然后点击进入通过另外的接口查看全部群成员。如果是这种情况下,可以在群信息接口下发该群的一些必要显示成员既可。当然,这个字段也可以不用,用一个或者群成员接口替换,查看群信息的时候也同时请求群信息和群成员接口也可以。复制代码
e. 群成员表
字段设计
id->integer auto increament primary key 自增长主键group_id Integer/varcharuser_name varchar 用户名user_avatar varchar 头像group_role 角色复制代码
f. 联系人列表
字段设计
id->integer auto increament primary key 自增长主键uid Integer/varchar uniquesex integerbirthday dateuser_name varchar 用户名user_avatar varchar 头像relation interger 关系:比如好友/陌生人复制代码
其他
可能在有些需求中,消息还会区分平台,比如ios/andoid/mac/windos等
关于信息的更新:某一个人的个人头像or昵称发生了变化,这时候,我们对应的消息页面的UI,朋友列表等需要更新。这种类型的通知,一般是通过tcp推送,后台通过查找该用户的uid然后查找到他的会话跟好友列表然后进行推送。
关于消息的设计:目前我所见是2种,一种是类型微信的常见,具有离线消息的概念,但是一旦客户端确认接收到,服务器将不会保存,也就是不能跨设备保存用户记录,一般用tcp实现。还有一种是有一个同步消息的概念可以跨设备,这种情况下一般使用Tcp+Http实现。他们的逻辑相差还是比较大。
转载: https://juejin.im/post/5bcf3d4e51882577c758d0df
IM 的数据库设计 即时通信 聊天相关推荐
- 如何实现消息功能_小程序中如何实现即时通信聊天功能
微信小程序是现在应用比较广的流量平台之一,当流量越来越多时,就需要在小程序中接入即时通信聊天功能来实现更好的流量变现转化,那么小程序中如何接入实现即时通信聊天功能呢? 什么是即时通信聊天功能即时通信聊 ...
- Android学习之Socket多个客户端即时通信聊天
聊天室的原理是这样的,一个客户端与服务器建立通讯成功,即客户端socket连接到服务器的ServerSocket之后,服务器端程序将对应的socket加入到容器中,为每一个socket创建一条线程,服 ...
- 安卓开发环信即时通信,聊天软件-可实现单聊群聊
最近花了一个星期的时间在B站跟着老师学了环信即时聊天工具的使用 附上学习网站:https://www.bilibili.com/video/BV1cW411V7yd?p=1 附上自己的代码 https ...
- 小程序中如何实现即时通信聊天功能?
项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-ne ...
- Android 腾讯TUIKIT IM即时通信聊天界面语音问题备忘
使用环境: 集成腾讯TUIKIT IMSDK版本4.2.2 聊天界面语音发送 问题描述: 语音发送按钮 点击时弹出语音录制动画弹窗 稍微移动手指,但未超过100像素,非取消发送语音状态,可以发送语音 ...
- 微信小程序实现即时通信聊天功能的实例代码
项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-ne ...
- 基于Android的聊天软件,Socket即时通信,实现用户在线聊天
基于Android的聊天软件,Socket即时通信,单聊,聊天室,可自行扩展功能,完善细节. [实例功能] 1.运行程序,登录界面, 注册账号功能 2.进入主界面,有通讯录, 个人信息. 3.点击好友 ...
- EChat(简易聊天项目)八、Socket实现即时通信(包括部分修改)
利用Socket实现即时通信 在MyEclipse中写Server端 工程结构如图 SocketMessage.java 该类是一个消息类,用于表示消息是由谁发给谁的.消息内容是什么.接收时间是多少, ...
- uniapp集成腾讯即时通信IM,实现一对一聊天,支持文字、表情、语音、图片、视频
uniapp集成腾讯即时通信IM,实现一对一聊天,支持文字.表情.语音.图片.视频 原则 拿来即用,节省开发时间 介绍 腾讯的给的例子内容比较乱,我花了好长时间才集成出来,然后对聊天页面做了UI美化. ...
最新文章
- git ingore添加忽略文件无较的解决方法
- 于媛龄(201552118)第二次作业网调问卷的制作
- MatLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数
- html留言板 php,linux下使用Apache+php实现留言板功能的网站
- 计算机c盘丢失,电脑C盘丢失的视频文件怎么恢复?方法讲解,轻松搞定
- MySQLdb._exceptions.ProgrammingError: (1064, <NULL>)
- android支付平台,android移动支付
- 大数据项目流程(必须会)
- 柔性机械臂_机械臂位置控制概述
- Keil 5(C51, MDK) 官方下载方法
- 利用python分析微信聊天记录
- 【游戏运营】【笔记】 谈谈对游戏运营的理解
- 排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例
- 图片处理中对于Sigmod函数图像的理解
- 【web性能】获取web各个阶段响应时间:服务器响应时间、首页白屏时间、dom渲染完成时间等
- 嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
- 自动化测试学习步骤及路线(超详细)
- 一. 卡尔曼滤波器开发实践之一: 五大公式详解
- 数仓架构实践3:苏宁售后体系四层模型架构
- 谷歌Chrome OS的基本特征
热门文章
- java消费降速的一般方案_Java9 Flow API(译)
- matlab如何化简表达式/多项式?
- 广州话拼音打法全集 你会打几个
- Sqlsugar根据班主任老师姓名或者班主任所带班级里面的学生姓名查询班主任
- java 碳架山地车寿命_【碳纤维自行车寿命】碳纤维自行车能用多久 碳纤维自行车的优缺点...
- ubuntu服务器调风扇转速
- 字节跳动在 Rust 微服务方向的探索和实践
- 随时随地办公,移动办公OA系统开启办公新模式
- Vue报错:error Extra semicolon semi 已解决
- 部署Ambari 2.7.5 + HDP3.1.5