可綁定可擴展的帳號系統設計原理及其實現(一)

轉載:http://blog.cocosdever.com/2016/03/08/The-design-principle-and-implementation-of-extensible-account-system-1/



前言

  在2016年春節前兩個星期,我負責公司的新項目一元奪寶的個人中心的設計.主要的需求包括用戶註冊,登錄,用戶訂單聚合,中獎數據查詢等等.裏面的用戶註冊和登錄部分比較特殊,因爲公司另一個產品要求奪寶項目的帳號系統能與其打通,實現另一個項目(下文簡稱B項目)的用戶可以直接登錄到奪寶項目上.B項目主要是依賴手機號碼作爲用戶的帳號,而奪寶項目則允許用戶通過手機號碼註冊,微信自動登錄註冊,QQ自動登錄註冊等等(下文統稱第三方登錄).同時要求已經使用手機號碼註冊的用戶可以綁定自己的多個第三方帳號;只使用第三方帳號登錄的用戶也可以隨時綁定自己的手機號,而新綁定的手機號也可以是B項目的手機號或者奪寶項目存在的帳號或者全新的號碼,如果手機號已經註冊的則將數據與手機號所在帳號合併.通過上述約束來實現所有帳號都互相打通,當然數據也要求互相打通.經過詳細探討,最終解決了這個特殊的需求.
  現在春節過去了,我也在此總結分析一下這次的可擴展帳號系統的設計原理,而在下一篇文章中,我將介紹具體實現的技術細節.

需求場景

  1. 每個用戶都存在多個不同的註冊登錄方式,比如微信,QQ,微博.
  2. 登錄方式在未來可能增加或者減少.
  3. 用戶在使用不同的途徑註冊登錄之後就成爲獨立帳號,每一個獨立帳號又可以互相綁定.
  4. 綁定之後的帳號視爲一體,但是仍然可以使用不同途徑登錄.
  5. 相互綁定之後的帳號,可能在系統留存大量數據,不適合數據遷移.
  6. 用戶的主要帳號(例如手機號)可以被多次綁定到不同的第三方帳號上,擁有相同主帳號的帳號視爲同一帳號,數據互通.
    本文教程實現一個能滿足以上描述的帳號系統,至於大家在實際項目中可以根據自己需求,在邏輯業務中禁止或允許用戶相關行爲.

難點分析

  1. 隨着時間推移,後期可能增加更多登錄的途徑,所以系統需要使用可擴展的方式實現
  2. 假設用戶已經用手機號碼註冊過(這裏稱爲老帳號),此時如果使用微信登錄並且完成了相關購買等,再綁定到老帳號上,這時候需要實現用戶新舊數據合併,以確保前端展示的數據和用戶的真實查詢一致;如果再加入QQ登錄並且綁定同個手機號,同樣需要把QQ操作的數據綁定到老帳號上,擁有相同老帳號的帳號數據互通.此處也爲一難點,需要靈活處理.
  3. 用戶綁定數據之後,其實就相當於只有一個主帳號被使用了.其他第三方帳號比如微信,在微信登錄的時候,仍然需要通過微信特徵(openid)進行用戶登錄驗證.因此需要保留第三方帳號的關鍵數據,如果直接把這個關鍵數據所有字段放入帳號表,則以後多增加一種方式都需要去修改一下數據表字段,這顯然是不可取.此處的設計也是一要點難點.

設計原理

  難點分析一節已經描述了潛在的設計難點,接下來分別從數據庫設計,程序邏輯設計兩大部分闡述設計的原理

數據庫設計

可擴展帳號系統的設計

Users表設計

  相信大部分同學一開始想到的就是在users表中增加第三方登錄的唯一表示字段.比如在users表的用戶名,密碼,基礎上增加一個wx_openid,用來表示微信唯一標識,qq_openid用來表示QQ唯一標識.然後表的主要字段看起來就像這樣:

id phone(主帳號) balance nickname wx_openid qq_openid weibo_openid
6 10086 1000(幣) 啊C aaa bbb ccc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章