W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
《啥,又要為表增加一列屬性?》的方案頗有爭議:
(1)版本號version + 擴展字段ext
(2)用增加列的key+value方式擴充屬性
討論問題域:
(1)數(shù)據(jù)量大、并發(fā)量高場景,在線數(shù)據(jù)庫屬性擴展
(2)數(shù)據(jù)庫表結(jié)構(gòu)擴展性設(shè)計
(1)alter table add column
要堅持這個方案的,也不多解釋了,大數(shù)據(jù)高并發(fā)情況下,一定不可行
(2)通過增加表的方式擴展,通過外鍵join來查詢
大數(shù)據(jù)高并發(fā)情況下,join性能較差,一定不可行
(3)通過增加表的方式擴展,通過視圖來對外
一定不可行。大數(shù)據(jù)高并發(fā)情況下,互聯(lián)網(wǎng)不怎么使用視圖,至少58禁止使用視圖
(4)必須遵循“第x范式”的方案
一定不可行?;ヂ?lián)網(wǎng)的主要矛盾之一是吞吐量,為了保證吞吐量甚至可能犧牲一些事務(wù)性和一致性,通過反范式的方式來確保吞吐量的設(shè)計是很常見的,例如:冗余數(shù)據(jù)?;ヂ?lián)網(wǎng)的主要矛盾之二是可用性,為了保證可用性,常見的技術(shù)方案也是數(shù)據(jù)冗余。在互聯(lián)網(wǎng)數(shù)據(jù)庫架構(gòu)設(shè)計中,第x范式真的沒有這么重要
(5)打產(chǎn)品經(jīng)理
朋友,這是段子么,這一定不可行
(1)提前預(yù)留一些reserved字段
這個是可以的。但如果預(yù)留過多,會造成空間浪費,預(yù)留過少,不一定達得到擴展效果。
(2)通過增加表的方式擴展列,上游通過service來屏蔽底層的細節(jié)
這個也是可以的。Jeff同學(xué)提到的UserExt(uid, newCol1, newCol2)就是這樣的方案(但join連表和視圖是不行的)
(1)version+ext太弱了,ext不支持索引
回復(fù):屬于沒有仔細看文章,文章也提了如果有強需求索引可以使用MongoDB,它就是使用的json存儲(評論中有不少朋友提到,還有其他數(shù)據(jù)庫支持json檢索)
(2)第二種key+value方案不支持索引
回復(fù):uid可以索引
服務(wù)端,wordpress,EAV,配置,統(tǒng)計項等都經(jīng)常使用這個方案。
客戶端(APP或者PC),保存?zhèn)€人信息也經(jīng)常使用這個方案。
今天的重點
以樓主性格,本不會進行“解釋”,上文解釋這般,說明這一次,樓主真的認真了。對于技術(shù),認真是好事,認真的男人最可愛(打住,我要吐了)。好了,下面的內(nèi)容才是今天的重點。
在《啥,又要為表增加一列屬性?》文章的開頭,已經(jīng)說明常見“新表+觸發(fā)器+遷移數(shù)據(jù)+rename”方案(pt-online-schema-change),這是業(yè)內(nèi)非常成熟的擴展列的方案(以為大伙都熟悉,沒有展開講,只重點講了兩種新方案,這可能是導(dǎo)致被噴得厲害的源頭),今天補充說一下。
以user(uid, name, passwd)
擴展到user(uid, name, passwd, age, sex)為例
基本原理是:
(1)先創(chuàng)建一個擴充字段后的新表user_new(uid, name, passwd, age, sex)
(2)在原表user上創(chuàng)建三個觸發(fā)器,對原表user進行的所有insert/delete/update操作,都會對新表user_new進行相同的操作
(3)分批將原表user中的數(shù)據(jù)insert到新表user_new,直至數(shù)據(jù)遷移完成
(4)刪掉觸發(fā)器,把原表移走(默認是drop掉)
(5)把新表user_new重命名(rename)成原表user
擴充字段完成。
操作過程中需要注意:
(1)變更過程中,最重要的是沖突的處理,一條原則,以觸發(fā)器的新數(shù)據(jù)為準,這就要求被遷移的表必須有主鍵(這個要求基本都滿足)
(2)變更過程中,寫操作需要建立觸發(fā)器,所以如果原表已經(jīng)有很多觸發(fā)器,方案就不行(互聯(lián)網(wǎng)大數(shù)據(jù)高并發(fā)的在線業(yè)務(wù),一般都禁止使用觸發(fā)器)
(3)觸發(fā)器的建立,會影響原表的性能,所以這個操作建議在流量低峰期進行
歡迎用批判的眼光看問題,歡迎任何友善的技術(shù)討論,不太歡迎“純屬誤導(dǎo)”“非常蠢的方案”這樣的評論(但我還是會加精選,任何人都有發(fā)聲的權(quán)利)。
借評論中@張九云 朋友的一句話“不要以為自己見過的就是全世界,任何方案都有使用場景,一切都是tradeoff”作為今天的結(jié)尾,謝謝大家的支持,感謝大家。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: