新聞中心
需求緣起

創(chuàng)新互聯(lián)建站專注于平壩網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供平壩營銷型網(wǎng)站建設(shè),平壩網(wǎng)站制作、平壩網(wǎng)頁設(shè)計、平壩網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造平壩網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供平壩網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
產(chǎn)品***版:用戶有用戶名、密碼、昵稱等三個屬性,對應(yīng)表設(shè)計:
user(uid, name, passwd, nick)
第二版,產(chǎn)品經(jīng)理增加了年齡,性別兩個屬性,表結(jié)構(gòu)可能要變成:
user(uid, name, passwd, nick, age, sex)
假設(shè)數(shù)據(jù)量和并發(fā)量比較大,怎么變?
(1)alter table add column?不太可行,鎖表時間長
(2)新表+觸發(fā)器?如果數(shù)據(jù)量太大,新表不一定裝得下,何況觸發(fā)器對數(shù)據(jù)庫性能的影響比較高
(3)讓dba來搞?新表,遷移數(shù)據(jù),一致性校驗,rename?dba真苦逼
今天分享2個列擴展性設(shè)計上幾個小技巧,只占大伙1分鐘(下班太晚的話,只能寫一分鐘系列=_=)
方案一:版本號+通用列
以上面的用戶表為例,假設(shè)只有uid和name上有查詢需求,表可以設(shè)計為
user(uid, name, version, ext)
(1)uid和name有查詢需求,必須設(shè)計為單獨的列并建立索引
(2)version是版本號字段,它對ext進行了版本解釋
(3)ext采用可擴展的字符串協(xié)議載體,承載被查詢的屬性
例如,最開始上線的時候,版本為0,此時只有passwd和nick兩個屬性,那么數(shù)據(jù)為:
當(dāng)產(chǎn)品經(jīng)理需要擴展屬性時,新數(shù)據(jù)將版本變?yōu)?,此時新增了age和sex兩個數(shù)據(jù),數(shù)據(jù)變?yōu)椋?/p>
優(yōu)點:
(1)可以隨時動態(tài)擴展屬性
(2)新舊兩種數(shù)據(jù)可以同時存在
(3)遷移數(shù)據(jù)方便,寫個小程序?qū)⑴f版本ext的改為新版本的ext,并修改version
不足:
(1)ext里的字段無法建立索引
(2)ext里的key值有大量冗余,建議key短一些
改進:
(1)如果ext里的屬性有索引需求,可能Nosql的如MongoDB會更適合
方案二:通過擴展行的方式來擴展屬性
以上面的用戶表為例,可以設(shè)計為
user(uid, key, value)
初期有name, passwd, nick三個屬性,那么數(shù)據(jù)為:
未來擴展了age和sex兩個屬性,數(shù)據(jù)變?yōu)椋?/p>
優(yōu)點:
(1)可以隨時動態(tài)擴展屬性
(2)新舊兩種數(shù)據(jù)可以同時存在
(3)遷移數(shù)據(jù)方便,寫個小程序可以將新增的屬性加上
(4)各個屬性上都可以查詢
不足:
(1)key值有大量冗余,建議key短一些
(2)本來一條記錄很多屬性,會變成多條記錄,行數(shù)會增加很多
總結(jié)
可以通過“version+ext”或者“key+value”的方式來滿足產(chǎn)品新增列的需求,希望沒有浪費你這一分鐘,有收獲就好。
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】
標(biāo)題名稱:啥,又要為表增加一列屬性?
瀏覽路徑:http://m.fisionsoft.com.cn/article/coopcej.html


咨詢
建站咨詢
