资讯专栏INFORMATION COLUMN

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

ivan_qhz / 1798人阅读

摘要:功能重新写好后,在数据迁移方便,当然没法人工操作,脚本去迁移也不现实,考虑使用数据队列等等方式进行数据迁移功能代码绝笔是另起炉灶写,在原程序上写复杂度有提升了一倍。

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

重构首先要注意几个点

重构后功能的可扩展性

业务互相依赖的复杂度

脱离本身的业务进行重构

重构后的代码可读性与可维护性

性能的提升

以上几点是重构注意的地方也是重构的目的

分析

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

用户注册量:107470

日PV:1000+

非常的惨淡

关于用户ID与其他业务绑定仅仅是单纯的存储用户ID进行绑定,类似与评论,购买等。这样在重新设计用户表的时候无需考虑其他表的业务是否有冲突或者依赖。

前期设计上貌似接口及数据表字段设置问题,出现了数据重复的问题。

功能重新写好后,在数据迁移方便,当然没法人工操作,php脚本去迁移也不现实,考虑使用数据队列等等方式进行数据迁移

功能代码绝笔是另起炉灶写,在原程序上写复杂度有提升了一倍。

原数据表结构
部分字段
字段名 类型 是否为空 默认值 注释
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 微信标示

问题点有以下几个

数据字段设计时不应使用驼峰命名,应使用小写,多带带分割用_ ,例如 member_tel , 索引的设置也存在一些问题

字段尽量避免DEFAULT NULL

根据需求分表,现在所有的第三方授权都放到一个表里了

选型

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

语言: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都可以。将数据迁移到新表中。当然你需要选择一个访问量最低的时间段。并不是凌晨就少,不同的行业的活跃时间段不一样。建议先使用百度统计、腾讯分析等等的查看活跃时间区间。

迭代

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

致谢

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28941.html

相关文章

  • 项目的迁移手记

    摘要:打包后将项目下载到本地。数据库用的阿里云的,所以直接忽略。无感知转发我自己有一台核的阿里云他们公司的量也不大,所以我准备先将项目部署到我服务器上,在公司服务器上进行负载均衡,将我方权重调高,将用户流量全部引入到我方服务器上。 收到一个朋友的求救,他现在遇到一个难题。 就是刚刚入职的公司,项目没有GIT,用的老版本的TP,CI,代码也很凌乱,目录也是非常的多,有的没的都在服务器上放着,服...

    hidogs 评论0 收藏0
  • 项目的迁移手记

    摘要:打包后将项目下载到本地。数据库用的阿里云的,所以直接忽略。无感知转发我自己有一台核的阿里云他们公司的量也不大,所以我准备先将项目部署到我服务器上,在公司服务器上进行负载均衡,将我方权重调高,将用户流量全部引入到我方服务器上。 收到一个朋友的求救,他现在遇到一个难题。 就是刚刚入职的公司,项目没有GIT,用的老版本的TP,CI,代码也很凌乱,目录也是非常的多,有的没的都在服务器上放着,服...

    khlbat 评论0 收藏0
  • 项目的迁移手记

    摘要:打包后将项目下载到本地。数据库用的阿里云的,所以直接忽略。无感知转发我自己有一台核的阿里云他们公司的量也不大,所以我准备先将项目部署到我服务器上,在公司服务器上进行负载均衡,将我方权重调高,将用户流量全部引入到我方服务器上。 收到一个朋友的求救,他现在遇到一个难题。 就是刚刚入职的公司,项目没有GIT,用的老版本的TP,CI,代码也很凌乱,目录也是非常的多,有的没的都在服务器上放着,服...

    mingzhong 评论0 收藏0
  • SegmentFault 社区访谈 | mcfog:自由进出 Coding && A

    摘要:上次的访谈,介绍了下可爱的依云酱,回忆传送门。这里简单地介绍下龙女仆,全名小林家的龙女仆,为什么介绍这部剧呢因为设计狮颜值同学也安利了这部。剧情简介在独身又劳累的小林划重点一名程序员身边突然出现的穿着女仆服装的美少女托尔。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的访谈,介绍了下可爱的依云酱,回忆传送门。不...

    neroneroffy 评论0 收藏0

发表评论

0条评论

ivan_qhz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<