行式存儲(chǔ)
成都創(chuàng)新互聯(lián)是專業(yè)的湛河網(wǎng)站建設(shè)公司,湛河接單;提供成都網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行湛河網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
傳統(tǒng)的數(shù)據(jù)庫(kù)是關(guān)系型的,且是按行來(lái)存儲(chǔ)的。如下圖:
其中只有張三把一行數(shù)據(jù)填滿了,李四王五趙六的行都沒(méi)有填滿。因?yàn)檫@里的行結(jié)構(gòu)是固定的,每一行都一樣,即使你不用,也必須空到那里,而不能沒(méi)有。來(lái)一張形象的圖:
不管你坐或不坐,座位都在那里,不離不棄。
列式存儲(chǔ)
為了與傳統(tǒng)的區(qū)別,新型數(shù)據(jù)庫(kù)叫做非關(guān)系型數(shù)據(jù)庫(kù),是按列來(lái)存儲(chǔ)的。如下圖:
初次看列式存儲(chǔ)稍微有點(diǎn)懵,下面給出行存與列存的轉(zhuǎn)換:
原來(lái)張三的一列(單元格)數(shù)據(jù)對(duì)應(yīng)現(xiàn)在張三的一行數(shù)據(jù)。原來(lái)張三的六列數(shù)據(jù)變成了現(xiàn)在的六行。
原來(lái)的六列數(shù)據(jù)是在一行,所以共用一個(gè)主鍵(即張三)?,F(xiàn)在變成了六行,每行都需要一個(gè)主鍵(不然不知道這行數(shù)據(jù)是誰(shuí)的),所以原來(lái)的主鍵(即張三)重復(fù)了六次。如下圖:
由于原來(lái)的列變?yōu)榱爽F(xiàn)在的行,有需要就加一行,沒(méi)需要就不加,不會(huì)造成空間浪費(fèi)。來(lái)一張形象的圖:
(擺渡車內(nèi)部就是一個(gè)大平板)
你要站便站,我給你空間,你不站便不站,還給我空間。
行列對(duì)比
① 行式存儲(chǔ)傾向于結(jié)構(gòu)固定,列式存儲(chǔ)傾向于結(jié)構(gòu)弱化。
(行式存儲(chǔ)相當(dāng)于套餐,即使一個(gè)人來(lái)了也給你上八菜一湯,造成浪費(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。
官方介紹
Apache Hbase是Hadoop數(shù)據(jù)庫(kù),一個(gè)分布式、可擴(kuò)展、大數(shù)據(jù)存儲(chǔ)。
當(dāng)你需要隨機(jī)地實(shí)時(shí)讀寫大數(shù)據(jù)時(shí)使用Hbase。它的目標(biāo)是管理超級(jí)大表-數(shù)十億行X數(shù)百萬(wàn)列。
Hbase是一個(gè)開源的、分布式的、帶版本的、非關(guān)系型數(shù)據(jù)庫(kù),模仿谷歌的BigTable。BigTable使用Google File System作為分布式數(shù)據(jù)存儲(chǔ),同理Hbase使用HDFS。
Hbase世界
Hbase雖然弱化了結(jié)構(gòu),但并不等于放任不管。傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在插入數(shù)據(jù)前表結(jié)構(gòu)(即所有列和列的數(shù)據(jù)類型)已經(jīng)是嚴(yán)格確定的。
Hbase的表在放入數(shù)據(jù)前也有需要確定下來(lái)的東西,那就是Column Family(常譯為列族/列簇)。單詞Family就是家庭的意思,所以列族就是列的家庭。那么列自然就是家庭成員了,通常家庭成員都有多個(gè),所以一個(gè)列族包含多個(gè)列。
一個(gè)家庭的成員之間具有血緣關(guān)系,所以一個(gè)列族的多個(gè)列之間通常也具有某種關(guān)系,比如相似或同種類別。所以列族可以看作是某種分類(歸類)。
一個(gè)非常常見(jiàn)的例子,去面試的時(shí)候,一般前臺(tái)MM都會(huì)讓填一張表,通常信息很多,每個(gè)公司又不盡相同。但大致可以分三類:人員基本信息,教育經(jīng)歷信息,工作經(jīng)歷信息,這三個(gè)類別其實(shí)就相當(dāng)于三個(gè)列族。如下圖:
每個(gè)類別里都會(huì)有具體的信息,比如人員基本信息里有姓名、電話、出生年月等,它們就相當(dāng)于一個(gè)個(gè)標(biāo)識(shí)符(變量名),在Hbase中叫做Column Qualifier(列修飾符)。列修飾符位于列族里面用來(lái)標(biāo)識(shí)一條條數(shù)據(jù)。如下圖:
在Hbase中一個(gè)列族(Column Family)和一個(gè)列修飾符(Column Qualifier)組合起來(lái)才叫一個(gè)列(Column),使用冒號(hào)(:)分割,列族:列修飾符,如下圖:
在傳統(tǒng)數(shù)據(jù)庫(kù)中每一行的唯一標(biāo)識(shí)符叫做主鍵,在Hbase中叫做row key(行鍵)。如下圖:
數(shù)據(jù)在進(jìn)入Hbase時(shí)都會(huì)被打上一個(gè)時(shí)間戳,這個(gè)時(shí)間戳可以作為版本號(hào)來(lái)使用。
在t1時(shí)間我存入一個(gè)人的基本信息,之后發(fā)現(xiàn)姓名錯(cuò)了,在t2時(shí)間又更新了姓名,此時(shí)并不會(huì)去更新原來(lái)的那條數(shù)據(jù),而是又插入了一條新數(shù)據(jù)且打上新的時(shí)間戳。
此時(shí)去查詢獲取的是新數(shù)據(jù),仿佛是更新了,但其實(shí)只是默認(rèn)返回了最新版本的數(shù)據(jù)而已。如下圖:
一個(gè)行鍵、列族、列修飾符、數(shù)據(jù)和時(shí)間戳組合起來(lái)叫做一個(gè)單元格(Cell)。這里的行鍵、列族、列修飾符和時(shí)間戳其實(shí)可以看作是定位屬性(類似坐標(biāo)),最終確定了一個(gè)數(shù)據(jù)。下圖中的一行相等于Hbase中的一個(gè)單元格:
一個(gè)行鍵、一到多列(包括數(shù)據(jù))組合起來(lái)叫做一行(Row)。下圖中所有1001的數(shù)據(jù)合起來(lái)相當(dāng)于Hbase中的一行,1002的相當(dāng)于另一行:
在Hbase中,只要確定了列族(具體的列不用管),表(Table)就確定了。如下圖:
官方文檔中提醒:把傳統(tǒng)數(shù)據(jù)庫(kù)中的表/行/列的概念用在Hbase中不是一個(gè)有幫助的類比。相反可以把Hbase的表想象成一個(gè)多(兩)維Map(Map套Map)。列族是第一維,列修飾符是第二維。
說(shuō)明:任何細(xì)微的差別在大數(shù)量時(shí)都會(huì)被無(wú)限放大,那么列族和列修飾符的名字起的短一些能夠節(jié)省可觀的空間。
說(shuō)明:從嚴(yán)格的列式存儲(chǔ)的定義來(lái)看,Hbase并不屬于列式存儲(chǔ),有人稱它為面向列的存儲(chǔ),請(qǐng)各位看官注意這一點(diǎn)。
(完)
編程新說(shuō)
用獨(dú)特的視角說(shuō)技術(shù)