用戶表結構的設計,算是整個應用架構的基石。如果基石不穩,待到後面需求跟進了發現不能應付,回過頭來反覆修改用戶表,要大大小小作改動的地方也不少,甚至有些情況下無從下手,因此我們應該怎麼設計用戶表呢?
需求分析#
- 多種登錄方式:包括手機號、微信、QQ、微博等;
- 可進行綁定和解綁或者更換綁定:用戶使用任意方式登錄後可綁定和解綁或者更換綁定其他 登錄授權;
- 支持 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 | o2sck0XXXXXXR-NDA | osssck0XXXXXXR-NDA | null |
其中微信登錄可分爲 wechat
微信移動應用,official_account
微信公衆賬號,mini_program
微信小程序,同一主體的情況下 unionid 是一致的。
之後再根據用戶 ID 綁定手機及其他未綁定第三方賬號。
優缺點#
優點:
- 可擴展;
- 易維護;
- 用戶表簡潔明瞭;
缺點:
會產生一個人有多個賬號的情況。
例如:當用戶用手機號註冊後,退出登錄,再使用微信授權登錄就會產生 2 個 users 數據(反之亦然),但是本質來說是一個用戶。
解決方法:
- 當用戶第一次使用微信授權綁定的之後,彈出綁定手機頁(可跳過,不強制綁定),如果手機號已經存在則告訴用戶,“該手機號以存在,無法綁定”。
- 當用戶使用手機號直接註冊的賬戶登錄後,授權綁定上述微信時提示用戶 “此賬號已存在綁定”;
有時候適當的衝突是無法避免的,可以使用友好的設計與話語增加用戶體驗。
Todo#
- users_extends 表的使用舉例。
- 會員系統