用戶表結(jié)構(gòu)的設(shè)計(jì),算是整個(gè)應(yīng)用架構(gòu)的基石。如果基石不穩(wěn),待到后面需求跟進(jìn)了發(fā)現(xiàn)不能應(yīng)付,回過頭來反復(fù)修改用戶表,要大大小小作改動(dòng)的地方也不少,甚至有些情況下無從下手,因此我們應(yīng)該怎么設(shè)計(jì)用戶表呢?
需求分析
- 多種登錄方式:包括手機(jī)號(hào)、微信、QQ、微博等;
- 可進(jìn)行綁定和解綁或者更換綁定:用戶使用任意方式登錄后可綁定和解綁或者更換綁定其他 登錄授權(quán);
- 支持 unionid(針對(duì) QQ / 微信等):如果開發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),可通過獲取用戶基本信息中的 unionid 來區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€(gè)微信開放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào),用戶的 unionid 是唯一的。
用戶表設(shè)計(jì)
1. 用戶主表 users
| 字段 | 類型 | 鍵 | 為空 | 默認(rèn) | 備注 |
|---|---|---|---|---|---|
| id | int | PRI | no | 用戶唯一索引 | |
| name | varchar | no | 用戶昵稱 | ||
| avatar_url | varchar | yes | 頭像地址 | ||
| phone | varchar | UNI | yes | 手機(jī)號(hào) | |
| password | varchar | yes | 密碼 | ||
| created_at | timestamp | no | 創(chuàng)建時(shí)間 | ||
| updated_at | timestamp | yes | 更新時(shí)間 |
用戶表主要用于存儲(chǔ)用戶信息,以及手機(jī)號(hào)登錄認(rèn)證。
2. 第三方用戶信息表 oauths
| 字段 | 類型 | 鍵 | 為空 | 默認(rèn) | 備注 |
|---|---|---|---|---|---|
| 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 (目前更多是存儲(chǔ)在緩存里) |
用于存儲(chǔ)第三方登錄用戶授權(quán)后的信息。
3. 擴(kuò)展用戶表信息 users_extends
| 字段 | 類型 | 鍵 | 為空 | 默認(rèn) | 備注 |
|---|---|---|---|---|---|
| id | int | PRI | no | 唯一索引 | |
| user_id | int | no | 用戶 ID | ||
| field | varchar | no | 擴(kuò)展字段 | ||
| value | varchar | yes | 擴(kuò)展字段值 |
對(duì)于用戶表中沒有維護(hù)的數(shù)據(jù)例如生日 brithday 、等級(jí) level 等信息可以存儲(chǔ)在當(dāng)前信息表。
使用場(chǎng)景
場(chǎng)景一: 先使用手機(jī)號(hào)注冊(cè),之后綁定微信、微博、QQ 等第三方賬號(hào);
注冊(cè)成功后 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 |
用戶昵稱及頭像可在注冊(cè)時(shí)要求添加也可自動(dòng)生成。
之后根據(jù)用戶 id 綁定 / 解綁 / 更換綁定相應(yīng)第三方賬號(hào) QQ、微博、微信等賬號(hào)
場(chǎng)景二:先使用微信、微博、QQ 等第三方賬號(hào)注冊(cè),之后再綁定手機(jī)及其他未綁定第三方賬號(hào);
以微信登錄為例,第一次綁定成功后,users 和 oauths。
通過第三方授權(quán)獲取的用戶信息 (昵稱、頭像) 創(chuàng)建 users 數(shù)據(jù):
| 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 |
根據(jù)用戶 ID 及第三方授權(quán)獲得的信息創(chuàng)建 oauths 數(shù)據(jù)
| id | user_id | oauth_type | oauth_id | unionid | credential |
|---|---|---|---|---|---|
| 1 | 2 | o2sck0XXXXXXR-NDA | osssck0XXXXXXR-NDA | null |
其中微信登錄可分為 wechat 微信移動(dòng)應(yīng)用,official_account 微信公眾賬號(hào),mini_program 微信小程序,同一主體的情況下 unionid 是一致的。
之后再根據(jù)用戶 ID 綁定手機(jī)及其他未綁定第三方賬號(hào)。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 可擴(kuò)展;
- 易維護(hù);
- 用戶表簡(jiǎn)潔明了;
缺點(diǎn):
會(huì)產(chǎn)生一個(gè)人有多個(gè)賬號(hào)的情況。
例如:當(dāng)用戶用手機(jī)號(hào)注冊(cè)后,退出登錄,再使用微信授權(quán)登錄就會(huì)產(chǎn)生 2 個(gè) users 數(shù)據(jù)(反之亦然),但是本質(zhì)來說是一個(gè)用戶。
解決方法:
- 當(dāng)用戶第一次使用微信授權(quán)綁定的之后,彈出綁定手機(jī)頁(可跳過,不強(qiáng)制綁定),如果手機(jī)號(hào)已經(jīng)存在則告訴用戶,“該手機(jī)號(hào)以存在,無法綁定”。
- 當(dāng)用戶使用手機(jī)號(hào)直接注冊(cè)的賬戶登錄后,授權(quán)綁定上述微信時(shí)提示用戶 “此賬號(hào)已存在綁定”;
有時(shí)候適當(dāng)?shù)臎_突是無法避免的,可以使用友好的設(shè)計(jì)與話語增加用戶體驗(yàn)。
Todo
- users_extends 表的使用舉例。
- 會(huì)員系統(tǒng)