OpenIM 源码深度解析系列(十八):附录二数据库结构

902 阅读38分钟

附录二数据库结构

📋 概述

OpenIM是一个完整的即时通讯解决方案,由三个核心项目组成,每个项目都有自己的数据存储系统:

  • open-im-server: 服务端核心,使用MongoDB存储业务数据
  • chat: 聊天管理系统,使用MongoDB存储管理和用户数据
  • openim-sdk-core: 客户端SDK,使用SQLite存储本地数据

本文档详细描述了这三个项目的完整数据库架构,涵盖所有数据表的结构、字段定义、索引设计和业务功能。

🏗️ 整体架构

graph TB
    subgraph "Server端 (MongoDB)"
        A[open-im-server<br/>业务核心数据]
        B[chat<br/>管理和用户数据]
    end
    
    subgraph "Client端 (SQLite)"
        C[openim-sdk-core<br/>本地缓存数据]
    end
    
    A <--> C
    B <--> C
    
    A -.->|消息推送| D[消息网关]
    B -.->|用户管理| D
    D --> C

📊 数据库分类

1. open-im-server (MongoDB)

  • 用途: 即时通讯业务核心数据存储
  • 数据类型: 消息、会话、用户关系、群组等
  • 特点: 高并发读写、消息持久化、分片存储

2. chat (MongoDB)

  • 用途: 聊天系统管理和扩展功能
  • 数据类型: 用户账户、管理配置、机器人等
  • 特点: 管理功能、用户认证、系统配置

3. openim-sdk-core (SQLite)

  • 用途: 客户端本地数据缓存
  • 数据类型: 本地消息、会话状态、离线数据等
  • 特点: 本地存储、离线支持、快速查询

📚 数据库详细结构

🚀 open-im-server 项目数据库 (MongoDB)

📋 表结构概览

open-im-server使用MongoDB作为主数据库,包含16个核心集合,涵盖用户、消息、群组、好友关系等所有业务数据。


1. User - 用户基础信息表

功能描述: 存储系统中所有用户的基础信息,是用户体系的核心表。

集合名: user

字段名类型描述
user_idstring用户唯一标识ID
nicknamestring用户昵称
face_urlstring用户头像URL地址
exstring扩展字段,存储额外信息
app_manger_levelint32应用管理员等级(0-普通用户)
global_recv_msg_optint32全局消息接收选项(0-接收,1-不接收,2-接收不提醒)
create_timetime.Time用户创建时间

索引设计:

  • user_id: 唯一索引,主键查询

业务场景:

  • 用户注册信息存储
  • 用户基础信息查询和更新
  • 全局消息接收策略控制

2. Friend - 好友关系表

功能描述: 存储用户间的好友关系,支持双向好友关系和好友备注。

集合名: friend

字段名类型描述
_idObjectIDMongoDB自动生成的主键
owner_user_idstring好友关系拥有者用户ID
friend_user_idstring好友的用户ID
remarkstring好友备注名称
create_timetime.Time好友关系建立时间
add_sourceint32添加好友的来源方式
operator_user_idstring操作者用户ID
exstring扩展字段
is_pinnedbool是否置顶好友

索引设计:

  • owner_user_id + friend_user_id: 复合唯一索引,防重复添加
  • owner_user_id: 普通索引,查询用户好友列表

业务场景:

  • 好友关系管理
  • 好友列表查询
  • 好友备注设置

3. FriendRequest - 好友申请表

功能描述: 记录好友申请的发送、接收和处理状态,支持申请消息和处理结果。

集合名: friend_request

字段名类型描述
from_user_idstring发送好友申请的用户ID
to_user_idstring接收好友申请的用户ID
handle_resultint32处理结果(0-未处理,1-同意,-1-拒绝)
req_msgstring好友申请附带消息
create_timetime.Time申请创建时间
handler_user_idstring处理申请的用户ID
handle_msgstring处理时的回复消息
handle_timetime.Time申请处理时间
exstring扩展字段

索引设计:

  • from_user_id + to_user_id: 复合唯一索引,防重复申请
  • to_user_id: 普通索引,查询收到的申请
  • from_user_id: 普通索引,查询发出的申请

业务场景:

  • 好友申请发送和接收
  • 申请状态管理
  • 申请历史记录查询

4. Black - 黑名单表

功能描述: 存储用户的黑名单关系,被拉黑用户无法发送消息给对方。

集合名: black

字段名类型描述
owner_user_idstring黑名单拥有者用户ID
block_user_idstring被拉黑的用户ID
create_timetime.Time拉黑时间
add_sourceint32拉黑来源
operator_user_idstring操作者用户ID
exstring扩展字段

索引设计:

  • owner_user_id + block_user_id: 复合唯一索引
  • owner_user_id: 普通索引,查询黑名单列表

业务场景:

  • 用户拉黑功能
  • 黑名单管理
  • 消息发送权限控制

5. Group - 群组信息表

功能描述: 存储群组的基础信息,包括群名称、公告、权限设置等。

集合名: group

字段名类型描述
group_idstring群组唯一标识ID
group_namestring群组名称
notificationstring群公告内容
introductionstring群介绍
face_urlstring群头像URL
create_timetime.Time群组创建时间
exstring扩展字段
statusint32群状态(0-正常,1-禁言,2-解散)
creator_user_idstring群创建者用户ID
group_typeint32群类型(0-普通群,1-超级群,2-工作群)
need_verificationint32入群验证(0-直接入群,1-需要验证,2-禁止入群)
look_member_infoint32查看成员信息权限
apply_member_friendint32申请成员为好友权限
notification_update_timetime.Time群公告更新时间
notification_user_idstring群公告更新者ID

索引设计:

  • group_id: 唯一索引
  • creator_user_id: 普通索引,查询创建的群组

业务场景:

  • 群组创建和管理
  • 群信息查询和更新
  • 群权限控制

6. GroupMember - 群成员表

功能描述: 存储群组成员信息,包括角色权限、加入时间、禁言状态等。

集合名: group_member

字段名类型描述
group_idstring群组ID
user_idstring成员用户ID
nicknamestring群内昵称
face_urlstring用户头像URL
role_levelint32角色等级(20-普通成员,60-管理员,100-群主)
join_timetime.Time加入群组时间
join_sourceint32加入来源
inviter_user_idstring邀请者用户ID
operator_user_idstring操作者用户ID
mute_end_timetime.Time禁言结束时间
exstring扩展字段

索引设计:

  • group_id + user_id: 复合唯一索引
  • group_id: 普通索引,查询群成员
  • user_id: 普通索引,查询用户加入的群

业务场景:

  • 群成员管理
  • 权限控制
  • 禁言管理

7. GroupRequest - 群组申请表

功能描述: 记录用户加入群组的申请请求和处理状态。

集合名: group_request

字段名类型描述
user_idstring申请用户ID
group_idstring申请加入的群组ID
handle_resultint32处理结果(0-未处理,1-同意,-1-拒绝)
req_msgstring申请消息
handled_msgstring处理回复消息
req_timetime.Time申请时间
handle_user_idstring处理者用户ID
handled_timetime.Time处理时间
join_sourceint32加入来源
inviter_user_idstring邀请者用户ID
exstring扩展字段

索引设计:

  • user_id + group_id: 复合唯一索引
  • group_id: 普通索引,查询群申请
  • user_id: 普通索引,查询用户申请

业务场景:

  • 入群申请管理
  • 申请审核流程
  • 申请历史记录

8. Conversation - 会话表

功能描述: 存储用户的会话信息,包括单聊和群聊会话的配置和状态。

集合名: conversation

字段名类型描述
owner_user_idstring会话拥有者用户ID
conversation_idstring会话唯一标识ID
conversation_typeint32会话类型(1-单聊,2-群聊)
user_idstring单聊对方用户ID
group_idstring群聊群组ID
recv_msg_optint32消息接收选项
is_pinnedbool是否置顶会话
is_private_chatbool是否私密聊天
burn_durationint32阅后即焚时长
group_at_typeint32群@类型
attached_infostring附加信息
exstring扩展字段
max_seqint64最大消息序列号
min_seqint64最小消息序列号
create_timetime.Time创建时间
is_msg_destructbool是否开启消息销毁
msg_destruct_timeint64消息销毁时间
latest_msg_destruct_timetime.Time最新消息销毁时间

索引设计:

  • owner_user_id + conversation_id: 复合唯一索引
  • owner_user_id: 普通索引,查询用户会话列表

业务场景:

  • 会话管理
  • 消息接收设置
  • 阅后即焚功能

9. MsgDocModel - 消息文档表

功能描述: 存储聊天消息的主要数据结构,采用分片存储策略提高查询性能。

集合名: msg

字段名类型描述
doc_idstring文档ID,格式:会话ID:分片索引
msgs[]MsgInfoModel消息数组,每个文档存储100条消息

MsgInfoModel结构:

字段名类型描述
msgMsgDataModel消息数据
revokeRevokeModel撤回信息
del_list[]string删除列表
is_readbool是否已读

MsgDataModel结构:

字段名类型描述
send_idstring发送者用户ID
recv_idstring接收者ID
group_idstring群组ID
client_msg_idstring客户端消息ID
server_msg_idstring服务端消息ID
sender_platform_idint32发送者平台ID
sender_nicknamestring发送者昵称
sender_face_urlstring发送者头像
session_typeint32会话类型
msg_fromint32消息来源
content_typeint32内容类型
contentstring消息内容
seqint64消息序列号
send_timeint64发送时间
create_timeint64创建时间
statusint32消息状态
is_readbool是否已读
optionsmap[string]bool消息选项
offline_pushOfflinePushModel离线推送信息
at_user_id_list[]string@用户列表
attached_infostring附加信息
exstring扩展字段

索引设计:

  • doc_id: 唯一索引
  • 按会话ID分片存储,每100条消息一个文档

业务场景:

  • 消息存储和查询
  • 消息分页拉取
  • 消息状态管理

10. SeqUser - 用户序列号表

功能描述: 记录用户在每个会话中的消息序列号信息,用于消息同步。

集合名: seq_user

字段名类型描述
user_idstring用户ID
conversation_idstring会话ID
min_seqint64最小序列号
max_seqint64最大序列号
read_seqint64已读序列号

索引设计:

  • user_id + conversation_id: 复合唯一索引

业务场景:

  • 消息同步控制
  • 已读状态管理
  • 未读消息计算

11. SeqConversation - 会话序列号表

功能描述: 记录会话的全局消息序列号,用于消息排序和同步。

集合名: seq_conversation

字段名类型描述
conversation_idstring会话ID
max_seqint64最大序列号
min_seqint64最小序列号

索引设计:

  • conversation_id: 唯一索引

业务场景:

  • 消息序列号分配
  • 会话消息计数
  • 消息同步基准

12. Object - 对象存储表

功能描述: 记录上传文件的元数据信息,包括文件哈希、大小、类型等。

集合名: object

字段名类型描述
namestring文件名称
user_idstring上传用户ID
hashstring文件哈希值
enginestring存储引擎
keystring存储键值
sizeint64文件大小
content_typestring文件MIME类型
groupstring文件分组
create_timetime.Time创建时间

索引设计:

  • hash: 唯一索引,文件去重
  • user_id: 普通索引,查询用户文件

业务场景:

  • 文件上传管理
  • 文件去重处理
  • 存储空间统计

13. Log - 系统日志表

功能描述: 记录系统操作日志和用户行为日志,用于问题排查和数据分析。

集合名: log

字段名类型描述
log_idstring日志唯一ID
platformstring平台信息
user_idstring用户ID
create_timetime.Time创建时间
urlstring日志文件URL
file_namestring日志文件名
system_typestring系统类型
app_frameworkstring应用框架
versionstring版本号
exstring扩展字段

索引设计:

  • log_id: 唯一索引
  • user_id: 普通索引
  • create_time: 时间索引

业务场景:

  • 系统日志记录
  • 问题排查分析
  • 用户行为统计

14. SubscribeUser - 用户订阅表

功能描述: 管理用户间的在线状态订阅关系,用于实时状态推送。

集合名: subscribe_user

字段名类型描述
user_idstring订阅者用户ID
user_id_list[]string被订阅用户ID列表

索引设计:

  • user_id: 唯一索引

业务场景:

  • 在线状态订阅
  • 状态变化通知
  • 好友在线提醒

15. Application - 应用版本表

功能描述: 管理客户端应用的版本信息,支持版本控制和强制更新。

集合名: application

字段名类型描述
_idObjectIDMongoDB主键
platformstring平台(iOS/Android/Web)
hotbool是否热更新
versionstring版本号
urlstring下载地址
textstring更新说明
forcebool是否强制更新
latestbool是否最新版本
create_timetime.Time创建时间

索引设计:

  • platform + version: 复合索引
  • latest: 布尔索引

业务场景:

  • 版本发布管理
  • 客户端更新控制
  • 平台版本查询

16. VersionLog - 版本日志表

功能描述: 记录数据变更的版本信息,支持增量同步和数据回滚。

集合名: version_log

字段名类型描述
_idObjectIDMongoDB主键
d_idstring数据ID
logs[]VersionLogElem版本日志元素数组
versionuint当前版本号
deleteduint删除版本号
last_updatetime.Time最后更新时间

VersionLogElem结构:

字段名类型描述
e_idstring元素ID
stateint32状态(1-插入,2-删除,3-更新)
versionuint版本号
last_updatetime.Time更新时间

索引设计:

  • d_id: 普通索引
  • version: 普通索引

业务场景:

  • 数据版本控制
  • 增量同步支持
  • 数据变更追踪

💬 chat 项目数据库 (MongoDB)

📋 表结构概览

chat项目使用MongoDB作为数据库,按功能模块分为三大类:Admin模块(管理系统)、Bot模块(智能机器人)、Chat模块(聊天系统),共包含18个集合。


🔧 Admin模块 - 管理系统数据表

1. admin - 管理员表

功能描述: 存储系统管理员账户信息,支持分级权限管理。

集合名: admin

字段名类型描述
accountstring管理员账号(唯一标识)
passwordstring登录密码(加密存储)
face_urlstring管理员头像URL
nicknamestring管理员昵称
user_idstring关联的用户ID
levelint32管理员权限等级
create_timetime.Time账户创建时间

索引设计:

  • account: 唯一索引,用于登录验证

业务场景:

  • 管理员登录认证
  • 权限等级控制
  • 管理员账户管理

2. applet - 小程序管理表

功能描述: 管理系统中的小程序应用,支持版本控制和上下架管理。

集合名: applet

字段名类型描述
idstring小程序唯一标识ID
namestring小程序显示名称
app_idstring小程序应用ID
iconstring小程序图标URL
urlstring小程序访问地址
md5string程序包MD5校验值
sizeint64程序包文件大小
versionstring小程序版本号
priorityuint32显示优先级
statusint32状态(1-上架,2-下架)
create_timetime.Time创建时间

索引设计:

  • id: 唯一索引
  • status: 普通索引,筛选上架应用

业务场景:

  • 小程序应用管理
  • 版本发布控制
  • 应用商店展示

3. application - 应用程序版本表

功能描述: 管理移动端应用的版本信息,支持强制更新和热更新策略。

集合名: application

字段名类型描述
_idObjectIDMongoDB主键
platformstring目标平台(iOS/Android/Web)
versionstring应用版本号
urlstring安装包下载地址
textstring版本更新说明
force_updatebool是否强制更新
latestbool是否为最新版本
hot_updatebool是否支持热更新
create_timetime.Time版本发布时间

索引设计:

  • platform + version: 复合唯一索引
  • latest: 布尔索引,快速查询最新版本

业务场景:

  • 应用版本发布
  • 客户端更新策略
  • 平台版本管理

4. client_config - 客户端配置表

功能描述: 存储客户端的动态配置参数,支持热配置更新。

集合名: client_config

字段名类型描述
keystring配置项键名(唯一)
valuestring配置项值

索引设计:

  • key: 唯一索引

业务场景:

  • 客户端功能开关
  • 动态参数配置
  • 运营活动配置

5. forbidden_account - 封禁账户表

功能描述: 管理被封禁的用户账户,记录封禁原因和操作记录。

集合名: forbidden_account

字段名类型描述
user_idstring被封禁用户ID(唯一)
reasonstring封禁原因说明
operator_user_idstring执行封禁的管理员ID
create_timetime.Time封禁执行时间
exstring附加信息

索引设计:

  • user_id: 唯一索引

业务场景:

  • 用户账户封禁
  • 违规行为处理
  • 封禁记录追踪

6. invitation_register - 邀请码注册表

功能描述: 管理邀请码系统,跟踪邀请关系和使用状态。

集合名: invitation_register

字段名类型描述
invitation_codestring邀请码(唯一)
user_idstring邀请码创建者用户ID
used_by_user_idstring使用邀请码的用户ID
create_timetime.Time邀请码创建时间
used_timetime.Time邀请码使用时间

索引设计:

  • invitation_code: 唯一索引

