老項目重構手記之用戶系統

受邀來一塊兒重構公司的老項目

概述

重構首先要注意幾個點php

  • 重構後功能的可擴展性
  • 業務互相依賴的複雜度
  • 脫離自己的業務進行重構
  • 重構後的代碼可讀性與可維護性
  • 性能的提高

以上幾點是重構注意的地方也是重構的目的laravel

分析

本次重構的項目運營了三年之久,用戶及業務量也上不來。至於重構的真正緣由不清楚。數據庫

  • 用戶註冊量: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均可以。將數據遷移到新表中。固然你須要選擇一個訪問量最低的時間段。並非凌晨就少,不一樣的行業的活躍時間段不同。建議先使用百度統計、騰訊分析等等的查看活躍時間區間。ui

迭代

重構並非一言一語,幾行代碼或者一個大佬的方案就能夠解決的。實際重構也是一個開發的過程。在不斷的迭代中,將重構完成的部分補回到業務中。編碼

致謝

感謝你看到這裏,但願本篇文章能夠幫到你。有問題可在評論區留言。設計

相關文章
相關標籤/搜索