引言
很多人剛開始學(xué)習(xí)數(shù)據(jù)庫的時(shí)候可能接觸到的都是關(guān)系型數(shù)據(jù)庫RDS,它是基于行式存儲(chǔ)的思想來進(jìn)行數(shù)據(jù)存儲(chǔ)的腰埂;但是數(shù)據(jù)庫存儲(chǔ)領(lǐng)域還有一個(gè)不容小覷的力量飒焦,非關(guān)系型數(shù)據(jù)庫NoSQL,其中一部分NoSQL數(shù)據(jù)庫是采用了列式存儲(chǔ)的思想,那么我們不禁發(fā)問牺荠,行式存儲(chǔ)和列式存儲(chǔ)到底有什么區(qū)別翁巍?什么樣的場景下列式存儲(chǔ)類型的數(shù)據(jù)庫更加適用呢?
今天這篇文章我們就來探究一下行式存儲(chǔ)和列式存儲(chǔ)的區(qū)別和聯(lián)系休雌。
行式存儲(chǔ)VS 列式存儲(chǔ)
行式存儲(chǔ)
傳統(tǒng)的數(shù)據(jù)庫是關(guān)系型的灶壶,且是按行來存儲(chǔ)的。如下圖
觀察上圖杈曲,我們不難發(fā)現(xiàn):因?yàn)槊總€(gè)人學(xué)歷不一樣的原因驰凛,只有張三一個(gè)人將整行數(shù)據(jù)都填滿了,李四担扑、王五恰响、趙六的數(shù)據(jù)都沒有將對(duì)應(yīng)的行填滿。因?yàn)檫@里的行結(jié)構(gòu)是固定的涌献,每一行都一樣胚宦,即使你不用,也必須空到那里燕垃,而不能沒有枢劝,而這樣的空行也是需要占用一定的存儲(chǔ)空間的,如果這樣的空行占比較大卜壕,勢必帶來較大的存儲(chǔ)空間的浪費(fèi)您旁,那么是否有什么好的解決辦法么?
列式存儲(chǔ)
為了與傳統(tǒng)的區(qū)別轴捎,新型數(shù)據(jù)庫叫做非關(guān)系型數(shù)據(jù)庫被冒,是按列來存儲(chǔ)的。如下圖:
下面給出行存儲(chǔ)與列存儲(chǔ)的映射關(guān)系:
原來張三的一列(單元格)數(shù)據(jù)對(duì)應(yīng)現(xiàn)在張三的一行數(shù)據(jù)轮蜕。原來張三的六列數(shù)據(jù)變成了現(xiàn)在的六行。
原來的六列數(shù)據(jù)是在一行蝗锥,所以共用一個(gè)主鍵(即張三)≡韭澹現(xiàn)在變成了六行,每行都需要一個(gè)主鍵(不然不知道這行數(shù)據(jù)是誰的)终议,所以原來的主鍵(即張三)重復(fù)了六次汇竭。如下圖:
相當(dāng)于將每一行的每一列拆開,然后通過rowkey(行唯一鍵)關(guān)聯(lián)起來穴张,rowkey相同的這些數(shù)據(jù)其實(shí)就是原來的一行细燎。由于原來的列變?yōu)榱爽F(xiàn)在的行,有需要就加一行皂甘,沒需要就不加玻驻,有效地減少了存儲(chǔ)空間的浪費(fèi)。
行存儲(chǔ)與列存儲(chǔ)的對(duì)比
- 行式存儲(chǔ)傾向于結(jié)構(gòu)固定,列式存儲(chǔ)傾向于結(jié)構(gòu)弱化璧瞬。
(行式存儲(chǔ)相當(dāng)于套餐户辫,即使一個(gè)人來了也給你上八菜一湯,造成浪費(fèi)嗤锉;列式存儲(chǔ)相等于自助餐渔欢,按需自取,人少了也不浪費(fèi)) - 行式存儲(chǔ)一行數(shù)據(jù)只需一份主鍵瘟忱,列式存儲(chǔ)一行數(shù)據(jù)需要多份主鍵奥额。
- 行式存儲(chǔ)存的都是業(yè)務(wù)數(shù)據(jù),列式存儲(chǔ)除了業(yè)務(wù)數(shù)據(jù)外访诱,還要存儲(chǔ)列名垫挨。
- 行式存儲(chǔ)更像一個(gè)Java Bean,所有字段都提前定義好盐数,且不能改變棒拂;列式存儲(chǔ)更像一個(gè)Map,不提前定義玫氢,隨意往里添加key/value帚屉。