最近在准备把大二写的IM服务重构一下开源出来,他是iTakeaway项目的一个模块,负责用户和商家的即时通讯还有消息推送等功能,iTakeaway主要业务服务由Java实现,IM服务由Go实现,AI模型服务由FastAPI实现,项目暂不开源(参加比赛的团队项目),
首先是sql,当时设计的结构并不完美,没考虑到多端,多设备登录,仅仅只是单点登录(会把之前登陆的设备挤下线),自然也没考虑消息同步
sql-- ----------------------------
-- Table structure for device
-- ----------------------------
-- 表名: device
-- 描述: 存储设备信息
-- 字段:
-- id: 自增主键,唯一标识一个设备
-- user_id: 账户id,关联到用户表
-- type: 设备类型,1:Android;2:IOS;3:Windows; 4:MacOS;5:Web
-- brand: 手机厂商
-- model: 机型
-- system_version: 系统版本
-- sdk_version: app版本
-- status: 在线状态,0:离线;1:在线
-- conn_addr: 连接层服务器地址
-- client_addr: 客户端地址
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- KEY: idx_user_id (user_id)
-- ----------------------------
DROP TABLE IF EXISTS `device`;
CREATE TABLE `device`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '账户id',
`type` tinyint(3) NOT NULL COMMENT '设备类型,1:Android;2:IOS;3:Windows; 4:MacOS;5:Web',
`brand` varchar(20) NOT NULL COMMENT '手机厂商',
`model` varchar(20) NOT NULL COMMENT '机型',
`system_version` varchar(10) NOT NULL COMMENT '系统版本',
`sdk_version` varchar(10) NOT NULL COMMENT 'app版本',
`status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '在线状态,0:离线;1:在线',
`conn_addr` varchar(25) NOT NULL COMMENT '连接层服务器地址',
`client_addr` varchar(25) NOT NULL COMMENT '客户端地址',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_bin COMMENT ='设备';
-- ----------------------------
-- Table structure for friend
-- ----------------------------
-- 表名: friend
-- 描述: 存储好友关系
-- 字段:
-- id: 自增主键,唯一标识一条好友关系
-- user_id: 用户id,关联到用户表
-- friend_id: 好友id,关联到用户表
-- remarks: 备注
-- extra: 附加属性
-- status: 状态,1:申请,2:同意
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- UNIQUE KEY: uk_user_id_friend_id (user_id, friend_id)
-- ----------------------------
DROP TABLE IF EXISTS `friend`;
CREATE TABLE `friend`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
`friend_id` bigint(20) unsigned NOT NULL COMMENT '好友id',
`remarks` varchar(20) NOT NULL COMMENT '备注',
`extra` varchar(1024) NOT NULL COMMENT '附加属性',
`status` tinyint(4) NOT NULL COMMENT '状态,1:申请,2:同意',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id_friend_id` (`user_id`, `friend_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_bin COMMENT ='好友';
-- ----------------------------
-- Table structure for group
-- ----------------------------
-- 表名: group
-- 描述: 存储群组信息
-- 字段:
-- id: 自增主键,唯一标识一个群组
-- name: 群组名称
-- avatar_url: 群组头像
-- introduction: 群组简介
-- user_num: 群组人数
-- extra: 附加属性
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- ----------------------------
DROP TABLE IF EXISTS `group`;
CREATE TABLE `group`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`name` varchar(50) NOT NULL COMMENT '群组名称',
`avatar_url` varchar(255) NOT NULL COMMENT '群组头像',
`introduction` varchar(255) NOT NULL COMMENT '群组简介',
`user_num` int(11) NOT NULL DEFAULT '0' COMMENT '群组人数',
`extra` varchar(1024) NOT NULL COMMENT '附加属性',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_bin COMMENT ='群组';
-- ----------------------------
-- Table structure for group_user
-- ----------------------------
-- 表名: group_user
-- 描述: 存储群组成员信息
-- 字段:
-- id: 自增主键,唯一标识一条群组成员关系
-- group_id: 组id,关联到群组表
-- user_id: 用户id,关联到用户表
-- member_type: 成员类型,1:管理员;2:普通成员
-- remarks: 备注
-- extra: 附加属性
-- status: 状态
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- UNIQUE KEY: uk_group_id_user_id (group_id, user_id)
-- KEY: idx_user_id (user_id)
-- ----------------------------
DROP TABLE IF EXISTS `group_user`;
CREATE TABLE `group_user`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`group_id` bigint(20) unsigned NOT NULL COMMENT '组id',
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
`member_type` tinyint(4) NOT NULL COMMENT '成员类型,1:管理员;2:普通成员',
`remarks` varchar(20) NOT NULL COMMENT '备注',
`extra` varchar(1024) NOT NULL COMMENT '附加属性',
`status` tinyint(255) NOT NULL COMMENT '状态',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id_user_id` (`group_id`, `user_id`) USING BTREE,
KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_bin COMMENT ='群组成员';
-- ----------------------------
-- Table structure for user
-- ----------------------------
-- 表名: user
-- 描述: 存储用户信息
-- 字段:
-- id: 自增主键,唯一标识一个用户
-- phone_number: 手机号
-- nickname: 昵称
-- sex: 性别,0:未知;1:男;2:女
-- avatar_url: 用户头像链接
-- extra: 附加属性
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- UNIQUE KEY: uk_phone_number (phone_number)
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`phone_number` varchar(20) NOT NULL COMMENT '手机号',
`nickname` varchar(20) NOT NULL COMMENT '昵称',
`sex` tinyint(4) NOT NULL COMMENT '性别,0:未知;1:男;2:女',
`avatar_url` varchar(256) NOT NULL COMMENT '用户头像链接',
`extra` varchar(1024) NOT NULL COMMENT '附加属性',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_phone_number` (`phone_number`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_bin COMMENT ='用户';
-- ----------------------------
-- Table structure for seq
-- ----------------------------
-- 表名: seq
-- 描述: 存储序列号信息
-- 字段:
-- id: 自增主键,唯一标识一条序列号记录
-- object_type: 对象类型,1:用户;2:群组
-- object_id: 对象id,关联到用户或群组表
-- seq: 序列号
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- UNIQUE KEY: uk_object (object_type, object_id)
-- ----------------------------
CREATE TABLE `seq`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`object_type` tinyint NOT NULL COMMENT '对象类型,1:用户;2:群组',
`object_id` bigint unsigned NOT NULL COMMENT '对象id',
`seq` bigint unsigned NOT NULL COMMENT '序列号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_object` (`object_type`,`object_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='序列号';
-- ----------------------------
-- Table structure for message
-- ----------------------------
-- 表名: message
-- 描述: 存储消息信息
-- 字段:
-- id: 自增主键,唯一标识一条消息
-- user_id: 所属类型的id,关联到用户表
-- request_id: 请求id
-- code: 消息类型
-- content: 消息内容
-- seq: 消息序列号
-- send_time: 消息发送时间
-- status: 消息状态,0:未处理1:消息撤回
-- create_time: 创建时间
-- update_time: 更新时间
-- 索引:
-- PRIMARY KEY: id
-- UNIQUE KEY: uk_user_id_seq (user_id, seq)
-- ----------------------------
DROP TABLE IF EXISTS `message`;
CREATE TABLE `message`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_id` bigint(20) unsigned NOT NULL COMMENT '所属类型的id',
`request_id` bigint(20) NOT NULL COMMENT '请求id',
`code` tinyint(4) NOT NULL COMMENT '消息类型',
`content` blob NOT NULL COMMENT '消息内容',
`seq` bigint(20) unsigned NOT NULL COMMENT '消息序列号',
`send_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP (3) COMMENT '消息发送时间',
`status` tinyint(255) NOT NULL DEFAULT '0' COMMENT '消息状态,0:未处理1:消息撤回',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id_seq` (`user_id`, `seq`) USING BTREE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_bin COMMENT ='消息';
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!