本文章所處階段為個(gè)人閱讀圖數(shù)據(jù)庫的相關(guān)書籍資料
以下圖片來自圖書 Graph database 第二版 ,O'Reilly圖書,Ian Robinson,Jim Webber & Emil Eifrem著
這里不再贅述圖形數(shù)據(jù)庫blahblah的優(yōu)點(diǎn),還有怎么安裝部署。
在很多文章中,都提到圖數(shù)據(jù)庫的一項(xiàng)用途:處理社會關(guān)系。比如

上圖應(yīng)該算是圖庫最基礎(chǔ)的應(yīng)用,因?yàn)楝F(xiàn)實(shí)生活中的社會關(guān)系并不是對稱的,而如果要用關(guān)系數(shù)據(jù)庫或者常見的kv cloumn nosql來實(shí)現(xiàn),則一個(gè)朋友關(guān)系就需要至少2個(gè)字段,friend of與 friend by。如果要查詢“朋友的朋友”,或“朋友的朋友的朋友”,那么數(shù)據(jù)庫的算法復(fù)雜度則會直線上升,直到任務(wù)由于查詢時(shí)間過長而無法完成。
并且,假設(shè)一對或單向的朋友關(guān)系(意識到自己把別人當(dāng)朋友,別人卻把自己不當(dāng)回事)結(jié)束,那么使用傳統(tǒng)的存儲方式,你還需要?jiǎng)h除上文中類似friend by字段中的內(nèi)容。
現(xiàn)在再上面應(yīng)用的基礎(chǔ)上,增加一點(diǎn)難度,或者說讓例子能更貼近廣大程序員的業(yè)務(wù)場景。

在這張圖中,包含了3張表的內(nèi)容(用戶、訂單與貨物)
同時(shí)也表現(xiàn)出一種“大同”的景象,在圖庫中,數(shù)據(jù)就是一個(gè)一個(gè)node,彼此都是完全平等的。所以我們需要用一個(gè)字段來表示某個(gè)node的角色,比如在neo4j中系統(tǒng)指定了label這個(gè)屬性,而dgraph并沒有指定,需要我們自行設(shè)置,這里需要注意。
另外需要指出這個(gè)most_recent關(guān)系,它和其他關(guān)系相比是不固定的,如果有了新訂單,可以馬上將這個(gè)most recent關(guān)系指向新的node。
而且訂單可能失效,可能被刪除。當(dāng)這個(gè)node被刪除后,相關(guān)的關(guān)系都會自動被清除。這也是圖數(shù)據(jù)庫的一大靈活性,如果你是一個(gè)經(jīng)驗(yàn)不足的程序員,在設(shè)計(jì)業(yè)務(wù)關(guān)系時(shí)是很容易遺漏這些應(yīng)該被清除的數(shù)據(jù),而圖數(shù)據(jù)庫則能自動幫你清理不要的“垃圾”
圖書在這里順便提到,現(xiàn)在的圖庫大多對數(shù)據(jù)節(jié)點(diǎn)node的字段有做一些類型處理,比如存儲地理信息,而不是說一個(gè)node就是簡單的kv鍵值對集合。在dgraph中,你還可以對node的某key執(zhí)行不同的索引策略。比如某key的類型是string,你可以對其應(yīng)用hash索引,也可以進(jìn)行全量索引。
但拋開這些細(xì)枝末節(jié)的內(nèi)容,我們需要把握一點(diǎn),關(guān)系是圖庫中的一等公民,而且你應(yīng)更抽象地理解這個(gè)“關(guān)系”,這里的關(guān)系不僅僅是node與node之間,node本身的各個(gè)自定義的kv也可以認(rèn)為是“關(guān)系”。
Chapter 3 Data Modeling with Graphs
1,相比傳統(tǒng)數(shù)據(jù)庫,圖庫的modeling更“白板友好”
2,一個(gè)node可以有多個(gè)label
3,注意設(shè)置node與node之間的關(guān)系方向,沒有變幻方向的關(guān)系,而應(yīng)明確的指出是從node A 指向node B
4,不光node可以具有屬性(properties,可以理解為就是node存儲的kv set),關(guān)系也是可以有屬性的,這樣就給實(shí)際應(yīng)用提供更多meta 數(shù)據(jù)
接下來圖書介紹的是如何利用上面這些簡單的原則來創(chuàng)建圖庫model,需要使用sql語言,圖書中介紹的是cypher,而dgraph使用的是GraphQL
先放一些書中介紹cypher時(shí)的圖片



cross-domain models

這張圖片是關(guān)于莎士比亞文學(xué)相關(guān)的內(nèi)容,通過 圖中關(guān)系線的類型,可以看到這跨越了3個(gè) domain。
所以這也是關(guān)系為什么重要的原因,關(guān)系可以幫助我們建立一個(gè)domian,也可以幫助我們將不同的domain之間的數(shù)據(jù)進(jìn)行關(guān)聯(lián)。
職業(yè)生涯

演員的表演記錄

發(fā)送郵件并抄送

可以注意到,圖中的關(guān)系,既可是一種動作,也可以是一個(gè)屬性
而數(shù)據(jù)節(jié)點(diǎn)node,既可以是動作的主體,也可以是動作的客體
影評家寫的影評

某電視節(jié)目的timeline tree(記錄一系列事件)

劇集之間的關(guān)系

再次強(qiáng)調(diào)關(guān)系需要方向
不同的關(guān)系應(yīng)對不同的需求

這個(gè)人通過ADDRESS關(guān)系擁有2個(gè)地址,這兩個(gè)地址分別應(yīng)用于兩種不同的場景