本文章所處階段為個人閱讀圖數(shù)據(jù)庫的相關書籍資料
以下圖片來自圖書 Graph database 第二版 ,O'Reilly圖書另患,Ian Robinson,Jim Webber & Emil Eifrem著
這里不再贅述圖形數(shù)據(jù)庫blahblah的優(yōu)點,還有怎么安裝部署。
在很多文章中窿吩,都提到圖數(shù)據(jù)庫的一項用途:處理社會關系蜻拨。比如
上圖應該算是圖庫最基礎的應用奠货,因為現(xiàn)實生活中的社會關系并不是對稱的眨攘,而如果要用關系數(shù)據(jù)庫或者常見的kv cloumn nosql來實現(xiàn)迹冤,則一個朋友關系就需要至少2個字段匿垄,friend of與 friend by移宅。如果要查詢“朋友的朋友”归粉,或“朋友的朋友的朋友”,那么數(shù)據(jù)庫的算法復雜度則會直線上升漏峰,直到任務由于查詢時間過長而無法完成糠悼。
并且,假設一對或單向的朋友關系(意識到自己把別人當朋友浅乔,別人卻把自己不當回事)結束倔喂,那么使用傳統(tǒng)的存儲方式,你還需要刪除上文中類似friend by字段中的內容靖苇。
現(xiàn)在再上面應用的基礎上席噩,增加一點難度,或者說讓例子能更貼近廣大程序員的業(yè)務場景贤壁。
在這張圖中悼枢,包含了3張表的內容(用戶、訂單與貨物)
同時也表現(xiàn)出一種“大同”的景象脾拆,在圖庫中馒索,數(shù)據(jù)就是一個一個node,彼此都是完全平等的假丧。所以我們需要用一個字段來表示某個node的角色双揪,比如在neo4j中系統(tǒng)指定了label這個屬性,而dgraph并沒有指定包帚,需要我們自行設置渔期,這里需要注意。
另外需要指出這個most_recent關系渴邦,它和其他關系相比是不固定的疯趟,如果有了新訂單,可以馬上將這個most recent關系指向新的node谋梭。
而且訂單可能失效信峻,可能被刪除。當這個node被刪除后瓮床,相關的關系都會自動被清除盹舞。這也是圖數(shù)據(jù)庫的一大靈活性,如果你是一個經(jīng)驗不足的程序員隘庄,在設計業(yè)務關系時是很容易遺漏這些應該被清除的數(shù)據(jù)踢步,而圖數(shù)據(jù)庫則能自動幫你清理不要的“垃圾”
圖書在這里順便提到,現(xiàn)在的圖庫大多對數(shù)據(jù)節(jié)點node的字段有做一些類型處理丑掺,比如存儲地理信息获印,而不是說一個node就是簡單的kv鍵值對集合。在dgraph中街州,你還可以對node的某key執(zhí)行不同的索引策略兼丰。比如某key的類型是string玻孟,你可以對其應用hash索引,也可以進行全量索引鳍征。
但拋開這些細枝末節(jié)的內容黍翎,我們需要把握一點,關系是圖庫中的一等公民蟆技,而且你應更抽象地理解這個“關系”玩敏,這里的關系不僅僅是node與node之間,node本身的各個自定義的kv也可以認為是“關系”质礼。
Chapter 3 Data Modeling with Graphs
1旺聚,相比傳統(tǒng)數(shù)據(jù)庫,圖庫的modeling更“白板友好”
2眶蕉,一個node可以有多個label
3砰粹,注意設置node與node之間的關系方向,沒有變幻方向的關系造挽,而應明確的指出是從node A 指向node B
4碱璃,不光node可以具有屬性(properties,可以理解為就是node存儲的kv set)饭入,關系也是可以有屬性的嵌器,這樣就給實際應用提供更多meta 數(shù)據(jù)
接下來圖書介紹的是如何利用上面這些簡單的原則來創(chuàng)建圖庫model,需要使用sql語言谐丢,圖書中介紹的是cypher爽航,而dgraph使用的是GraphQL
先放一些書中介紹cypher時的圖片
cross-domain models
這張圖片是關于莎士比亞文學相關的內容,通過 圖中關系線的類型乾忱,可以看到這跨越了3個 domain讥珍。
所以這也是關系為什么重要的原因,關系可以幫助我們建立一個domian窄瘟,也可以幫助我們將不同的domain之間的數(shù)據(jù)進行關聯(lián)衷佃。
職業(yè)生涯
演員的表演記錄
發(fā)送郵件并抄送
可以注意到,圖中的關系蹄葱,既可是一種動作氏义,也可以是一個屬性
而數(shù)據(jù)節(jié)點node,既可以是動作的主體图云,也可以是動作的客體
影評家寫的影評
某電視節(jié)目的timeline tree(記錄一系列事件)
劇集之間的關系
再次強調關系需要方向
不同的關系應對不同的需求
這個人通過ADDRESS關系擁有2個地址惯悠,這兩個地址分別應用于兩種不同的場景