- Neo4j權威指南 (圖數據庫技術叢書)
- 張幟
- 1391字
- 2020-11-28 15:15:46
1.3 圖數據庫與關系數據庫的對比
在數據庫領域的應用中并不是任何用例都適用于關系數據模型,但在過去由于缺乏可行的替代方案和各大關系數據庫廠商的大力發展下,其他類型數據庫難以成為主流;但隨著圖數據庫的產生,這種情況發生了改變。
1.3.1 關系數據庫的弊端
關系數據庫自上世紀80年代以來一直是數據庫領域發展的動力,并持續到今天。它們將高度結構化的數據存儲在具有某些類型信息的二維表格中,并且由于其組織數據的嚴格特性,開發人員和應用程序必須嚴格地按照關系數據庫的相關約定來構建其應用程序中使用的數據。
在關系數據庫中,通過外鍵約束來實現兩表或多個表之間某些記錄相互引用的關系。外鍵約束是關系數據庫中實現表之間相互引用的必不可少的策略。關系數據庫通過外鍵在主表中尋找匹配的主鍵記錄來進行搜索、匹配計算操作,因為這種操作是“計算密集型”的,也是“內存密集型”的,并且操作次數將是表中記錄的指數級別,所以它需要消耗大量的系統資源。如果您使用多對多關系,則必須要再添加一個中間表,它用來保存兩個參與表的外鍵對應關系,這進一步增加了連接操作的成本。
1.3.2 圖數據模型的優勢
在圖數據庫中,關系是最重要的元素。通過關系我們能夠將節點相互關聯起來構建與我們的問題領域密切相關的復雜模型。
圖數據庫模型中的每個節點都直接包含一個關系列表,關系列表中存放此節點與其他節點的關系記錄。這些關系記錄按類型和方向組織起來,并且可以保存附加屬性。無論何時運行類似關系數據庫的連接(Join)操作時,圖數據庫都將使用此列表來直接訪問連接的節點,無須進行記錄的搜索、匹配計算操作。
將關系預先保存到關系列表中的這種能力使Neo4j能夠提供比關系數據庫高幾個數量級的性能,特別是對于復雜連接的查詢,Neo4j能夠實現毫秒級的響應。
使用圖數據庫來組織數據所得到的數據模型比使用傳統關系或其他NoSQL數據庫的數據模型更簡單,同時更具有表現力。
圖數據庫支持非常靈活和細粒度的數據模型,可以用簡單直觀的方式對數據應用進行建模和管理,可以更方便地將數據單元小型化、規范化;同時還能實現豐富的關系連接,這樣在對數據查詢時可以用任何可想象到的方式進行查詢操作。可見,與關系數據庫相比,圖數據庫可支持更多類型的用例,如圖1-6所示。

圖1-6 圖數據庫中關系的豐富表現
眾所周知,數據庫為確保數據的正確性,創造性地引入了事務概念,即ACID特性。像Neo4j這樣的圖數據庫完全支持ACID事務,包括預寫式日志(write-ahead logs)的恢復和異常終止后的恢復,所以永遠不會丟失已經被加入數據庫的數據。
下面是一個用關系數據模型和圖數據模型建模的實例,通過兩個E-R圖(Entity Relationship Diagram,實體-聯系圖)可以看出使用圖數據庫更加簡潔、明確地描述數據之間的關系。
如圖1-7所示,要使用關系數據庫創建一個項目部門組織的存儲結構,必須為項目、部門、組織、人員單獨創建表結構,各個表結構之間通過外鍵約束相互關聯,對于多對多的復雜關系還必須創建“中間表”(如Department_Members表),通過E-R圖可以看出,各個表結構中創建了大量的主鍵、外鍵列,并創建了中間表來維護復雜關系,這消耗了大量的系統資源。

圖1-7 關系數據模型
如果采用圖數據庫創建一個項目部門組織的存儲結構則容易得多,只需要為項目、部門、組織、人員創建節點,并且節點不需要主鍵、外鍵,也不需要中間表,只保留必要的屬性即可。各個節點直接通過關系指向來表達節點之間的復雜關系。使用圖數據庫可以更加簡潔、明確地描述數據間的復雜關系,如圖1-8所示。

圖1-8 圖數據模型
- 玩轉Scratch少兒趣味編程
- Cocos2D-X權威指南(第2版)
- Java系統分析與架構設計
- JavaScript語言精髓與編程實踐(第3版)
- Learning Flask Framework
- Rust編程從入門到實戰
- Java 9 Programming Blueprints
- Easy Web Development with WaveMaker
- C++面向對象程序設計習題解答與上機指導(第三版)
- GameMaker Essentials
- 寫給大家看的Midjourney設計書
- JavaScript從入門到精通(視頻實戰版)
- Java程序設計教程
- HTML并不簡單:Web前端開發精進秘籍
- Go語言高級編程(第2版)