陳肖勇 蔡永健 顧丹鵬 何栓康 主令恒
摘? 要: 為了提升工程建設及運維過程的工作效率和質(zhì)量,建設覆蓋工程全過程的全生命周期工程數(shù)據(jù)中心具有重大意義。工程數(shù)據(jù)中心數(shù)據(jù)建設的特點在于數(shù)據(jù)之間關聯(lián)的多樣化和復雜化,為適應這樣的數(shù)據(jù)存儲需求,采用區(qū)別于關系型數(shù)據(jù)庫的圖數(shù)據(jù)庫構建工程主數(shù)據(jù)的存儲方案,以維護其復雜多變的關聯(lián)關系,并為基于圖結(jié)構數(shù)據(jù)進行數(shù)據(jù)分析應用提供了可能。
關鍵詞: 圖數(shù)據(jù)庫; 數(shù)據(jù)存儲; 數(shù)據(jù)中心; 圖結(jié)構數(shù)據(jù)
中圖分類號:TP392? ? ? ? ? 文獻標識碼:A? ? ?文章編號:1006-8228(2021)09-42-04
Abstract: In order to improve the work efficiency and quality of project construction and maintenance process, it is of great significance to establish a full life cycle engineering data center covering the whole process of the project. The characteristics of data construction of engineering data center are the diversification and complexity of data association. In order to adapt to such data storage needs, the graph database, which is different from the relational database, is used to construct the storage of main engineering data in order to maintain the complex and changeable association relationship, and provide the possibility for graph structured data based data analysis and application.
Key words: graph database; data storage; data center; graph structured data
0 引言
工程數(shù)據(jù)中心的數(shù)據(jù)建設特點在于數(shù)據(jù)之間關聯(lián)多樣化和復雜化,系統(tǒng)設計之初需要考慮到為建立主數(shù)據(jù)管理體系和數(shù)據(jù)標準體系提供靈活可配置的數(shù)據(jù)模型,對于其采用的主數(shù)據(jù)庫選型,傳統(tǒng)的關系型數(shù)據(jù)庫受到了一定的限制和約束。
近年來,有別于傳統(tǒng)關系型數(shù)據(jù)庫,出現(xiàn)了一系列新型的No-SQL數(shù)據(jù)庫類型(Not Only SQL,非關系型數(shù)據(jù)庫),其中圖數(shù)據(jù)庫(Graph Database)是一種以圖結(jié)構進行語義查詢,并使用頂點、邊與屬性來表示和存儲數(shù)據(jù)的數(shù)據(jù)庫[1]。圖數(shù)據(jù)庫的關鍵概念是邊,通過邊將頂點連接在一起,從而進行快速的圖檢索操作。圖數(shù)據(jù)庫的關注點是“關聯(lián)關系”形成的圖,其目標是對現(xiàn)實世界中的實體與實體之間的關聯(lián)關系進行存儲與分析:將實體抽象為頂點、將實體之間的關聯(lián)關系抽象為邊。通過頂點和邊形成的圖譜結(jié)構,直觀自然的表達萬物關聯(lián)的世界,同時解決了復雜關聯(lián)關系深層檢索的性能問題。
考慮到工程數(shù)據(jù)中心的主數(shù)據(jù)特點,本文探討在工程數(shù)據(jù)中心的設計中應用圖數(shù)據(jù)庫存儲和管理工程主數(shù)據(jù),以維護其復雜多變的關聯(lián)關系,實踐中本文案例選取了具備多種NoSQL特點的原生多模型圖數(shù)據(jù)庫ArangoDB,構建了工程數(shù)據(jù)中心的主數(shù)據(jù)服務。
1 圖數(shù)據(jù)庫簡介
現(xiàn)實世界中的一切事物都處在聯(lián)系之中,如人際關系、電腦網(wǎng)絡、地理數(shù)據(jù)、分子結(jié)構模型等,無一不處在紛繁復雜的聯(lián)系之中。這種聯(lián)系,形成了一種互相關聯(lián)的數(shù)據(jù),聯(lián)系才是數(shù)據(jù)的本質(zhì)所在。傳統(tǒng)的關系型數(shù)據(jù)庫并不能很好地表現(xiàn)數(shù)據(jù)的聯(lián)系,而一些NoSQL數(shù)據(jù)庫又不能表現(xiàn)數(shù)據(jù)之間的聯(lián)系。同樣是NoSQL的圖數(shù)據(jù)庫,是以圖的結(jié)構形式來存儲數(shù)據(jù)的,它所存儲的就是聯(lián)系的數(shù)據(jù),是關聯(lián)數(shù)據(jù)本身[2]。
關聯(lián)數(shù)據(jù)中的聯(lián)系本來就很復雜,若要在關系型數(shù)據(jù)庫中使用結(jié)構化形式來表現(xiàn)這種聯(lián)系,則一般不能直接表示,處理起來既煩瑣又費事,并且隨著數(shù)據(jù)的不斷增長,其訪問性能將日趨下降。無數(shù)的開發(fā)人員和數(shù)據(jù)庫管理人員都或多或少地使用過關系型數(shù)據(jù)庫,在其應用的規(guī)?;M展過程中,對于數(shù)據(jù)庫的性能優(yōu)化往往捉襟見肘、陷入窘境。圖數(shù)據(jù)庫沒有模式結(jié)構的定義,也不需要這些定義,它使用非結(jié)構化的方式來存儲關聯(lián)數(shù)據(jù),所以能夠直接表現(xiàn)數(shù)據(jù)的關聯(lián)特性。
2 圖數(shù)據(jù)庫優(yōu)勢
2.1 數(shù)據(jù)處理速度
圖數(shù)據(jù)庫可以很高效地插入大量數(shù)據(jù)。圖數(shù)據(jù)庫面向的應用領域數(shù)據(jù)量可能都比較大,比如知識圖譜、社交關系、風控關系等,總數(shù)據(jù)量級別一般在億或十億以上,有的甚至達到百億級。關系型數(shù)據(jù)庫如mysql不做分庫分表的情況下插入百萬數(shù)據(jù)基本就很慢,圖數(shù)據(jù)則能夠勝任億級以上的數(shù)據(jù),比如Neo4j、ArangoDB等圖數(shù)據(jù)庫,在持續(xù)插入億級的數(shù)據(jù)基本還能保持在一個較高的速度[3]。
圖數(shù)據(jù)庫可以很高效地查詢關聯(lián)數(shù)據(jù)。傳統(tǒng)關系型數(shù)據(jù)庫不擅長做關聯(lián)查詢,特別是多層關聯(lián)。因為關系型數(shù)據(jù)庫一般需要做表連接,表連接是一個很昂貴的操作,涉及到大量的IO操作和內(nèi)存消耗。圖數(shù)據(jù)庫對關聯(lián)查詢一般都進行針對性的優(yōu)化,比如存儲模型上、數(shù)據(jù)結(jié)構、查詢算法等,防止局部數(shù)據(jù)的查詢引發(fā)全部數(shù)據(jù)的讀取[4]。
2.2 擴展性
圖數(shù)據(jù)庫使用圖的方式來表達現(xiàn)實世界的關系很直接、自然,易于建模。比如工程中某位工程師繪制了一張圖紙,就可以建立一條邊連接這個工程師和這張圖紙,這條邊就叫做“繪制”邊,同時這位工程師還是可以有很多其他的邊,比如所屬部門、檢查設備邊等,同樣這張圖紙也有其他邊,這樣很自然地就構建了關系網(wǎng)。
此外,圖數(shù)據(jù)庫提供了針對圖檢索的查詢語言和專業(yè)的分析算法工具。圖數(shù)據(jù)庫語言比如GRE面臨、Cypher等,算法比如ShortestPath、PageRank,PersonalRank、Louvain等,這些語言、算法工具為圖數(shù)據(jù)庫的擴展提供了很大的便利。
3 數(shù)據(jù)處理技術方案
3.1 數(shù)據(jù)庫選擇與設計
ArangoDB是一個原生多模型數(shù)據(jù)庫,兼有key/value鍵/值對、graph圖和document文檔數(shù)據(jù)模型,提供了涵概三種數(shù)據(jù)模型的統(tǒng)一的數(shù)據(jù)庫查詢語言,并允許在單個查詢中混合使用三種模型?;谄浔镜丶啥嗄P吞匦裕С执罱ǜ咝阅艹绦?,并且這三種數(shù)據(jù)模型均支持水平擴展。
本文的實踐中,選擇了ArangoDB數(shù)據(jù)庫作為工程數(shù)據(jù)中心主數(shù)據(jù)服務的存儲解決方案,主要理由是其多模型特征在利用其圖存儲特性之外,還能利用鍵/值對模型與工程數(shù)據(jù)中心包括元數(shù)據(jù)服務在內(nèi)的其他服務模塊進行跨數(shù)據(jù)庫數(shù)據(jù)映射匹配。
3.1.1 容器設計
不同于關系型數(shù)據(jù)庫,圖數(shù)據(jù)庫沒有表結(jié)構,取而代之的是容器的概念。容器與表相似,可以定義屬性字段和標簽。容器分普通容器和邊容器,普通容器用于存儲圖的節(jié)點,邊容器則存儲圖的邊。
工程數(shù)據(jù)中心的應用場景將工程數(shù)據(jù)對象用普通容器存儲為節(jié)點,并定義為主數(shù)據(jù)容器。
主數(shù)據(jù)容器包含固定字段和動態(tài)字段,固定字段用于標識數(shù)據(jù)對象的類型和基本信息,動態(tài)字段是一個JSON形式保存鍵值對的字段,用于保存基于實際應用場景定義的數(shù)據(jù)對象屬性。
3.1.2 動態(tài)字段設計
為適應可動態(tài)配置的屬性字段結(jié)構,把屬性字段定義在單獨的表進行維護,并約束屬性字段的名稱、類型、規(guī)則和取值范圍,通過唯一的屬性字段ID進行匹配。具體匹配方式為,在用于存儲動態(tài)字段的JSON子串中,用屬性字段ID作為鍵值對的鍵,對應的屬性值作為鍵值對的值。當數(shù)據(jù)對象被讀取時,對JSON字串中每個鍵值對,利用屬性字段ID匹配查詢出每個屬性字段的名稱、類型等信息,配上鍵值對的值,即為完整的每個屬性。
該設計還可以將數(shù)據(jù)對象的關聯(lián)關系抽象為一種屬性字段,并通過屬性字段ID和圖數(shù)據(jù)存儲結(jié)構的邊進行標簽關聯(lián),數(shù)據(jù)對象與另一個數(shù)據(jù)對象的關聯(lián)描述作為一個引用屬性在數(shù)據(jù)對象的內(nèi)容中體現(xiàn)。
3.2 事務處理
在數(shù)據(jù)處理的過程中,不可避免的需要面對事務機制,在存在多種關聯(lián)關系的圖結(jié)構數(shù)據(jù)中,數(shù)據(jù)聯(lián)動修改時的事務機制實現(xiàn)也是圖數(shù)據(jù)庫應用實踐中需要面對的問題。
Spring Data ArangoDB對數(shù)據(jù)庫事務機制的支持并不完善,實踐中開發(fā)團隊對此進行了額外的處理,利用ArangoDB Java Driver驅(qū)動模塊提供的事務相關接口完成了事務封裝的實現(xiàn)。事務實現(xiàn)流程見圖1:通過構建自定義的事務處理模版,將數(shù)據(jù)處理相關的核心流程進行封裝,并將事務實現(xiàn)的相關流程(獲取事務ID、構建選項參數(shù)、調(diào)用)操作嵌入模版,利用驅(qū)動提供的ArangoAspect完成事務機制的實現(xiàn)。
4 圖數(shù)據(jù)庫應用實踐
4.1 工程數(shù)據(jù)中心說明
工程數(shù)據(jù)中心項目目標是為建立各工程行業(yè)BIM模型及工程數(shù)據(jù)標準,梳理設計、建管、運維三大平臺的主數(shù)據(jù)及關系,實現(xiàn)工程全過程數(shù)據(jù)貫通,并在此基礎上不斷圍繞工程進行數(shù)據(jù)的集成、復用、沉淀,從而創(chuàng)造數(shù)據(jù)價值和業(yè)務價值[5]。
工程主數(shù)據(jù)指具有高業(yè)務價值的、可以在工程內(nèi)跨越各個階段、各個業(yè)務部門被重復使用的數(shù)據(jù),是具有單一、準確、權威性質(zhì)的數(shù)據(jù)。工程主數(shù)據(jù)包含工程元數(shù)據(jù)、工程引用數(shù)據(jù)、工程結(jié)構數(shù)據(jù)、業(yè)務結(jié)構數(shù)據(jù)。工程元數(shù)據(jù),指工程數(shù)據(jù)中心最基礎的數(shù)據(jù),是關于工程數(shù)據(jù)的數(shù)據(jù),或者是用于描述其他工程數(shù)據(jù)的結(jié)構數(shù)據(jù)。工程引用數(shù)據(jù),定義了工程元數(shù)據(jù)的可能取值范圍,也可稱為屬性值域。工程結(jié)構數(shù)據(jù),描述了工程數(shù)據(jù)之間的關系,反映了現(xiàn)實世界的實體間的關系或流程。業(yè)務結(jié)構數(shù)據(jù),數(shù)據(jù)描述了各工程業(yè)務的直接參與者,業(yè)務結(jié)構數(shù)據(jù)描述的數(shù)據(jù)實體通常由一個唯一的數(shù)據(jù)編碼以及大量的屬性信息構成。根據(jù)工程數(shù)據(jù)中心業(yè)務應用需求,數(shù)據(jù)層負責數(shù)據(jù)存儲,包括工程元數(shù)據(jù)、工程引用數(shù)據(jù)、工程結(jié)構數(shù)據(jù)、業(yè)務結(jié)構數(shù)據(jù)、模型文件、模型屬性、空間位置及文檔文件等,這些數(shù)據(jù)包含結(jié)構化與非結(jié)構化數(shù)據(jù),為了存儲這些數(shù)據(jù),需要采用多種存儲技術,構建異構數(shù)據(jù)系統(tǒng),具體包括:分布式緩存(Redis)這類內(nèi)存數(shù)據(jù)庫,用于提升服務響應性能;對象存儲(Minio,ObjectStorage Service)用于存儲非結(jié)構化數(shù)據(jù),如模型、文檔;關系型數(shù)據(jù)庫(MySQL)用于存儲主數(shù)據(jù)及系統(tǒng)相關數(shù)據(jù);圖數(shù)據(jù)庫(ArangoDB)用于存儲工程對象數(shù)據(jù),組成工程對象關系網(wǎng)絡;空間數(shù)據(jù)庫(PostgreSQL+PostGIS)用于存儲BIM的空間幾何數(shù)據(jù)。
4.2 圖數(shù)據(jù)庫的應用
圖數(shù)據(jù)庫在工程數(shù)據(jù)中心用于存儲工程對象數(shù)據(jù),包括數(shù)據(jù)對象和對象關聯(lián)關系。具體數(shù)據(jù)對象的創(chuàng)建思路分兩步。
第一步,建立數(shù)據(jù)標準,數(shù)據(jù)標準描述了工程對象數(shù)據(jù)的關系結(jié)構和屬性字段定義。將數(shù)據(jù)標準結(jié)構化存儲,其結(jié)果稱為工程元數(shù)據(jù),這些工程元數(shù)據(jù)并不以圖結(jié)構存儲而是更適合以SQL數(shù)據(jù)庫存儲,僅用于驅(qū)動工程對象數(shù)據(jù)的存取操作過程。
第二步,完成工程元數(shù)據(jù)創(chuàng)建后,可以在圖數(shù)據(jù)庫具體創(chuàng)建工程數(shù)據(jù)對象,按上文3.1.2節(jié)所述的動態(tài)字段設計邏輯,工程數(shù)據(jù)對象基于第一步的工程元數(shù)據(jù)創(chuàng)建數(shù)據(jù)對象實體,包括其動態(tài)屬性字段,即為圖結(jié)構的節(jié)點,和創(chuàng)建數(shù)據(jù)對象之間的關聯(lián)關系,即為圖結(jié)構的邊。
在實踐過程中,第一步過程擴展為工程數(shù)據(jù)中心的工程元數(shù)據(jù)管理模塊,用于維護數(shù)據(jù)標準的創(chuàng)建、迭代和應用管理;第二步過程則被項目數(shù)據(jù)管理模塊涵蓋,在底層實現(xiàn)時,通過將工程元數(shù)據(jù)的內(nèi)容抽象為“數(shù)據(jù)模版”,并指導在圖數(shù)據(jù)庫上創(chuàng)建和更新工程數(shù)據(jù)對象,包括控制工程數(shù)據(jù)對象的數(shù)據(jù)域,操作其屬性字段的類型、值域和校驗規(guī)則,也包括以將數(shù)據(jù)對象關聯(lián)關系抽象為主對象的一個引用屬性的方式,操作數(shù)據(jù)對象關聯(lián)所對應的邊。
在數(shù)據(jù)對象以圖結(jié)構完成存儲之后,工程數(shù)據(jù)中心可以基于圖數(shù)據(jù)庫提供的一系列圖算法函數(shù),對工程數(shù)據(jù)對象的關系網(wǎng)進行一系列的分析、遍歷和統(tǒng)計。
5 結(jié)束語
本文介紹了圖數(shù)據(jù)庫作為No-SQL數(shù)據(jù)庫的一種,其與關系型數(shù)據(jù)庫對比的優(yōu)點。為滿足工程數(shù)據(jù)中心的主數(shù)據(jù)存儲應用場景的需求,本文重點闡述了采用圖數(shù)據(jù)庫ArangoDB構建工程數(shù)據(jù)中心主數(shù)據(jù)服務存儲方案的設計思路和應用實踐過程?;谝陨险撌隹梢?,采用圖數(shù)據(jù)庫作為工程數(shù)據(jù)中心的主數(shù)據(jù)服務存儲方案規(guī)避了采用關系型數(shù)據(jù)庫會遭遇的一系列難題,有效降低了開發(fā)和系統(tǒng)后續(xù)升級維護的復雜度,并且基于圖結(jié)構數(shù)據(jù)為未來基于圖的數(shù)據(jù)分析應用提供了可能。
參考文獻(References):
[1] 王慧孜,范煒.圖數(shù)據(jù)庫在標簽系統(tǒng)中的應用研究[J].數(shù)字圖書館論壇,2015.4.
[2] 楊振萬,為清.圖數(shù)據(jù)庫的研究和應用電腦編程技巧與維護,2020.12.
[3] 劉玉程,李港.NoSQL數(shù)據(jù)庫與關系型數(shù)據(jù)庫對比[J].中國新通信,2018.7.
[4] 杜麗娟.關系型數(shù)據(jù)庫與NoSQL數(shù)據(jù)庫的性能對比[J].智能計算機與應用,2017.3.
[5] 王金鋒,張業(yè)星,陳健等.水電全生命周期工程數(shù)據(jù)中心及其關鍵技術[J].水力發(fā)電,2014.40(8):21-24