你也許聽(tīng)說(shuō)過(guò)圖形數(shù)據(jù)庫(kù),也知道它不是存儲(chǔ)圖片文件的數(shù)據(jù)庫(kù)。但是:為什么總有人吹捧它是大數(shù)據(jù)時(shí)代的利器?是數(shù)據(jù)庫(kù)領(lǐng)域重大的技術(shù)革新?它和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)相比有哪些優(yōu)劣?本文將帶你揭開(kāi)圖形數(shù)據(jù)庫(kù)的神秘面紗。
什么是圖形數(shù)據(jù)庫(kù)
要理解圖形數(shù)據(jù)庫(kù),你暫時(shí)還不需要具備太多圖論的知識(shí)。實(shí)際上,圖形數(shù)據(jù)庫(kù)(GDBMS)在筆者眼中比關(guān)系數(shù)據(jù)庫(kù)(RDBMS)更容易理解。
圖(Graph)由頂點(diǎn)(Vertex)和邊(Edge)組成。
在圖形數(shù)據(jù)庫(kù)領(lǐng)域,我們有時(shí)候喜歡把頂點(diǎn)和邊稱為節(jié)點(diǎn)(Node)和關(guān)系(Relationship),但顯然它們是同一回事。
每個(gè)節(jié)點(diǎn)表示一個(gè)實(shí)體(個(gè)人、地點(diǎn)、事物、類別或其他數(shù)據(jù)塊),每個(gè)關(guān)系表示兩個(gè)節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系。
例如,兩個(gè)節(jié)點(diǎn) 中國(guó) 和 臺(tái)灣 的關(guān)系是 臺(tái)灣 屬于 中國(guó);而兩個(gè)節(jié)點(diǎn)臺(tái)灣和鳳梨酥 的關(guān)系是鳳梨酥是臺(tái)灣的特產(chǎn)。
為什么圖數(shù)據(jù)庫(kù)是未來(lái)的必然趨勢(shì)?
我們生活的世界充滿了對(duì)象之間的相互聯(lián)系,你能舉出一個(gè)例子,某一對(duì)象是完全孤立、不和外界發(fā)生任何關(guān)聯(lián)嗎?圖數(shù)據(jù)庫(kù)在描述、存儲(chǔ)、查詢這些關(guān)聯(lián)時(shí)具有天生優(yōu)勢(shì)。
我們繼續(xù)擴(kuò)展上面的例子,上海也屬于中國(guó),陸家嘴位于上海,喬治在陸家嘴上班,佩奇是喬治的姐姐,佩奇來(lái)自臺(tái)灣,喬治雖然出生在內(nèi)地但是去過(guò)臺(tái)灣,喬治還很喜歡吃鳳梨酥。
如果你是業(yè)務(wù)/產(chǎn)品工作人員,你一定希望你的產(chǎn)品或者業(yè)務(wù)涉及到用戶的方方面面。如果你是開(kāi)發(fā)人員,你一定希望能夠簡(jiǎn)單高效地描述這個(gè)紛繁復(fù)雜的世界。
在傳統(tǒng)的技術(shù)方中,一般會(huì)用關(guān)系型數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)進(jìn)行持久化(長(zhǎng)時(shí)存儲(chǔ))。那么為了描述上圖中的模型,我們需要建立多少?gòu)埍砟???guó)家、省/市、人、食品、地標(biāo)、國(guó)家與省/市關(guān)系、省/市與食品關(guān)系、人與省/市關(guān)系、人與……至少十幾張表。
這倒沒(méi)什么大不了的。
現(xiàn)在請(qǐng)查詢:在哪個(gè)城市上班的人最喜歡吃鳳梨酥?
嗯……你只需要關(guān)聯(lián)食品表、人員表、人喜歡的食品關(guān)聯(lián)關(guān)系表三張表就可以查到喬治等人喜歡吃鳳梨酥,但是你還得再關(guān)聯(lián)兩張表找到他們?cè)谀膫€(gè)地標(biāo)工作,進(jìn)而再關(guān)聯(lián)兩張表找到這些地標(biāo)在哪個(gè)城市。還沒(méi)完,你還得group by一下,再排個(gè)序。
你會(huì)覺(jué)得這個(gè)查詢簡(jiǎn)直有病。但這恰恰是數(shù)據(jù)分析師最基本的工作,也是大數(shù)據(jù)時(shí)代海量信息處理的一個(gè)縮影。
利用圖形數(shù)據(jù)庫(kù),我們可以更輕易地描述和更方便地查詢上圖所示的關(guān)系。下一節(jié)我們將看到,在關(guān)聯(lián)關(guān)系更復(fù)雜的情形下,圖形數(shù)據(jù)庫(kù)的查詢效率遠(yuǎn)遠(yuǎn)高于關(guān)系型數(shù)據(jù)庫(kù)。
圖數(shù)據(jù)庫(kù) VS 關(guān)系型數(shù)據(jù)庫(kù)
1.性能
大數(shù)據(jù)時(shí)代,人類社會(huì)的數(shù)據(jù)量呈爆發(fā)式增長(zhǎng)。任何業(yè)務(wù)或產(chǎn)品所積累的數(shù)據(jù)一定是快速增長(zhǎng)的,這沒(méi)有疑義,但更重要的是,數(shù)據(jù)與數(shù)據(jù)之間的連接(或者說(shuō)關(guān)系)將呈現(xiàn)平方級(jí)增長(zhǎng):
3個(gè)點(diǎn)最多有6條有向邊,4個(gè)點(diǎn)最多有12個(gè)有向邊,N個(gè)節(jié)點(diǎn)最多有N * (N-1)個(gè)有向邊。
在傳統(tǒng)的數(shù)據(jù)庫(kù)中,隨著關(guān)系的數(shù)量和深度的增加,關(guān)系查詢的效率將急劇衰減,甚至崩潰。
然而圖形數(shù)據(jù)庫(kù)的性能將幾乎不變,即使數(shù)據(jù)每天都在增長(zhǎng)。
這個(gè)性能差異有多大呢,引用Neo4j(一款圖形數(shù)據(jù)庫(kù))發(fā)布的測(cè)試數(shù)據(jù),我們希望在一個(gè)社交網(wǎng)絡(luò)里找到最大深度為指定值的朋友組合。
在100萬(wàn)人的人群中,設(shè)置每個(gè)人大約有50個(gè)朋友,隨機(jī)選擇兩個(gè)人,是否存在一條路徑,使得他們之間的關(guān)聯(lián)關(guān)系長(zhǎng)度為2或3或4或5?
圖形數(shù)據(jù)庫(kù)與關(guān)系型數(shù)據(jù)庫(kù)執(zhí)行時(shí)間對(duì)比如下表。
可見(jiàn),在這種關(guān)聯(lián)關(guān)系復(fù)雜且關(guān)聯(lián)深度較大的情形下,用圖形數(shù)據(jù)庫(kù)對(duì)陣關(guān)系型數(shù)據(jù)庫(kù)簡(jiǎn)直好比降維打擊。
2.靈活性
圖形數(shù)據(jù)模型的結(jié)構(gòu)和模式隨著解決方案和行業(yè)的變化而變化。開(kāi)發(fā)團(tuán)隊(duì)不必提前對(duì)未來(lái)的需求進(jìn)行詳盡的建模(然后在某些業(yè)務(wù)/產(chǎn)品人員要求更改后徹底地推翻重做);相反,新的節(jié)點(diǎn)、關(guān)系、節(jié)點(diǎn)的屬性還有關(guān)系的屬性都可以后期添加到現(xiàn)有結(jié)構(gòu)中,完全不會(huì)危及當(dāng)前的功能。
一個(gè)有趣的說(shuō)法是:面對(duì)圖形數(shù)據(jù)庫(kù)模型,你只需要口述你的需求,然后讓它作出改變;而關(guān)系型數(shù)據(jù)庫(kù)模型則恰好相反,它告訴你它的需求,迫使你適應(yīng)它那該死的表格結(jié)構(gòu)。
3.敏捷性
使用圖形技術(shù)開(kāi)發(fā)完全符合當(dāng)今的敏捷、測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)實(shí)踐,它允許數(shù)據(jù)層支持的應(yīng)用程序隨著業(yè)務(wù)需求的發(fā)展而快速迭代更新。
有哪些好用的圖形數(shù)據(jù)庫(kù)(最好是開(kāi)源的)?
圖形數(shù)據(jù)庫(kù)技術(shù)日益發(fā)展的今天,已經(jīng)有不少優(yōu)秀的項(xiàng)目誕生并在各領(lǐng)域大展身手,比如:
Neo4j, Titan, JanusGraph, ArangoDB, OrientDB等。