业务场景:

  • 邀请码生成分发
  • 注册邀请关系
  • 推广效果统计

7. ip_forbidden - IP封禁表

功能描述: 管理IP地址的访问控制策略,支持细粒度的限制规则。

集合名: ip_forbidden

字段名类型描述
ipstringIP地址(唯一)
limit_registerint32限制注册(0-允许,1-禁止)
limit_loginint32限制登录(0-允许,1-禁止)
create_timetime.Time规则创建时间
exstring扩展信息

索引设计:

  • ip: 唯一索引

业务场景:

  • IP黑名单管理
  • 恶意访问防护
  • 地域访问控制

8. limit_user_login_ip - 用户登录IP限制表

功能描述: 限制特定用户只能从指定IP地址登录,增强账户安全。

集合名: limit_user_login_ip

字段名类型描述
user_idstring受限用户ID
ipstring允许登录的IP地址
create_timetime.Time限制规则创建时间
exstring扩展信息

索引设计:

  • user_id + ip: 复合唯一索引

业务场景:

  • 用户IP白名单
  • 高级账户安全
  • 企业用户管理

9. register_add_friend - 注册默认好友表

功能描述: 配置新用户注册时自动添加的默认好友列表。

集合名: register_add_friend

字段名类型描述
user_idstring默认好友用户ID(唯一)
create_timetime.Time配置创建时间
exstring扩展信息

索引设计:

  • user_id: 唯一索引

业务场景:

  • 新用户引导
  • 默认好友配置
  • 运营活动支持

10. register_add_group - 注册默认群组表

功能描述: 配置新用户注册时自动加入的默认群组列表。

集合名: register_add_group

字段名类型描述
group_idstring默认群组ID(唯一)
create_timetime.Time配置创建时间
exstring扩展信息

索引设计:

  • group_id: 唯一索引

业务场景:

  • 新用户群组引导
  • 官方群组推广
  • 社区建设支持

🤖 Bot模块 - 智能机器人数据表

11. agent - 智能代理表

功能描述: 存储AI智能代理的配置信息和服务状态。

集合名: agent

字段名类型描述
user_idstring代理关联用户ID(唯一)
nicknamestring代理显示昵称
face_urlstring代理头像URL
descriptionstring代理功能描述
keystringAPI访问密钥
statusint32服务状态(1-启用,0-禁用)
create_timetime.Time代理创建时间
exstring扩展配置参数

索引设计:

  • user_id: 唯一索引

业务场景:

  • AI代理服务管理
  • 智能客服配置
  • 机器人功能开关

12. conversation_resp_id - 对话响应ID表

功能描述: 记录AI代理在不同会话中的响应状态,维护对话上下文。

集合名: conversation_resp_id

字段名类型描述
conversation_idstring会话ID
agent_idstring代理ID
last_resp_idstring最后响应消息ID
create_timetime.Time记录创建时间

索引设计:

  • conversation_id + agent_id: 复合唯一索引

业务场景:

  • AI对话上下文管理
  • 响应状态跟踪
  • 会话连续性保证

💬 Chat模块 - 聊天系统数据表

13. account - 用户账户表

功能描述: 存储用户的登录凭证信息,支持密码验证和安全管理。

集合名: account

字段名类型描述
user_idstring用户ID(唯一标识)
passwordstring登录密码(加密存储)
change_timetime.Time密码最后修改时间
create_timetime.Time账户创建时间

索引设计:

  • user_id: 唯一索引

业务场景:

  • 用户密码验证
  • 账户安全管理
  • 登录凭证存储

14. attribute - 用户属性表

功能描述: 存储用户的详细个人信息和偏好设置,支持多维度用户画像。

集合名: attribute

字段名类型描述
user_idstring用户ID(唯一)
accountstring用户账号
phone_numberstring手机号码
area_codestring国家/地区码
emailstring邮箱地址
nicknamestring用户昵称
face_urlstring用户头像URL
genderint32性别(0-未知,1-男,2-女)
birthtime.Time出生日期
levelint32用户等级
allow_add_friendint32允许添加好友
allow_beepint32允许提示音
allow_vibrationint32允许震动
global_recv_msg_optint32全局消息接收选项
register_typeint32注册方式类型

索引设计:

  • user_id: 唯一索引
  • account: 普通索引
  • email: 普通索引
  • area_code + phone_number: 复合索引

业务场景:

  • 用户个人信息管理
  • 多维度用户搜索
  • 隐私设置控制

15. credential - 登录凭证表

功能描述: 统一管理用户的多种登录凭证(手机、邮箱、账号),支持多渠道登录。

集合名: credential

字段名类型描述
user_idstring用户ID
accountstring凭证账号(唯一)
typeint32凭证类型(1-手机,2-邮箱,3-账号)
allow_changebool是否允许修改

索引设计:

  • user_id + type: 复合唯一索引
  • account: 唯一索引

业务场景:

  • 多渠道登录支持
  • 凭证唯一性保证
  • 登录方式管理

16. register - 用户注册表

功能描述: 记录用户的注册信息和设备信息,用于安全审计和数据分析。

集合名: register

字段名类型描述
user_idstring用户ID(唯一)
device_idstring注册设备ID
ipstring注册IP地址
platformstring注册平台
account_typestring账户类型
modeint32注册方式
create_timetime.Time注册时间

索引设计:

  • user_id: 唯一索引

业务场景:

  • 用户注册记录
  • 设备信息统计
  • 注册来源分析

17. user_login_record - 用户登录记录表

功能描述: 记录用户的登录历史,支持安全监控和行为分析。

集合名: user_login_record

字段名类型描述
user_idstring用户ID
login_timetime.Time登录时间
ipstring登录IP地址
device_idstring登录设备ID
platformstring登录平台

索引设计:

  • user_id: 普通索引
  • login_time: 时间索引,支持时间范围查询

