前言:
最近有了解了一下聊天软件,关于其中的一部分表的设计,以及比较重要的功能的实现,在此记录下来,方便自己以后的查看,也希望看到这篇博客的盆友一个小小的帮助
这些表的实现只是完成简单项目需求,因此不分关系型数据库和非关系型数据库的性能问题
一 表的简述
表名称 | 说明 |
---|---|
tb_user | 用户表 |
tb_friend | 好友表 |
tb_frined_req | 好友请求表 |
tb_chat_recode | 聊天记录表 |
以下使用两个用户做为样本说明
id | username |
---|---|
1 | gxm |
2 | zzl |
二表说明
2.1用户表说明(tb_user)
这个表还是很简单的,如果你没有特别的需求,可以如下这样设计,就不做说明了
CREATE TABLE `tb_user` (
`id` varchar(255) NOT NULL COMMENT 'ID',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`pic_small` varchar(255) DEFAULT NULL COMMENT '头像(小尺寸)',
`pic_normal` varchar(255) DEFAULT NULL COMMENT '头像(正常尺寸)',
`nickname` varchar(255) DEFAULT NULL COMMENT '昵称',
`qrcode` varchar(255) DEFAULT NULL COMMENT '二维码',
`client_id` varchar(255) DEFAULT NULL COMMENT '手机端唯一ID',
`sign` varchar(1024) DEFAULT NULL COMMENT '签名',
`createtime` date DEFAULT NULL COMMENT '注册日期',
`phone` varchar(255) DEFAULT NULL COMMENT '绑定手机',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2好友表说明(tb_friend)
好友表就是你和另一个用户成为好友的记录
CREATE TABLE `tb_friend` (
`id` varchar(255) NOT NULL,
`userid` varchar(255) DEFAULT NULL COMMENT '用户id',
`friends_id` varchar(255) DEFAULT NULL COMMENT '好友id',
`comments` varchar(255) DEFAULT NULL COMMENT '备注',
`createtime` date DEFAULT NULL COMMENT '添加好友日期',
PRIMARY KEY (`id`),
UNIQUE KEY `UK` (`userid`,`friends_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
方法一
这里我在遇到的后台项目中,对于双方成为好友时,会向该表中插入两条数据,如gxm发起与zzl的好友请求
- userid为1 friends_id为2
- userid为2 friends_id为1
即双方成为好友之后向该表中插入两条数据,这样做的原因,说实话我没有想通,可能是我做的项目中太过简单,唯一用到的就是在当前用户登陆后,当用户点击我的好友时,可以根据userid查询好友信息,比较的简单,直接一步查询到位,sql如下:
select * from tbfrined where userid=1
方法二
如果我们数据库中只有一条好友记录,如gxm发起与zzl的好友请求
- userid为1 friend_id为2
即数据库只插入一条数据,userid为发起请求者,frinedid为请求接受者,上面的需求也可以完成,sql如下
select * from tbfrined where userid=1 or frinedid=1
再对获得的数据进行遍历,如果userid等于传入的id那么根据friendid获取数据,相反根据userid获取数据即可!
所以当用户数量过多,方法一中的好友表中的数量比方法二中的的增加数量会大2倍
2.3 好友请求表说明(tb_friendreq)
当用户gxm给用户zzl发送一个好友请求时,该表会插入一条数据
CREATE TABLE `tb_friend_req` (
`id` varchar(255) NOT NULL COMMENT 'id',
`from_userid` varchar(255) DEFAULT NULL COMMENT '请求好友用户id',
`to_userid` varchar(255) DEFAULT NULL COMMENT '被请求好友用户id',
`createtime` date DEFAULT NULL COMMENT '请求时间',
`message` varchar(255) DEFAULT NULL COMMENT '发送的消息',
`status` int(1) DEFAULT NULL COMMENT '是否已处理',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这样,当用户上线时,前台请求后台查询当前用户是否有好友请求,把数据查到返回即可
2.4 好友聊天记录表说明(tb_chat_record)
与好友聊天时,聊天记录是肯定需要保存下来的,当然不一定保存在关系型数据库中,我觉得这部分应该是要放在nosql数据中的,但我这里就以mysql说明
CREATE TABLE `tb_chat_record` (
`id` varchar(255) NOT NULL COMMENT 'id',
`userid` varchar(255) DEFAULT NULL COMMENT '用户id',
`friendid` varchar(255) DEFAULT NULL COMMENT '好友id',
`has_read` int(1) DEFAULT NULL COMMENT '是否已读',
`createtime` date DEFAULT NULL COMMENT '聊天时间',
`has_delete` int(1) DEFAULT NULL COMMENT '是否删除',
`message` varchar(1024) DEFAULT NULL COMMENT '消息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
最中要的一部分就是当登陆的用户gxm打开与好友zzl的聊天框时,应将两者之间的聊天历史给加载出来
-
方法一
所以在后台按照聊天的事件顺序排好,发给前端,前端直接按照顺序判断是用户的信息还是朋友的信息,进行渲染即可 -
方法二
后台不管,全部交给前台,前台拿到数据,先进行聊天时间的排序,再进行数据的渲染 -
方法三
后台与前台都步排序,按照mysql插入数据的时候的顺序,默认返回,(此时聊天记录为逻辑删除,即不在数据库中真正的删除)
但方法三需注意一点
MySQL:
对于 MyISAM 表 ,Select 默认排序是按照物理存储顺序显示的。
而InnoDB 表,会按主键的顺序排列。