1. 程式人生 > >為表增加列屬性方法探究

為表增加列屬性方法探究

2個 http nbsp awl 一分鐘 osql 新版 滿足 scene

需求緣起

產品第一版:用戶有用戶名、密碼、昵稱等三個屬性,對應表設計:

user(uid, name, passwd, nick)

第二版,產品經理增加了年齡,性別兩個屬性,表結構可能要變成:

user(uid, name, passwd, nick, age, sex)

假設數據量和並發量比較大,怎麽變?

(1)alter table add column?不太可行,鎖表時間長

(2)新表+觸發器?如果數據量太大,新表不一定裝得下,何況觸發器對數據庫性能的影響比較高

(3)讓dba來搞?新表,遷移數據,一致性校驗,rename?dba真苦逼

今天分享2個列擴展性設計上幾個小技巧,只占大夥1分鐘(下班太晚的話,只能寫一分鐘系列=_=)

方案一:版本號+通用列

以上面的用戶表為例,假設只有uid和name上有查詢需求,表可以設計為

user(uid, name, version, ext)

(1)uid和name有查詢需求,必須設計為單獨的列並建立索引

(2)version是版本號字段,它對ext進行了版本解釋

(3)ext采用可擴展的字符串協議載體,承載被查詢的屬性

例如,最開始上線的時候,版本為0,此時只有passwd和nick兩個屬性,那麽數據為:

技術分享

當產品經理需要擴展屬性時,新數據將版本變為1,此時新增了age和sex兩個數據,數據變為:

技術分享優點

(1)可以隨時動態擴展屬性

(2)新舊兩種數據可以同時存在

(3)遷移數據方便,寫個小程序將舊版本ext的改為新版本的ext,並修改version

不足

(1)ext裏的字段無法建立索引

(2)ext裏的key值有大量冗余,建議key短一些

改進

(1)如果ext裏的屬性有索引需求,可能Nosql的如MongoDB會更適合

方案二:通過擴展行的方式來擴展屬性

以上面的用戶表為例,可以設計為

user(uid, key, value)

初期有name, passwd, nick三個屬性,那麽數據為:

技術分享

未來擴展了age和sex兩個屬性,數據變為:

技術分享優點

(1)可以隨時動態擴展屬性

(2)新舊兩種數據可以同時存在

(3)遷移數據方便,寫個小程序可以將新增的屬性加上

(4)各個屬性上都可以查詢

不足

(1)key值有大量冗余,建議key短一些

(2)本來一條記錄很多屬性,會變成多條記錄,行數會增加很多

總結

可以通過“version+ext”或者“key+value”的方式來滿足產品新增列的需求,希望沒有浪費你這一分鐘,有收獲就好。

原文鏈接:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959762&idx=1&sn=f7d8d7648416a0157af6ac61a6b555c8&chksm=bd2d040e8a5a8d181ec1baa2e96982991ddfc218bb6838f38da61b651e4b8de5f0bbbd94f814&scene=21#wechat_redirect

為表增加列屬性方法探究