编辑
2024-10-19
后端
00
请注意,本文编写于 202 天前,最后修改于 202 天前,其中某些信息可能已经过时。

最近在准备把大二写的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 许可协议。转载请注明出处!