服务端 数据库设计
mysql 数据库设计
- 用户信息表格设计
用户信息表格,保存用户的 账号 id,用户名,密码,邮箱等重要信息
以及辅助信息
用途:根据指定用户 id 获取信息,并展示
重要属性:邮箱,邮箱是用户的安全保证,通过邮箱可以注册,重置密码,进行重要操作
字段名 | 字段类型 | 键属性 | 说明 |
---|---|---|---|
uid |
int |
primary key auto_increment |
用户 id |
uname |
varchar |
not null |
用户名 |
password |
varchar |
not null |
密码 |
email |
varchar |
not null & unique key |
用户认证凭证 |
sex |
tinyint |
default null |
性别 |
age |
tinyint |
defalut null |
年龄 |
create_time |
int |
not null |
注册时间 unix 时间戳 |
more_info |
text |
default 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 = '用户表';
- 用户注册表格设计
效验作用
注册信息表:用于用户注册验证真实性,是成为真正用户的过渡信息
这里使用 邮箱服务对用户进行验证
字段名 | 字段类型 | 键属性 | 说明 |
---|---|---|---|
email |
varchar |
primary |
注册邮箱 |
auth |
varchar |
not null |
验证码 |
expire_time |
int |
not null |
失效时间 |
验证码设计 6位
失效时间用途:定时任务清除失效的验证码,确保数据表不会有过多垃圾数据
建表语句
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 用户依旧会收到重置密码的邮件)
在重置密码时主要用到邮箱验证,我们无法确认用户输入的邮箱就是其本人的邮箱,即使要求用户重置密码时输入 自己的账号 id 与 邮箱 ,然后在服务端进行验证后决定是否发送消息。但是依旧避免不了利用服务端进行恶意操作的行为。这里我们不考虑这种恶意行为。
- 好友关系表
表格设计:
由于关系是相互的,这样设计可以减少数据冗余,每一对关系在数据表中只会存在一份.
字段名 | 字段类型 | 键属性 | 说明 |
---|---|---|---|
uid_1 |
int |
not null |
用户 1 |
uid_2 |
int |
not null |
用户 2 |
remark_1_2 |
varchar |
default null |
1 对 2 的备注 |
remark_2_1 |
varchar |
default null |
2 对 1 的备注 |
group_1_2 |
varchar |
default null |
1 对 2 的分组 |
group_2_1 |
varchar |
default null |
2 对 1 的分组 |
暂不考虑 黑名单,单向删除就会删除好友关系
uid_1
和uid_2
组合作为主键
建表语句
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_uid |
int |
index & not null |
接收者 id 索引 |
from_uid |
int |
not null |
发送者 id |
msg |
text |
not null |
消息 json 格式 |
好友离线表格只有在 接收方离线时才会使用。接收方在线时 不经过 mysql ,会直接推送给目标用户
离线消息表 以 接收方为主体,设计索引,当用户上线时直接拉取所有
to_uid
等于用户 id
的消息即可
离线消息不仅仅保存聊天的 消息,同时包含 好友申请消息,群聊邀请消息
建表语句
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 '私聊离线消息表';
- 群聊信息表
群聊信息表:
主要保存群聊的一些基本信息,便于用户查看群聊时显示
字段名 | 字段类型 | 键属性 | 说明 |
---|---|---|---|
gid |
int |
primary key & auto_increment |
群聊 id 主键 自增 |
owner |
int |
not null |
群主 id |
gname |
varchar |
not null |
群聊名称 |
create_time |
int |
not null |
群聊建立时间 |
person_number |
int |
not 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 建立 索引 */
- 群聊用户关系表
字段名 | 字段类型 | 键属性 | 说明 |
---|---|---|---|
gid |
int |
not null |
群聊 id |
uid |
int |
not null |
用户 id |
join_time |
int |
not null |
入群时间 |
remark |
varchar |
not null |
群呢称 |
last_msg_id |
int |
no null |
已读群聊消息的最大 id |
群聊用户关系表 主键设计为
(gid, uid)
,last_msg_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 = '群聊 用户关系表';
- 群聊离线消息表
针对不同的群聊,每个群聊设计一个表格。便于消息 id 的自增
群聊表名设计为
group:$gid
$gid
表示群号
字段名 | 字段类型 | 键属性 | 说明 |
---|---|---|---|
mid |
int |
primary key auto_increment |
消息 id |
from_uid |
int |
not null |
发送者 id |
msg |
text |
not null |
消息 |
说明:群聊消息表格 消息 id 设置为自增,进行群聊离线消息推送时,只需要记录发送者 id 与发送的消息。
建表语句
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 = '群聊离线消息列表';