圖數(shù)據(jù)庫(kù) | 靈活存儲(chǔ)復(fù)雜關(guān)聯(lián)關(guān)系
在這個(gè)數(shù)據(jù)為王的時(shí)代,如何存儲(chǔ)及分析海量數(shù)據(jù),是個(gè)不那么容易的事情。近年來(lái),圖數(shù)據(jù)庫(kù)逐漸映入我們眼簾,已成為NoSQL中關(guān)注度***,發(fā)展趨勢(shì)最明顯的數(shù)據(jù)庫(kù)之一。圖數(shù)據(jù)庫(kù),他是誰(shuí)?從哪兒來(lái)?牛在哪兒?怎樣助力研發(fā)工作?且聽(tīng)京東攻城獅怎么說(shuō)。
他是誰(shuí)
圖數(shù)據(jù)庫(kù)并不是存儲(chǔ)圖片的數(shù)據(jù)庫(kù),參照維基百科的定義,他是“以圖數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)語(yǔ)義查詢,并以節(jié)點(diǎn)(node)、邊(edge)、屬性(properties)來(lái)表示并存儲(chǔ)數(shù)據(jù)”。是不是聽(tīng)完感到一臉懵?
用大白話來(lái)講,圖數(shù)據(jù)庫(kù)就是以“圖數(shù)據(jù)結(jié)構(gòu)”來(lái)存儲(chǔ)并查詢數(shù)據(jù)。
如果你連什么是“圖數(shù)據(jù)結(jié)構(gòu)”都不知道,那你的數(shù)據(jù)結(jié)構(gòu)一定是體育老師教的,請(qǐng)回去自行復(fù)習(xí)《數(shù)據(jù)結(jié)構(gòu)與算法》這本經(jīng)典教材。
讓我們?cè)倩氐綀D數(shù)據(jù)上,看看他的一些關(guān)鍵核心概念,圖數(shù)據(jù)庫(kù)源于圖理論,具有如下幾個(gè)特征:
- 節(jié)點(diǎn)(node):通常表示實(shí)體,例如人員、賬戶、事件等,相當(dāng)于RDBMS中的一行記錄。
- 邊(edge):又被稱(chēng)為關(guān)系(relationships),具有名字和方向,從一個(gè)節(jié)點(diǎn)指向另一個(gè)節(jié)點(diǎn),邊是圖數(shù)據(jù)庫(kù)中最顯著的一個(gè)特征,在RDBMS中沒(méi)有對(duì)應(yīng)實(shí)現(xiàn)。
- 屬性(properties):類(lèi)似KV數(shù)據(jù)庫(kù)中的鍵值對(duì),節(jié)點(diǎn)和邊都可以有屬性。
圖數(shù)據(jù)庫(kù)將數(shù)據(jù)以屬性方式存儲(chǔ)在節(jié)點(diǎn)或邊中,以邊來(lái)表示節(jié)點(diǎn)之間的關(guān)系,并用特定查詢語(yǔ)言,進(jìn)行數(shù)據(jù)檢索。
節(jié)點(diǎn)、邊、屬性示意圖
他從哪兒來(lái)
從圖數(shù)據(jù)庫(kù)的原型出現(xiàn)至今,已經(jīng)發(fā)展超過(guò)了半個(gè)世紀(jì)。圖數(shù)據(jù)庫(kù)的前身,可以追溯至上世紀(jì)60年代的Navigational databases,IBM開(kāi)發(fā)了類(lèi)似樹(shù)形結(jié)構(gòu)的數(shù)據(jù)存儲(chǔ)模型。到1969年的網(wǎng)絡(luò)數(shù)據(jù)庫(kù)語(yǔ)言(Network database language),支持圖數(shù)據(jù)結(jié)構(gòu)的展現(xiàn)。
又經(jīng)過(guò)漫長(zhǎng)的30年,其間出現(xiàn)過(guò)可標(biāo)記的圖形數(shù)據(jù)庫(kù)Logic Data Model,直至21世紀(jì)初,人們研發(fā)出具有ACID特性的里程碑式圖數(shù)據(jù)庫(kù)產(chǎn)品,例如:Neo4j、Oracle Spatial and Graph。
到2010年后,可支持水平擴(kuò)展的分布式圖數(shù)據(jù)庫(kù)開(kāi)始興起,例如OrientDB,ArangoDB,MarkLogic。至今,各式各樣的圖數(shù)據(jù)庫(kù)越來(lái)越受到重視,在Google、LinkedIn、Facebook這些***大公司中,已經(jīng)有了廣泛應(yīng)用,迎來(lái)了他***的時(shí)代。
他牛在哪兒
在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)RDBMS中,并沒(méi)有明確的關(guān)系概念,或許叫表格數(shù)據(jù)庫(kù)更貼切,而圖數(shù)據(jù)庫(kù),恰恰是表現(xiàn)實(shí)體之間關(guān)系的利器。
在表現(xiàn)實(shí)體間關(guān)系時(shí),RDBMS會(huì)將另一個(gè)實(shí)體的唯一標(biāo)識(shí),存儲(chǔ)到表中的某一列,來(lái)與其他實(shí)體進(jìn)行關(guān)聯(lián),例如典型的主鍵、外鍵。當(dāng)遇到多對(duì)多關(guān)系時(shí),典型做法會(huì)引入中間表,來(lái)存儲(chǔ)兩個(gè)實(shí)體ID間的關(guān)系,例如我們最熟悉的用戶角色多對(duì)多關(guān)系。在查詢時(shí),需要多個(gè)表進(jìn)行join連接,依次查詢所需信息。
而圖數(shù)據(jù)庫(kù),會(huì)直接存儲(chǔ)兩個(gè)實(shí)體之間的關(guān)系。仍以用戶角色多對(duì)多關(guān)系舉例,用戶實(shí)體會(huì)有一個(gè)指針直接指向?qū)?yīng)的角色記錄,而這個(gè)指針,就是上文所述的“邊(edge或relationships)”。而這樣存儲(chǔ)的好處是,當(dāng)查詢用戶和角色時(shí),只查詢用戶就可順著“關(guān)系”直接取到角色信息,消除了RDBMS表關(guān)聯(lián)所花費(fèi)的性能開(kāi)銷(xiāo)。
用戶角色關(guān)系不同存儲(chǔ)方式示意圖
當(dāng)然,上述圖數(shù)據(jù)庫(kù)和RDBMS的對(duì)比只是舉了一個(gè)非常簡(jiǎn)單的例子。
圖數(shù)據(jù)庫(kù)真正的價(jià)值,是靈活存儲(chǔ)復(fù)雜關(guān)聯(lián)關(guān)系,在深度超過(guò)1層以上關(guān)系中查找遍歷,或是基于復(fù)雜算法的實(shí)時(shí)數(shù)據(jù)關(guān)系挖掘。
在電商推薦引擎中,通常需要整合商品、客戶、供應(yīng)商、物流等關(guān)鍵信息,挖掘用戶可能感興趣的商品。而圖數(shù)據(jù)庫(kù)可以快速記錄這些大量復(fù)雜關(guān)系,實(shí)時(shí)為用戶提供可能所需產(chǎn)品。
在社交網(wǎng)絡(luò)圖譜場(chǎng)景中,可記錄用戶社交關(guān)系,查找直接或間接認(rèn)識(shí)的人,查找交際網(wǎng)中***影響力的人物,這些操作對(duì)于圖數(shù)據(jù)庫(kù)都是易如反掌。
在搜索引擎場(chǎng)景中,利用圖數(shù)據(jù)庫(kù)形成知識(shí)網(wǎng)絡(luò),當(dāng)用戶輸入關(guān)鍵詞檢索時(shí),和關(guān)鍵詞義衍生的其他條目也可展現(xiàn)出來(lái),在大量數(shù)據(jù)下,可輕松維護(hù)這些知識(shí)的相互聯(lián)系。
在路徑規(guī)劃場(chǎng)景中,存儲(chǔ)各站點(diǎn)之間的關(guān)聯(lián),并實(shí)時(shí)計(jì)算出***路徑…
圖數(shù)據(jù)庫(kù)還有其他諸多應(yīng)用場(chǎng)景,當(dāng)遇到大數(shù)據(jù)量的復(fù)雜實(shí)體關(guān)系存儲(chǔ)、查詢及可視化,都可以考慮使用圖數(shù)據(jù)庫(kù)。
當(dāng)然人無(wú)完人,他在解決復(fù)雜關(guān)系存儲(chǔ)及查詢時(shí)有著諸多便利,但當(dāng)記錄大量結(jié)構(gòu)化的數(shù)據(jù)時(shí),就比不上傳統(tǒng)大數(shù)據(jù)存儲(chǔ)工具了,例如ES、HBase等。所以我們建議在實(shí)際生產(chǎn)環(huán)境中,混合使用傳統(tǒng)RDBMS和圖數(shù)據(jù)庫(kù)。
誰(shuí)能站在圖數(shù)據(jù)庫(kù)的C位
圖數(shù)據(jù)庫(kù)有如此多的優(yōu)勢(shì),我們團(tuán)隊(duì)也嘗試在實(shí)際項(xiàng)目中落地,調(diào)研了若干開(kāi)源圖數(shù)據(jù)庫(kù)引擎,下面是簡(jiǎn)單的橫向?qū)Ρ龋└魑粎⒖肌?/p>
通過(guò)以上對(duì)比可以得知:
- Neo4j是最早起家做Graph DBMS,產(chǎn)品非常成熟,但是cluster和replication均需要企業(yè)收費(fèi)版支持,且是GPL V3授權(quán),假如將其用于商業(yè)目的,也需要繳納版權(quán)費(fèi)用。
- JanusGraph是基于Titan圖數(shù)據(jù)庫(kù)延續(xù)下來(lái)的開(kāi)源項(xiàng)目,由Linux Foundation進(jìn)行維護(hù)。它并不是原生的圖數(shù)據(jù)庫(kù)引擎,而是底層使用ES、HBase等傳統(tǒng)結(jié)構(gòu)存儲(chǔ),并在上面封裝圖查詢API。
- ArangoDB和OrientDB均支持Document、Graph及KV存儲(chǔ),分區(qū)擴(kuò)展及備份完善,具有ACID事務(wù)支持。
在技術(shù)選型時(shí),有幾個(gè)特性我們需要著重考慮:
- 授權(quán),是否商業(yè)付費(fèi);
- 底層存儲(chǔ),有一些圖數(shù)據(jù)庫(kù)底層仍使用傳統(tǒng)RDBMS存儲(chǔ),僅在上層封裝圖查詢API,所以在大數(shù)據(jù)量關(guān)系查詢時(shí),也許性能不如人意;
- 分布式支持,為了應(yīng)對(duì)大數(shù)據(jù)量,在生產(chǎn)環(huán)境應(yīng)能夠水平拆分及復(fù)制備份。
結(jié)合以上幾點(diǎn)考慮,我們團(tuán)隊(duì)目前選擇了OrientDB進(jìn)行下一步落地開(kāi)發(fā)。
他怎樣助力逆向處置團(tuán)隊(duì)
目前,逆向處置團(tuán)隊(duì)一些有想法的小伙伴們已經(jīng)搭上圖數(shù)據(jù)庫(kù)這趟列車(chē),推動(dòng)技術(shù)創(chuàng)新在實(shí)際業(yè)務(wù)中的應(yīng)用,進(jìn)行一些特定場(chǎng)景的數(shù)據(jù)開(kāi)發(fā)工作。如存儲(chǔ)客戶關(guān)系資料、咨詢事件、訂單、服務(wù)單等信息。在知識(shí)庫(kù)項(xiàng)目中也有嘗試,用于開(kāi)發(fā)知識(shí)圖譜特性,建立知識(shí)的深層次聯(lián)系。
對(duì)于互聯(lián)網(wǎng)公司來(lái)說(shuō),核心競(jìng)爭(zhēng)力源于技術(shù),同時(shí)對(duì)技術(shù)的不斷創(chuàng)新,或是對(duì)創(chuàng)新技術(shù)的應(yīng)用,亦是推動(dòng)公司和團(tuán)隊(duì)發(fā)展和進(jìn)步的重要手段之一。
上述內(nèi)容為我們團(tuán)隊(duì)在近期研發(fā)中做出的大膽探索并取得的一些心得,在此與大家分享。如果這篇文章也激發(fā)了你對(duì)圖數(shù)據(jù)庫(kù)的興趣,歡迎與我們一同學(xué)習(xí),共同探討。