乙個帶有使用者系統的應用最基本登入方式是站內賬號登入,但這種方式往往不能滿足我們的需求。現在的應用基本都有站內賬號、email、手機和一堆第三方登入,那麼如果需要支援這麼多種登入方式,或者還有銀行卡登入、身份證登入等等更多的登入方式,我們的資料表應該怎麼設計才更合理呢?
首先,乙個使用者不管有多少種登入方式,使用者還是只有那乙個使用者,但登入方式卻有多種。這就形成了一對多的關係:乙個使用者對應多個登入方式。
所以,我們就可以把使用者表拆分成2張表,一張表儲存使用者基本的資料,另一張表儲存登入授權相關的資料。我們可以向下面這樣設計:
這樣我們建立乙個使用者,首先需要建立一條使用者表的使用者基礎資訊記錄和一條或者多條授權表的授權記錄。注意修改密碼時也需要同時修改多條授權表記錄,保證需要密碼的登入方式憑證需要同步更新。
通過這種表結構設計,使許多原來糾結的問題瞬間解決。
優點:
1、站內登入型別無限拓展,**改動小。如果真要支援身份證登入了,只要少許幾處改動,無需修改表結構。
2、第三方登入型別可用工場模式批量拓展,新增第三方登入型別的開發成本降到最低。
3、在user_auths表中增加乙個統一的verified欄位,每種登入方式都可以直**到是否已驗證情況。基於信任第三方登入的資料準確性,預設第三方登入都是已驗證。如果使用者修改登入手機號或登入郵箱,也能清晰跟蹤每一步的完成度。
5、在user_auths新增相應的時間和ip位址,就可以更加完整地跟蹤使用者的使用習慣(此部分應該單獨建立日誌表6、即使完全使用第三方帳號登入,可在前端做到「無需註冊本站帳號」的效果。過去許多**雖然支援第三方帳號登入,但出於留存使用者等原因,第一次微博登入回來,讓你再填寫一套他們**的郵箱、密碼等資訊,也就失去了微博登入的最大意義。
從技術上說,原有的結構導致除了在微博使用者表建立乙個條目外,必須在使用者表建立一條對應的條目,而且一般情況下不能讓使用者表裡的郵箱或者使用者名稱和密碼留空。使用者體驗好的,郵箱自動生成 微博[email protected] ,密碼則隨機生成。至於體驗不好的,只能說早知道還不如不用微博登入呢!現在呢,我們的這個使用者表結構則完全沒有這樣的困擾,只要微博提供的暱稱和頭像位址就可以生成這個使用者,再關聯他的微博登入記錄。而且我們的表結構意味著,使用者可以解除他的所有登入方式,於是這個賬戶便徹底變成了沒法登入的殭屍(解決辦法是在**裡加乙個限制,至少保留一條user_auths的記錄)。如果你非要得到使用者的郵箱,那麼每次登入的時候看到他不存在一條identitytype為email的記錄,則彈窗彈死他,讓他趕快填郵箱,否則啥都別幹。
7、提公升了邏輯思維能力。抽象出事物本質是碼農必備職業素養。
8、如果你說郵箱和手機號就是使用者資訊的組成部分,他們依然需要體現在users表中作為前端展示。users表儘管拓展,users表裡依然有email,phone。但它們僅僅作為「展示用途」,這和暱稱、頭像、或者性別這些屬性沒有本質區別。在使用者資訊表與使用者授權登入拆分後,使用者資訊表可以隨時增加任意字段,加星座,加生日,都沒問題,只需要在前端展示時多幾個輸入框,錄入時多幾行**,與使用者登入相關的問題做到最大程度解耦。
缺點:
1、原先的使用者判斷由1次sql變成2次sql請求。
2、使用者同時存在郵箱、使用者名稱、手機號等多種站內登入方式時,改密碼時必須一起改,否則就變成了郵箱+新密碼,手機號+舊密碼訪問了,肯定是很詭異的情況。如果考慮到這一點,又要在user_auths表中新增乙個表示站內登入方式或第三方登入方式的標識字段。
3、**量增加了,有些情況下邏輯判斷增加了,難度增大了。
1)該微博在本站未註冊過,很好,直接給他註冊關聯並登入;
2)該微博已經在本站存在,當前使用者未登入,直接登入成功;
3)該微博未在本站註冊,但當前使用者已經登入並關聯的是另乙個微博帳號,作何處理取決於是否允許繫結多個微博帳號;
4)該微博未在本站註冊過,當前使用者已登入,嘗試進行繫結操作;
多種資料庫的處理方式
1 oracle8 8i 9i資料庫 thin模式 載入驅動 class.forname oracle.jdbc.driver.oracledriver string url jdbc oracle thin localhost 1521 orcl orcl為資料庫的sid string user ...
登入mysql資料庫 登入mysql資料庫
二 登入mysql 1 以 windowns 命令方式登入 首先 在 cmd命令裡 切換到mysql的bin目錄下 c program files mysql mysql server 8.0 bin cd c program files mysql mysql server 8.0 bin c p...
資料庫登入
知識 一 mysql資料庫的備份命令 1 找到mysql安裝路徑下的bin檔案 2 在cmd命令視窗,cd到mysql安裝路徑下的bin檔案 3 輸入以下命令 mysqldump hlocalhost uroot p otpdb 1 otpdb 1.sql 4 則資料庫otpdb 1便被備份到bin...