可擴(kuò)展的用戶表設(shè)計(jì)

用戶表結(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ì)用戶表呢?

需求分析

  1. 多種登錄方式:包括手機(jī)號(hào)、微信、QQ、微博等;
  2. 可進(jìn)行綁定和解綁或者更換綁定:用戶使用任意方式登錄后可綁定和解綁或者更換綁定其他 登錄授權(quán);
  3. 支持 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 wechat 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è)用戶。
解決方法:

  1. 當(dāng)用戶第一次使用微信授權(quán)綁定的之后,彈出綁定手機(jī)頁(可跳過,不強(qiáng)制綁定),如果手機(jī)號(hào)已經(jīng)存在則告訴用戶,“該手機(jī)號(hào)以存在,無法綁定”。
  2. 當(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容