业务场景:

  • 登录行为分析
  • 异常登录检测
  • 用户活跃度统计

18. verify_code - 验证码表

功能描述: 管理短信和邮箱验证码,支持防刷机制和使用控制。

集合名: verify_code

字段名类型描述
_idObjectIDMongoDB主键
accountstring验证目标(手机号/邮箱)
platformstring请求平台
codestring验证码内容
durationuint有效期(秒)
countint验证尝试次数
usedbool是否已使用
create_timetime.Time创建时间

索引设计:

  • account: 普通索引
  • create_time: TTL索引,自动清理过期数据

业务场景:

  • 短信/邮箱验证
  • 防刷验证机制
  • 验证码生命周期管理

📱 openim-sdk-core 项目数据库 (SQLite)

📋 表结构概览

openim-sdk-core使用SQLite作为客户端本地数据库,包含21个核心表,涵盖本地消息存储、会话管理、用户关系、离线数据等所有客户端功能。


👥 用户关系相关表

1. local_friends - 本地好友信息表

功能描述: 存储用户的好友关系和好友基本信息,支持离线查看好友列表。

表名: local_friends

字段名类型描述
owner_user_idvarchar(64)好友关系拥有者用户ID(主键)
friend_user_idvarchar(64)好友的用户ID(主键)
remarkvarchar(255)好友备注名
create_timeint64创建时间戳
add_sourceint32添加好友的来源方式
operator_user_idvarchar(64)操作者用户ID
nicknamevarchar(255)好友昵称
face_urlvarchar(255)好友头像URL
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息
is_pinnedbool是否置顶好友

索引设计:

  • 主键:owner_user_id + friend_user_id
  • owner_user_id: 查询用户好友列表

业务场景:

  • 离线好友列表展示
  • 好友信息快速查询
  • 好友备注管理

2. local_friend_requests - 本地好友申请记录表

功能描述: 存储发送和接收的好友申请记录,支持离线查看申请状态。

表名: local_friend_requests

字段名类型描述
from_user_idvarchar(64)发送申请的用户ID(主键)
from_nicknamevarchar(255)发送者昵称
from_face_urlvarchar(255)发送者头像URL
to_user_idvarchar(64)接收申请的用户ID(主键)
to_nicknamevarchar(255)接收者昵称
to_face_urlvarchar(255)接收者头像URL
handle_resultint32处理结果(0-未处理,1-同意,-1-拒绝)
req_msgvarchar(255)申请消息
create_timeint64创建时间戳
handler_user_idvarchar(64)处理者用户ID
handle_msgvarchar(255)处理消息
handle_timeint64处理时间戳
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息

索引设计:

  • 主键:from_user_id + to_user_id

业务场景:

  • 好友申请记录管理
  • 申请状态跟踪
  • 离线申请处理

3. local_blacks - 本地黑名单表

功能描述: 存储用户的黑名单信息,支持离线黑名单管理。

表名: local_blacks

字段名类型描述
owner_user_idvarchar(64)黑名单拥有者用户ID(主键)
block_user_idvarchar(64)被拉黑的用户ID(主键)
nicknamevarchar(255)被拉黑用户昵称
face_urlvarchar(255)被拉黑用户头像URL
create_timeint64创建时间戳
add_sourceint32添加来源
operator_user_idvarchar(64)操作者用户ID
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息

索引设计:

  • 主键:owner_user_id + block_user_id

业务场景:

  • 黑名单管理
  • 消息发送权限检查
  • 离线黑名单查询

👨‍👩‍👧‍👦 群组相关表

4. local_groups - 本地群组信息表

功能描述: 存储用户所在群组的基本信息,支持离线群组管理。

表名: local_groups

字段名类型描述
group_idvarchar(64)群组ID(主键)
group_namevarchar(255)群组名称
notificationvarchar(255)群公告
introductionvarchar(255)群介绍
face_urlvarchar(255)群头像URL
create_timeint64创建时间戳
statusint32群状态
creator_user_idvarchar(64)创建者用户ID
group_typeint32群类型
owner_user_idvarchar(64)群主用户ID
member_countint32群成员数量
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息
need_verificationint32是否需要验证入群
look_member_infoint32是否可以查看成员信息
apply_member_friendint32是否可以申请成员为好友
notification_update_timeint64群公告更新时间
notification_user_idvarchar(64)群公告更新者ID

索引设计:

  • 主键:group_id

业务场景:

  • 群组信息展示
  • 群组列表管理
  • 离线群组查询

5. local_group_members - 本地群成员信息表

功能描述: 存储群组成员的详细信息和权限,支持离线成员列表查看。

表名: local_group_members

字段名类型描述
group_idvarchar(64)群组ID(主键)
user_idvarchar(64)成员用户ID(主键)
nicknamevarchar(255)成员昵称
face_urlvarchar(255)成员头像URL
role_levelint32角色等级(1-普通成员,2-管理员,3-群主)
join_timeint64加入群组时间戳
join_sourceint32加入来源
inviter_user_idvarchar(64)邀请者用户ID
mute_end_timeint64禁言结束时间戳
operator_user_idvarchar(64)操作者用户ID
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息

索引设计:

  • 主键:group_id + user_id
  • role_level: 按角色查询
  • join_time: 按加入时间排序

业务场景:

  • 群成员列表展示
  • 成员权限管理
  • 离线成员信息查询

6. local_group_requests - 本地群组申请记录表

功能描述: 存储群组加入申请的记录信息,支持离线申请管理。

表名: local_group_requests

