服务端 数据库设计

mysql 数据库设计

  • 用户信息表格设计
uidintprimary key auto_increment用户 id
unamevarcharnot null用户名
passwordvarcharnot null密码
emailvarcharnot null & unique key用户认证凭证
sextinyintdefault null性别
agetinyintdefalut null年龄
create_timeintnot null注册时间 unix 时间戳
more_infotextdefault null额外信息 json

建表语句

create table `user` (
    `uid` int primary key auto_increment COMMENT '用户 id 唯一 自增',
    `uname` varchar(64) not null COMMENT '用户名',
    `password` varchar(32) not null COMMENT '密码',
    `email` varchar(32) not null COMMENT '绑定邮箱',
    `sex` tinyint default null COMMENT '性别',
    `age` tinyint default null COMMENT '年龄',
    `create_time` int not null COMMENT '注册时间',
    `more_info` text COMMENT '额外信息 json 格式保存',
    unique key (`email`) COMMENT '邮箱 唯一'
) COMMENT = '用户表';
  • 用户注册表格设计 效验作用
emailvarcharprimary注册邮箱
authvarcharnot null验证码
expire_timeintnot null失效时间

建表语句

create table `register` (
    `email` varchar(32) primary key COMMENT '验证邮箱',
    `auth` varchar(10) not null COMMENT '验证码',
    `expire_time` int not null COMMENT '失效时间'
) COMMENT = '用户注册验证表';
  • 重置密码信息表格(用于忘记密码情景)

表设计相同,是可以合并使用一个表格,但是分开设计的原因在于:

考虑一种不太合理的情形,假如 A 如果使用 a 邮箱注册账号,服务端已发送验证码,这样在表格 register中会有一个注册记录,其中一个字段保存着验证码。

假设在 用户 A 在使用 验证码进行认证之前,B用户在请求找回密码的服务,B 理应输入自己的邮箱,但是错误的输成了 A 的邮箱 a(这种情形下对 B 是没有副作用的,对 A 的影响就是 A 会再次接收到一个 包含用于重置密码的验证码的邮件), 如果将注册和重置密码使用的是同一个表格,会导致注册验证码被 重置验证码覆盖。

分开设计可以避免验证码被覆盖,两个表格为不同的 api 提供服务(但是不足的是 A 用户依旧会收到重置密码的邮件)

  • 好友关系表
uid_1intnot null用户 1
uid_2intnot null用户 2
remark_1_2varchardefault null1 对 2 的备注
remark_2_1varchardefault null2 对 1 的备注
group_1_2varchardefault null1 对 2 的分组
group_2_1varchardefault null2 对 1 的分组

建表语句

create table `friend` (
    `uid_1` int not null COMMENT '用户 1',
    `uid_2` int not null COMMENT '用户 2',
    `remark_1_2` varchar(64) COMMENT '用户1 对 用户2 的备注',
    `remark_2_1` varchar(64) COMMENT '用户2 对 用户1 的备注',
    `group_1_2`  varchar(64) COMMENT '用户1 对 用户2 的分组',
    `group_2_1`  varchar(64) COMMENT '用户2 对 用户1 的分组',
    primary key(`uid_1`, `uid_2`) COMMENT '好友关系 唯一性'
) COMMENT = '好友关系表';
  • 好友离线消息表
to_uidintindex & not null接收者 id 索引
from_uidintnot null发送者 id
msgtextnot null消息 json 格式

建表语句

create table `pri_msg` (
    `to_uid` int not null COMMENT '接受者 id',
    `from_uid` int not null COMMENT '发送者 id',
    `msg` text not null COMMENT '消息 json 格式',
    index (`to_uid`) COMMENT '建立索引'
) COMMENT '私聊离线消息表';
  • 群聊信息表
gidintprimary key & auto_increment群聊 id 主键 自增
ownerintnot null群主 id
gnamevarcharnot null群聊名称
create_timeintnot null群聊建立时间
person_numberintnot null群人数

建表语句

create table `group_info` (
    `gid` int primary key auto_increment COMMENT '群聊 id 自增',
    `owner` int not null COMMENT '群主',
    `gname` varchar(64) not null COMMENT '群名称',
    `create_time` int not null COMMENT '建群时间',
    `person_number` int not null COMMENT '群人数'
) COMMENT = '群聊信息表';

/* index (`owner`) */ /* 暂不考虑为 owner 建立 索引 */
  • 群聊用户关系表
gidintnot null群聊 id
uidintnot null用户 id
join_timeintnot null入群时间
remarkvarcharnot null群呢称
last_msg_idintno null已读群聊消息的最大 id

建表语句

create table `group_person` (
    `gid` int not null COMMENT '群聊 id',
    `uid` int not null COMMENT '用户 id',
    `join_time` int not null COMMENT '加群时间',
    `remark` varchar(64) COMMENT '群聊备注',
    `last_msg_id` int not null COMMENT '已读的当前群聊最后一条消息 id',
    primary key(`gid`, `uid`)
) COMMENT = '群聊 用户关系表';
  • 群聊离线消息表
midintprimary key auto_increment消息 id
from_uidintnot null发送者 id
msgtextnot null消息

建表语句

create table `group:gid` (
    `mid` int primary key auto_increment COMMENT '消息 id, 自增',
    `from_uid` int not null COMMENT '发送者 id',
    `msg` text not null COMMENT '群聊消息'
) COMMENT = '群聊离线消息列表';
02-11 09:23
查看更多