老项目重构手记之用户系统

受邀来一起重构公司的老项目

概述

重构首先要注意几个点 – 重构后功能的可扩展性 – 业务互相依赖的复杂度 – 脱离本身的业务进行重构 – 重构后的代码可读性与可维护性 – 性能的提升 以上几点是重构注意的地方也是重构的目的

分析

本次重构的项目运营了三年之久,用户及业务量也上不来。至于重构的真正原因不清楚。

  • 用户注册量:107470
  • 日PV:1000+

非常的惨淡

  1. 关于用户ID与其他业务绑定仅仅是单纯的存储用户ID进行绑定,类似与评论,购买等。这样在重新设计用户表的时候无需考虑其他表的业务是否有冲突或者依赖。
  2. 前期设计上貌似接口及数据表字段设置问题,出现了数据重复的问题。
  3. 功能重新写好后,在数据迁移方便,当然没法人工操作,php脚本去迁移也不现实,考虑使用数据队列等等方式进行数据迁移
  4. 功能代码绝笔是另起炉灶写,在原程序上写复杂度有提升了一倍。

原数据表结构

部分字段

字段名

类型

是否为空

默认值

注释

MemberId

bigint(20)

Y

自增编码

MemberPhone

varchar(255)

N

手机号码

LoginTime

int(11)

Y

NULL

登录时间

QuitTime

int(11)

Y

NULL

退出时间

LoginState

tinyint(2)

Y

NULL

登录状态

MemberState

tinyint(2)

N

0

账号状态

MemberExpert

tinyint(2)

N

0

MemberRegTime

int(11)

Y

NULL

注册时间

DeviceToken

varchar(255)

Y

NULL

设备标示

WxToken

char(32)

Y

NULL

微信标示

问题点有以下几个 1. 数据字段设计时不应使用驼峰命名,应使用小写,单独分割用_ ,例如 member_tel , 索引的设置也存在一些问题 2. 字段尽量避免DEFAULT NULL 3. 根据需求分表,现在所有的第三方授权都放到一个表里了

选型

前期重构要求速度要快。所以只能选择世界上最好的语言。

  • 语言:PHP
  • 框架:Laravel
  • 数据库:MySQL

考虑到数据量也不小,手动操作是不可能了,选择使用RabbitMQ进行数据迁移

新表设计

用户表

CREATE TABLE `member` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `tel` bigint(20) DEFAULT NULL COMMENT '手机号码',
  `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '登录密码',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '账号状态 0:正常',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `member_tel_unique` (`tel`),
  KEY `member_tel_status_index` (`tel`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=80073 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

用户授权表

CREATE TABLE `member_authorized` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `member_id` bigint(20) NOT NULL COMMENT '用户编码',
  `prefix` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '第三方名称',
  `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '第三方标示',
  `data` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授权获得的用户信息',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `member_authorized_prefix_index` (`prefix`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

用户信息表

CREATE TABLE `member_data` (
  `member_id` bigint(20) NOT NULL COMMENT '用户编码',
  `sex` enum('0','1','2') COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '性别 0=>女生 1=>男生 2=>未知',
  `nick_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '姓名/昵称',
  `img` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户头像',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  UNIQUE KEY `member_data_member_id_unique` (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

队列

通过队列,可以选择laravel内置的队列或者rabbitmq都可以。将数据迁移到新表中。当然你需要选择一个访问量最低的时间段。并不是凌晨就少,不同的行业的活跃时间段不一样。建议先使用百度统计、腾讯分析等等的查看活跃时间区间。

迭代

重构并不是一言一语,几行代码或者一个大佬的方案就可以解决的。实际重构也是一个开发的过程。在不断的迭代中,将重构完成的部分补回到业务中。

致谢

感谢你看到这里,希望本篇文章可以帮到你。有问题可在评论区留言。

最后修改:2个月前 2018-07-05

© 著作权归作者所有

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

SQL为王:oracle标量子查询和表连接改写

小鱼(邓秋爽) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化、SQL优化和troubleshooting 编辑手记:如何提高数...

49860
来自专栏数据和云

SQL优化:紧急情况下提高SQL性能竟是这样实现的!

作者 | 黄堋 ,多年一线 Oracle DBA 经验,长期服务电信、电网、医院、政府等行业客户。擅长数据库优化、数据库迁移升级、数据库故障处理。

9960
来自专栏杨建荣的学习笔记

相差数十倍的SQL性能分析(r11笔记第98天)

今天处理开发同学提交的一个数据查询需求,看起来是一个很常规的SQL,但是有一点不同的是,他们提供了两份文件,一份是一个id列表,大概有3000多个id值,...

35780
来自专栏企鹅号快讯

数据分析师必备的数据提取技能

数据分析师必备技能SQL 在数据分析的整个流程中,数据获取是不可或缺的一环,那么作为数据分析师,我们不仅仅需要了解如何获取二手数据,还必须掌握如何从数据库中获取...

314100
来自专栏java达人

SQL索引优化

序言 数据库的优化方法有很多种,在应用层来说,主要是基于索引的优化。本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的S...

22480
来自专栏后端技术探索

MySQL优化的奇技淫巧之STRAIGHT_JOIN

通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下:

12310
来自专栏禁心尽力

一次浴火重生的MySQL优化(EXPLAIN命令详解)

一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*...

20850
来自专栏小怪聊职场

MySQL(八)|MySQL中In与Exists的区别(2)

19530
来自专栏happyJared

爬虫进阶:Scrapy抓取慕课网

  完整的爬虫流程大致是这样的:分析页面结构 -> 确定提取信息 -> 设计相应表结构 -> 编写爬虫脚本 -> 数据保存入库;入库可以选择mongo这样的文档...

41040
来自专栏一个爱吃西瓜的程序员

学习SQL【6】-复杂查询

到目前为止,我们学习了表的创建、查询和更新等数据库的基本操作方法。现在我们将会在这些基本方法的基础上,学习一些实际应用的方法。 一:视图 1:视图和表 表中存...

34990

扫码关注云+社区

领取腾讯云代金券