字段名类型描述
group_idvarchar(64)群组ID(主键)
group_namevarchar(255)群组名称
notificationvarchar(255)群公告
introductionvarchar(255)群介绍
group_face_urlvarchar(255)群头像URL
create_timeint64创建时间戳
statusint32群状态
creator_user_idvarchar(64)创建者用户ID
group_typeint32群类型
owner_user_idvarchar(64)群主用户ID
member_countint32群成员数量
user_idvarchar(64)申请者用户ID(主键)
nicknamevarchar(255)申请者昵称
user_face_urlvarchar(255)申请者头像URL
handle_resultint32处理结果(0-未处理,1-同意,-1-拒绝)
req_msgvarchar(255)申请消息
handled_msgvarchar(255)处理消息
req_timeint64申请时间戳
handle_user_idvarchar(64)处理者用户ID
handled_timeint64处理时间戳
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息
join_sourceint32加入来源
inviter_user_idvarchar(64)邀请者用户ID

索引设计:

  • 主键:group_id + user_id

业务场景:

  • 群组申请记录
  • 申请状态管理
  • 离线申请处理

💬 消息和会话相关表

7. local_chat_logs - 本地聊天记录表

功能描述: 存储所有的聊天消息记录,是消息存储的核心表,支持离线消息查看。

表名: local_chat_logs

字段名类型描述
client_msg_idchar(64)客户端消息ID(主键)
server_msg_idchar(64)服务端消息ID
send_idchar(64)发送者用户ID
recv_idchar(64)接收者ID(用户ID或群组ID)
sender_platform_idint32发送者平台ID
sender_nicknamevarchar(255)发送者昵称
sender_face_urlvarchar(255)发送者头像URL
session_typeint32会话类型(1-单聊,2-群聊)
msg_fromint32消息来源(100-用户发送,200-系统通知)
content_typeint32消息内容类型(101-文本,102-图片等)
contentvarchar(1000)消息内容JSON字符串
is_readbool是否已读
statusint32消息状态(1-发送中,2-发送成功,3-发送失败)
seqint64消息序列号
send_timeint64发送时间戳
create_timeint64创建时间戳
attached_infovarchar(1024)附加信息
exvarchar(1024)扩展字段
local_exvarchar(1024)本地扩展字段

索引设计:

  • 主键:client_msg_id
  • recv_id: 查询会话消息
  • content_type: 按消息类型筛选
  • seq: 消息排序
  • send_time: 按时间排序

业务场景:

  • 消息历史记录查看
  • 离线消息存储
  • 消息搜索和筛选

8. local_conversations - 本地会话表

功能描述: 存储用户的所有会话信息,包括单聊和群聊会话的状态和配置。

表名: local_conversations

字段名类型描述
conversation_idchar(128)会话ID(主键)
conversation_typeint32会话类型(1-单聊,2-群聊)
user_idchar(64)单聊对方用户ID
group_idchar(128)群聊群组ID
show_namevarchar(255)会话显示名称
face_urlvarchar(255)会话头像URL
recv_msg_optint32接收消息选项(0-正常,1-不接收,2-接收不提醒)
unread_countint32未读消息数量
group_at_typeint32群组@类型(0-无@,1-@所有人,2-@我)
latest_msgvarchar(1000)最新消息内容JSON字符串
latest_msg_send_timeint64最新消息发送时间戳
draft_texttext草稿文本内容
draft_text_timeint64草稿文本时间戳
is_pinnedbool是否置顶会话
is_private_chatbool是否为私聊(阅后即焚)
burn_durationint32阅后即焚时长(秒)
is_not_in_groupbool是否不在群组中(已退群但保留会话)
update_unread_count_timeint64未读数更新时间戳
attached_infovarchar(1024)附加信息
exvarchar(1024)扩展字段
max_seqint64会话最大消息序列号
min_seqint64会话最小消息序列号
msg_destruct_timeint64消息销毁时间(秒)
is_msg_destructbool是否开启消息销毁

索引设计:

  • 主键:conversation_id
  • latest_msg_send_time: 按最新消息时间排序

业务场景:

  • 会话列表展示
  • 未读消息统计
  • 会话配置管理

9. local_conversation_unread_messages - 本地会话未读消息表

功能描述: 存储每个会话中的未读消息记录,用于未读消息管理和提醒。

表名: local_conversation_unread_messages

字段名类型描述
conversation_idchar(128)会话ID(主键)
client_msg_idchar(64)未读消息的客户端ID(主键)
send_timeint64消息发送时间戳
exvarchar(1024)扩展字段

索引设计:

  • 主键:conversation_id + client_msg_id

业务场景:

  • 未读消息精确管理
  • 未读消息快速定位
  • 已读状态同步

👤 用户相关表

10. local_users - 本地用户信息表

功能描述: 存储当前登录用户的基本信息和设置。

表名: local_users

字段名类型描述
user_idvarchar(64)用户ID(主键)
nicknamevarchar(255)用户昵称
face_urlvarchar(255)用户头像URL
create_timeint64创建时间戳
app_manger_levelint32应用管理员等级
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息
global_recv_msg_optint32全局接收消息选项

索引设计:

  • 主键:user_id

业务场景:

  • 当前用户信息展示
  • 用户设置管理
  • 本地用户数据缓存

11. local_stranger - 本地陌生人信息表

功能描述: 存储与当前用户有过交互但非好友的用户信息,用于快速展示用户资料。

表名: local_stranger

字段名类型描述
user_idvarchar(64)陌生人用户ID(主键)
nicknamevarchar(255)陌生人昵称
face_urlvarchar(255)陌生人头像URL
create_timeint64创建时间戳
app_manger_levelint32应用管理员等级
exvarchar(1024)扩展字段
attached_infovarchar(1024)附加信息
global_recv_msg_optint32全局接收消息选项

索引设计:

  • 主键:user_id

业务场景:

  • 陌生人信息缓存
  • 快速用户资料展示
  • 减少网络请求

🔄 同步和序列号相关表

