我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL45讲之用户关注案例 - flowers

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL45讲之用户关注案例 - flowers

MySQL45讲之用户关注案例 - flowers

本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。

前言

本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。

业务背景

业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。存在两个表,
关系(relation)表:

CREATE TABLE `relation` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL,
  `liker_id` int NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id_liker_id` (`user_id`,`liker_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

好友(friend)表:

CREATE TABLE `friend` (
  `id` int NOT NULL AUTO_INCREMENT,
  `friend1_id` int NOT NULL,
  `friend2_id` int NOT NULL,
  PRIMARY KEY (`id`),
  KEY `uk_friend` (`friend1_id`,`friend2_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

以A关注B为例:
第一步,先查询对方有没有关注自己(B有没有关注A)
select * from relation where user_id = B and liker_id = A;

如果有,则成为好友
insert into friend;

没有,则只是单向关注关系
insert into like;

现在存在的问题是,如果 A 和 B 同时关注对方,在第一步判断对方没有关注自己,则只记录单向关注关系,然而实际上应该记录成好友的

那通过对记录上锁可以解决么?不行的,因为记录不存在,行锁无法生效。

解决方案

将两条记录合并到一条,这样就可以充分利用唯一索引。此外,再新增一个字段来记录状态。

关系表新增一个 relation_ship 字段,tinyint 类型。当 A 关注 B 且 A < B 时,

INSERT INTO (user_id, liker_id, relation_ship) values(A, B, 1);

当 A 关注 B 且 B < A 时,

INSERT INTO (user_id, liker_id, relation_ship) values(B, A, 2);

当 relation_ship = 3,表示 A 和 B 互相关注。

执行逻辑如下

begin;
# 1. 插入记录或者更新 relation_ship
INSERT INTO relation(user_id, liker_id, relation_ship) values(A, B, 1) on duplicate key update relation_ship = (relation_ship | 1);
# 2. 查询 relation_ship
SELECT relation_ship FROM relation WHERE user_id = A AND liker_id = B;
# 3. 在业务逻辑中,如果 relation_ship = 3,则创建好友关系
INSERT INTO friend(friend1_id, friend2_id) values(A, B);
commit;

当两个用户同时关注对方时,对先执行到达的事务会成功插入关系记录,得到的 relation_ship 值为 1 或 2,不创建好友关系;而后到来的事务,因为重复不插入关系记录,而更新 relation_ship = 1 | 2 或者 2 | 1,总之结果都是 3,于是它会创建好友关系。

这样就解决了业务上存在的问题,主要借助了唯一索引来实现。

参考

  • [1] 答疑文章(一):日志和索引相关问题

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL45讲之用户关注案例 - flowers

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL45讲之用户关注案例 - flowers

本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。 前言本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。业务背景业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。存在两个表,关系(
MySQL45讲之用户关注案例 - flowers
2016-04-14

编程热搜

目录