分享一個便於擴充套件的使用者表結構

sunxyw發表於2020-04-13

使用者表可以說是每個專案立項動工時首要考慮的一件事情。使用者表結構的設計直接影響著專案的可靠性和擴充套件性,與其待以後需要滿足需求不斷改動,倒不如一開始就設計一個易於擴充套件的使用者表,爭取一步到位。

基礎設計

大部分初學者所學到的,以及不少框架自帶的使用者表都是類似下面這種結構的。

id
name
password

這是一個相當簡單的使用者表,只包含了使用者ID、名稱、密碼等必要的資訊。假如需要在這基礎上加上一些欄位,比如生日、住址甚或使用者狀態等,就只能繼續加欄位,變成了下面這樣。

id
name
password
birthday
address
status

這樣做在初期是沒有什麼大問題的,頂多就是麻煩點。然而,隨著越來越多應用開放第三方登入,我們自己的專案也得加上第三方資訊表,於是,我們有了第二個表。

socials
-------
id
user_id
type
value
credential

我們用 typevalue 存放第三方型別以及第三方使用者標識,用 credential 來存放密碼、Token等資訊。
以上這種方式毫無疑問是可以解決問題的,可就是過於麻煩了。

正式內容

users
-------
id
nickname
avatar
status
socials
-------
id
user_id
type
value
credential
union_id
user_auths
-------
id
user_id
type
identifier
credential
user_extends
-------
id
user_id
field
value

users 表僅儲存一些必要的使用者資訊,其他額外資訊如生日、住址等存放於 user_extends 表,使用者繫結的第三方資訊存放於 socials 表。認證資訊存放於 user_auths 表,其中的 type 欄位是登入的型別,如手機號、郵箱、使用者名稱等,比如手機號登入的時候只要找出 type = 'phone' AND identifier = 123456789 的記錄,然後判斷密碼(或驗證碼)即可。

結語

我承認,寫一半的時候我就不知道自己在說什麼了(捂臉)。大佬們輕點噴。

參考資料

可擴充套件的使用者表設計 by franktrue
淺談資料庫使用者表結構設計 by 一步一步向上爬

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章