12. local_seq_data - 本地序列号数据表

功能描述: 存储用户消息序列号信息,用于消息同步和增量更新。

表名: local_seq_data

字段名类型描述
user_idvarchar(64)用户ID(主键)
sequint32消息序列号

索引设计:

  • 主键:user_id

业务场景:

  • 消息增量同步
  • 断线重连恢复
  • 消息去重处理

13. local_seqs - 本地序列号表

功能描述: 存储会话的最小序列号信息,用于消息范围管理。

表名: local_seqs

字段名类型描述
idvarchar(64)会话ID(主键)
min_sequint32最小序列号

索引设计:

  • 主键:id

业务场景:

  • 消息范围控制
  • 历史消息清理
  • 存储空间优化

14. local_notification_seqs - 通知序列号表

功能描述: 存储各会话的通知消息序列号,用于系统通知管理。

表名: local_notification_seqs

字段名类型描述
conversation_idchar(128)会话ID(主键)
seqint64通知序列号

索引设计:

  • 主键:conversation_id

业务场景:

  • 系统通知管理
  • 通知消息同步
  • 通知状态跟踪

15. local_sync_version - 本地版本同步表

功能描述: 存储数据同步的版本信息,用于增量同步和冲突解决。

表名: local_sync_version

字段名类型描述
table_namevarchar(255)表名(主键)
entity_idvarchar(255)实体ID(主键)
version_idvarchar(255)版本ID
versionuint64版本号
create_timeint64创建时间戳
uid_listtext用户ID列表(JSON格式)

索引设计:

  • 主键:table_name + entity_id

业务场景:

  • 数据版本控制
  • 增量同步优化
  • 冲突检测和解决

📁 文件和上传相关表

16. local_uploads - 本地上传记录表

功能描述: 存储文件上传的临时信息,用于断点续传和上传管理。

表名: local_uploads

字段名类型描述
part_hashvarchar(255)文件分片哈希值(主键)
upload_idvarchar(1000)上传任务ID
upload_infovarchar(2000)上传信息JSON字符串
expire_timeint64过期时间戳
create_timeint64创建时间戳

索引设计:

  • 主键:part_hash

业务场景:

  • 文件断点续传
  • 上传进度管理
  • 临时文件清理

🔧 扩展功能表

17. local_admin_group_requests - 本地管理员群组申请表

功能描述: 继承自群组申请表,用于管理员处理群组申请,支持管理功能扩展。

表名: local_admin_group_requests

说明: 结构同 local_group_requests,用于管理员视角的群组申请处理。

业务场景:

  • 管理员群组审核
  • 批量申请处理
  • 管理权限控制

18. local_chat_log_reaction_extensions - 本地聊天记录反应扩展表

功能描述: 存储消息的表情回复、点赞等反应信息,支持丰富的消息交互。

表名: local_chat_log_reaction_extensions

字段名类型描述
client_msg_idchar(64)消息客户端ID(主键)
local_reaction_extensionsblob本地反应扩展数据(二进制存储)

索引设计:

  • 主键:client_msg_id

业务场景:

  • 消息表情回复
  • 消息互动功能
  • 反应数据管理

19. local_sending_messages - 本地发送中消息表

功能描述: 存储正在发送中的消息记录,用于重发和状态跟踪。

表名: local_sending_messages

字段名类型描述
conversation_idchar(128)会话ID(主键)
client_msg_idchar(64)客户端消息ID(主键)
exvarchar(1024)扩展字段

索引设计:

  • 主键:conversation_id + client_msg_id

业务场景:

  • 发送状态管理
  • 消息重发机制
  • 发送失败处理

📋 系统管理表

20. local_app_sdk_version - 本地应用SDK版本表

功能描述: 记录已安装的SDK版本信息,用于版本管理和升级控制。

表名: local_app_sdk_version

字段名类型描述
versionvarchar(255)SDK版本号(主键)
installedbool是否已安装标记

索引设计:

  • 主键:version

业务场景:

  • SDK版本管理
  • 升级兼容性检查
  • 版本回滚支持

21. local_table_master - 表管理器

功能描述: 管理本地数据库表的创建和版本信息,支持数据库结构升级。

表名: local_table_master

说明: 系统内部表,用于数据库结构管理和版本控制。

业务场景:

  • 数据库结构管理
  • 表版本控制
  • 数据库升级支持

🔧 数据库设计总结

📊 架构特点分析

1. 分层存储架构

OpenIM采用了三层数据存储架构:

graph TB
    subgraph "服务端存储层"
        A[open-im-server<br/>MongoDB<br/>业务核心数据]
        B[chat<br/>MongoDB<br/>管理和用户数据]
    end
    
    subgraph "客户端存储层"
        C[openim-sdk-core<br/>SQLite<br/>本地缓存数据]
    end
    
    A -.->|数据同步| C
    B -.->|用户数据| C
    
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e8f5e8

2. 数据分离设计

  • open-im-server: 核心IM业务数据,高并发读写
  • chat: 管理系统和扩展功能,低频管理操作
  • openim-sdk-core: 客户端缓存,离线体验优化

3. 存储技术选型

项目数据库选型原因
open-im-serverMongoDB文档型存储,适合消息数据;水平扩展能力强
chatMongoDB灵活的模式设计;快速开发迭代
openim-sdk-coreSQLite轻量级;事务支持;离线可用

🚀 技术亮点

1. 消息分片存储

open-im-server的消息存储采用创新的分片策略:

文档ID格式: {会话ID}:{分片索引}
每个文档: 100条消息
分片计算: (seq - 1) / 100

优势:

  • 查询性能优化:避免单个文档过大
  • 并发写入支持:不同分片可并行写入
  • 存储空间优化:按需加载历史消息

2. 序列号机制

