可擴展的用戶表設計

用戶表結構的設計,算是整個應用架構的基石。如果基石不穩,待到後面需求跟進了發現不能應付,回過頭來反覆修改用戶表,要大大小小作改動的地方也不少,甚至有些情況下無從下手,因此我們應該怎麼設計用戶表呢?

需求分析#

  1. 多種登錄方式:包括手機號、微信、QQ、微博等;
  2. 可進行綁定和解綁或者更換綁定:用戶使用任意方式登錄後可綁定和解綁或者更換綁定其他 登錄授權;
  3. 支持 unionid(針對 QQ / 微信等):如果開發者擁有多個移動應用、網站應用和公衆帳號,可通過獲取用戶基本信息中的 unionid 來區分用戶的唯一性,因爲只要是同一個微信開放平臺帳號下的移動應用、網站應用和公衆帳號,用戶的 unionid 是唯一的。

用戶表設計#

1. 用戶主表 users#

字段 類型 爲空 默認 備註
id int PRI no 用戶唯一索引
name varchar no 用戶暱稱
avatar_url varchar yes 頭像地址
phone varchar UNI yes 手機號
password varchar yes 密碼
created_at timestamp no 創建時間
updated_at timestamp yes 更新時間

用戶表主要用於存儲用戶信息,以及手機號登錄認證。

2. 第三方用戶信息表 oauths#

字段 類型 爲空 默認 備註
id int PRI no 唯一索引
user_id int no 用戶 ID
oauth_type varchar no 第三方登陸類型 weibo、qq、wechat 等
oauth_id varchar no 第三方 uid 、openid 等
unionid varchar yes QQ / 微信同一主體下 Unionid 相同
credential varchar yes 密碼憑證 /access_token (目前更多是存儲在緩存裏)

用於存儲第三方登錄用戶授權後的信息。

3. 擴展用戶表信息 users_extends#

字段 類型 爲空 默認 備註
id int PRI no 唯一索引
user_id int no 用戶 ID
field varchar no 擴展字段
value varchar yes 擴展字段值

對於用戶表中沒有維護的數據例如生日 brithday 、等級 level 等信息可以存儲在當前信息表。

使用場景#

場景一: 先使用手機號註冊,之後綁定微信、微博、QQ 等第三方賬號;
註冊成功後 users 表:

id name avatar_url phone password created_at updated_at
1 馮先森 001 null 186XXXXX XXXX 2018-10-01 00:00:00 2018-10-01 00:00:00

用戶暱稱及頭像可在註冊時要求添加也可自動生成。
之後根據用戶 id 綁定 / 解綁 / 更換綁定相應第三方賬號 QQ、微博、微信等賬號

場景二:先使用微信、微博、QQ 等第三方賬號註冊,之後再綁定手機及其他未綁定第三方賬號;
以微信登錄爲例,第一次綁定成功後,users 和 oauths。
通過第三方授權獲取的用戶信息 (暱稱、頭像) 創建 users 數據:

id name avatar_url phone password created_at updated_at
2 微信暱稱 avatarUrl null null 2018-10-01 00:00:00 2018-10-01 00:00:00

根據用戶 ID 及第三方授權獲得的信息創建 oauths 數據

id user_id oauth_type oauth_id unionid credential
1 2 wechat o2sck0XXXXXXR-NDA osssck0XXXXXXR-NDA null

其中微信登錄可分爲 wechat 微信移動應用,official_account 微信公衆賬號,mini_program 微信小程序,同一主體的情況下 unionid 是一致的。

之後再根據用戶 ID 綁定手機及其他未綁定第三方賬號。

優缺點#

優點

  • 可擴展;
  • 易維護;
  • 用戶表簡潔明瞭;

缺點
會產生一個人有多個賬號的情況。
例如:當用戶用手機號註冊後,退出登錄,再使用微信授權登錄就會產生 2 個 users 數據(反之亦然),但是本質來說是一個用戶。
解決方法:

  1. 當用戶第一次使用微信授權綁定的之後,彈出綁定手機頁(可跳過,不強制綁定),如果手機號已經存在則告訴用戶,“該手機號以存在,無法綁定”。
  2. 當用戶使用手機號直接註冊的賬戶登錄後,授權綁定上述微信時提示用戶 “此賬號已存在綁定”;
    有時候適當的衝突是無法避免的,可以使用友好的設計與話語增加用戶體驗。

Todo#

  • users_extends 表的使用舉例。
  • 會員系統
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章