关注与粉丝|青训营笔记

269 阅读4分钟

关注与粉丝|青训营笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记

1.前言

本次笔记记录在项目积累的问题和经验,我们团队6人,两人一组,做3个扩展接口,我俩主要负责第三个扩展接口,即关注和粉丝这一块的服务端实现。这里分享了在开发过程中的设计思路与问题解决方案。不进行代码罗列,希望对正在做项目的同学有所帮助。

2.接口关系

要想清晰的写出代码,接口一定要理清楚。

request:用户端传来的数据

  1. 关注列表 - user_id、token
  2. 粉丝列表 - user_id、token
  3. 关注与取关 - user_id、token、to_user_id、action_type

response:返回给用户端的数据

  1. 关注列表 - id、name、follow_count、follower_count、is_follow
  2. 粉丝列表 - id、name、follow_count、follower_count、is_follow
  3. 关注与取关 - 别看这个只要状态码和状态描述,这一块的代码最麻烦

3.数据库设计

这里只分享我做的这一块用到的数据库表和设计,实际上在做数据库设计时不论是对表或者是属性都做了不止一次的改动,这里不过度赘述,直接上最终的设计方案。

user表

 CREATE TABLE `user` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
   `follow_count` int(11) NOT NULL,
   `follower_count` int(11) NOT NULL,
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

attention表

 CREATE TABLE `attention` (
   `table_id` int(11) NOT NULL AUTO_INCREMENT,
   `user_id` int(11) NOT NULL,
   `attention_user_id` int(11) NOT NULL,
   `is_follow` tinyint(1) NOT NULL,
   PRIMARY KEY (`table_id`) USING BTREE
 ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

这里用户表存储了关注数以及粉丝数,这两条数据如果存在关系表里面会变得非常麻烦、冗余

而is_follow属性,实际上表示的是一种双向与单向的状态关系,涉及到关注者与被关注者,因此要放到关系表中

3.gorm使用

针对粉丝列表操作和关注列表就放在一块说吧,实际上前端给我们用户id,我们根据user_id查找关系表中所有的attention_user_id,或者就是反过来查询,这里涉及到一个级联查询的SQL知识,比如粉丝列表操作,我们需要获取所有粉丝的id、name、follow_count、follower_count、is_follow,这五个属性分居两个表,前四个属性在user表,最后一个属性在attention表。

下面是级联查询的SQL语句:

 select a.attention_user_id,a.is_follow,u.name,u.follow_count,u.follower_count
 from attention as a inner join user as u on a.attention_user_id=u.id
 where a.user_id=1

下面是gorm写法

 db.Debug().Table("user").Select("user.id,user.name,user.follow_count,user.follower_count,attention.is_follow").Joins("inner join attention on attention.attention_user_id=user.id").Where("attention.user_id=?", id).Find(&followList)

4.疑难问题

针对关注和取关操作,这个就以关注为例。实际上关注操作没要求返回什么数据。但是涉及的步骤还是有点东西的。

首先,针对is_follow属性,is_follow为0代表单向关系 is_follow为1代表双向关系

我们在插入 A关注B 的关系之前,我们要先判断 B是否关注A 。

如果 B并未关注A ,则我们查询不到该条数据,执行 插入操作时要注意设置is_follow为0,因为此时二者的关系时单向的。

如果 B已经关注A, 则我们可以查询到数据,但是 B和A的关系时单向的,即此时的is_follow为0, 由于我们要执行 A关注B的操作,将关系变成双向,因此,我们需要先将 B关注A的这条数据的is_follow属性置为1,然后我们执行插入 A关注B 数据时,也要讲is_follow置为1。

到这,关系表的问题就理清楚了,is_follow这一块就没问题了。

其次,我们开始对 follow_count 和 follower_count 这俩属性进行修改,因为我们无论是执行关注或者取关,有两个用户的数据是要改动的,以关注为例。当 A关注B 时,A的用户表中 follow_count 需要进行+1操作,对应的 B的用户表的 follower_count 也要进行 +1 操作。

因此,我们在执行关注操作时,需要判断二者关系、其次要对两个表做修改。

这里只是分享一下思路,不罗列代码,希望对做项目的同学能有所帮助。