三级序列号管理体系:

  1. 全局序列号 (SeqConversation): 会话消息全局顺序
  2. 用户序列号 (SeqUser): 用户视角的消息同步点
  3. 本地序列号 (local_seq_data): 客户端同步状态

3. 版本控制系统

实现了完整的数据版本管理:

  • VersionLog: 服务端数据变更追踪
  • local_sync_version: 客户端版本状态
  • 增量同步: 基于版本号的高效数据同步

4. 多渠道认证

chat项目实现了统一的多渠道登录:

credential表设计:
- type=1: 手机号登录
- type=2: 邮箱登录  
- type=3: 账号登录

5. 离线优先设计

openim-sdk-core实现完整的离线功能:

  • 本地完整数据: 用户、好友、群组、消息全量缓存
  • 离线操作: 支持离线查看、搜索、草稿保存
  • 智能同步: 上线后自动增量同步

🔄 数据流向分析

用户注册流程

sequenceDiagram
    participant U as 用户
    participant C as Chat系统
    participant S as IM核心
    participant L as 本地存储
    
    U->>C: 注册请求
    C->>C: verify_code验证
    C->>C: 创建credential记录
    C->>C: 创建account+attribute
    C->>S: 同步用户信息到User表
    S->>L: 同步到local_users
    C->>C: 注册到register_add_friend/group

消息发送流程

sequenceDiagram
    participant A as 发送方
    participant L1 as 本地存储
    participant S as IM服务端
    participant L2 as 接收方本地
    participant B as 接收方
    
    A->>L1: 保存到local_chat_logs
    A->>S: 发送消息
    S->>S: 保存到MsgDocModel
    S->>S: 更新SeqUser/SeqConversation
    S->>L2: 推送到接收方
    L2->>L2: 保存到local_chat_logs
    L2->>B: 通知新消息

数据同步流程

graph LR
    A[客户端启动] --> B[检查版本号]
    B --> C{需要同步?}
    C -->|是| D[增量拉取]
    C -->|否| E[使用本地数据]
    D --> F[更新本地版本]
    F --> G[合并到本地数据库]
    G --> E

📈 性能优化策略

1. 索引设计优化

每个项目都精心设计了索引策略:

  • 唯一性约束: 防止数据重复
  • 复合索引: 优化多字段查询
  • 时间索引: 支持时间范围查询
  • TTL索引: 自动数据清理

2. 查询优化

  • 分页查询: 避免大数据量一次性加载
  • 字段投影: 只查询必要字段
  • 索引覆盖: 查询完全使用索引
  • 查询计划: 优化复杂查询逻辑

3. 存储优化

  • 数据压缩: 消息内容JSON压缩
  • 冗余设计: 适当冗余提升查询性能
  • 分片策略: 数据水平拆分
  • 缓存层: 多级缓存加速访问

🔒 数据安全设计

1. 访问控制

  • IP黑白名单: ip_forbidden表实现IP级别控制
  • 用户封禁: forbidden_account表管理违规用户
  • 权限分级: admin表支持多级管理员权限

2. 数据加密

  • 密码加密: BCrypt哈希存储
  • 敏感信息: 关键字段加密存储
  • 传输加密: TLS/SSL协议保护

3. 审计追踪

  • 操作记录: 记录关键操作的操作者信息
  • 登录日志: user_login_record完整记录登录行为
  • 版本控制: VersionLog追踪数据变更历史

📊 数据统计能力

1. 用户行为分析

  • 注册统计: register表支持注册来源分析
  • 活跃统计: user_login_record支持活跃度分析
  • 平台分布: 多平台使用情况统计

2. 消息统计

  • 消息量统计: 基于seq序列号的精确计数
  • 类型分布: content_type字段支持消息类型统计
  • 时间分析: send_time支持时间维度分析

3. 系统监控

  • 系统日志: log表记录系统运行状态
  • 错误追踪: 基于日志的错误分析
  • 性能监控: 查询性能和存储使用率监控

🎯 设计原则总结

1. 可扩展性

  • 预留字段: 大部分表包含ex扩展字段
  • 模块化: 功能模块独立设计
  • 版本兼容: 向后兼容的版本升级机制

2. 高可用性

  • 数据备份: MongoDB副本集支持
  • 故障恢复: 基于序列号的断点续传
  • 降级策略: 离线模式保证基本可用

3. 高性能

  • 分片存储: 消息按会话和时间分片
  • 索引优化: 针对查询模式的精确索引
  • 缓存设计: 多级缓存减少数据库压力

4. 数据一致性

  • 最终一致性: 分布式环境下的数据同步
  • 版本控制: 冲突检测和自动合并
  • 事务支持: 关键操作的事务保证

📚 总结

OpenIM的数据库架构展现了现代IM系统的完整设计思路:

架构优势

  1. 分层清晰: 服务端业务数据与客户端缓存分离
  2. 技术合理: 根据使用场景选择合适的存储引擎
  3. 性能优秀: 消息分片、索引优化、缓存设计
  4. 扩展性强: 模块化设计支持功能扩展
  5. 安全可靠: 完整的安全策略和审计机制

创新特点

  1. 消息分片存储: 创新的文档分片策略
  2. 三级序列号: 完整的消息同步机制
  3. 版本控制: 数据变更的精确追踪
  4. 离线优先: 完整的离线使用体验
  5. 多渠道认证: 统一的登录凭证管理

适用场景

  • 企业级IM: 完整的管理功能和安全控制
  • 社交应用: 丰富的用户关系和群组功能
  • 客服系统: AI机器人和智能代理支持
  • 移动应用: 离线优先的移动端体验

这套数据库架构既满足了当前的业务需求,又为未来的功能扩展和性能优化预留了充足的空间,是一个成熟、可靠的企业级即时通讯数据库解决方案。