简聊聊天软件的表设计

前言:
最近有了解了一下聊天软件,关于其中的一部分表的设计,以及比较重要的功能的实现,在此记录下来,方便自己以后的查看,也希望看到这篇博客的盆友一个小小的帮助

这些表的实现只是完成简单项目需求,因此不分关系型数据库和非关系型数据库的性能问题

一 表的简述

表名称说明
tb_user用户表
tb_friend好友表
tb_frined_req好友请求表
tb_chat_recode聊天记录表

以下使用两个用户做为样本说明

idusername
1gxm
2zzl

二表说明

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 表,会按主键的顺序排列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值