陳豪
(中交第二公路勘察設(shè)計(jì)研究院有限公司,湖北 武漢 430052)
鐵路、公路、城市道路及軌道交通都屬于條形帶狀工程,與路基設(shè)計(jì)有關(guān)的輸入和輸出數(shù)據(jù)量大,在長(zhǎng)大線的情況下,數(shù)據(jù)量更是會(huì)迅速增大[1]。這些繁雜無序的數(shù)據(jù)如何準(zhǔn)確高效地處理,一直是路基設(shè)計(jì)人員面臨的一個(gè)挑戰(zhàn)。
針對(duì)現(xiàn)有技術(shù)中沒有一套靈活、簡(jiǎn)單、高效、準(zhǔn)確、容易查錯(cuò)的路基橫斷面數(shù)據(jù)處理方法的情況[2],本文作者結(jié)合路基設(shè)計(jì)軟件開發(fā)技術(shù)調(diào)研,嘗試提出一種基于非關(guān)系數(shù)據(jù)庫(kù)(NoSQL)的路基數(shù)據(jù)處理方法,并以MongoDB舉例說明供同行探討。
目前,國(guó)內(nèi)外路基設(shè)計(jì)軟件無論是二維設(shè)計(jì)軟件還是三維設(shè)計(jì)軟件,都是基于橫斷面設(shè)計(jì)的模式做的開發(fā)[3-4]。路基橫斷面設(shè)計(jì),需要處理大量的橫斷面地面線、地層線以及試驗(yàn)數(shù)據(jù)等?,F(xiàn)有的國(guó)內(nèi)外路基設(shè)計(jì)軟件,對(duì)路基橫斷面有關(guān)數(shù)據(jù)的處理方法主要有以下兩種:
一是將數(shù)據(jù)保存在不同的自定義平面文件或二進(jìn)制文件中,然后根據(jù)不同的設(shè)計(jì)場(chǎng)景,自己編寫各種操控?cái)?shù)據(jù)增刪查改的程序功能。
二是將數(shù)據(jù)保存在統(tǒng)一的項(xiàng)目關(guān)系數(shù)據(jù)庫(kù)中,如Access數(shù)據(jù)庫(kù)、SQLite數(shù)據(jù)庫(kù)等,然后根據(jù)不同的設(shè)計(jì)場(chǎng)景,用標(biāo)準(zhǔn)的結(jié)構(gòu)化查詢語言SQL或者借助一些對(duì)象關(guān)系映射ORM中間件編寫各種操控?cái)?shù)據(jù)增刪查改的功能。
目前,國(guó)內(nèi)幾個(gè)大型鐵路設(shè)計(jì)院和公路設(shè)計(jì)院開發(fā)的路基設(shè)計(jì)軟件,在處理路基橫斷面地面線數(shù)據(jù)方面,采用的方法基本相同,即分左、右側(cè)對(duì)每個(gè)橫斷面實(shí)測(cè)記錄地面點(diǎn)到線路中心點(diǎn)的平距和高差[5-6],不同的軟件數(shù)據(jù)存儲(chǔ)格式和形式不同,有些存儲(chǔ)在平面文件中,有些存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中。在處理路基橫斷面地層線數(shù)據(jù)方面,由于行業(yè)習(xí)慣的差異,鐵路設(shè)計(jì)院比公路設(shè)計(jì)院在這方面的研究較多一些,幾家鐵路設(shè)計(jì)院的地層線數(shù)據(jù)處理方法差異較大,但是均定義了內(nèi)部的橫斷面地質(zhì)填圖數(shù)據(jù)互提接口格式。
下面基于NoSQL數(shù)據(jù)庫(kù)MongoDB,介紹一種不同于傳統(tǒng)平面文件及關(guān)系數(shù)據(jù)庫(kù)的橫斷面地面線、地層線數(shù)據(jù)處理方法。
MongoDB是用C++開發(fā)的一個(gè)高效、開源、無模式的文檔型數(shù)據(jù)庫(kù),其底層采用高效的BSON作為數(shù)據(jù)存儲(chǔ)和傳輸格式,支持嵌套對(duì)象和數(shù)組,易于非結(jié)構(gòu)化海量數(shù)據(jù)[7]的存儲(chǔ)。
如圖1所示的路基橫斷面,橫斷面實(shí)測(cè)地面線的數(shù)據(jù)組織,可以用表1所示的JSON文件來記錄地面點(diǎn)到線路中心點(diǎn)的平距和高差。每一個(gè)橫斷面地面線數(shù)據(jù),都可以按表1的形式組織為一個(gè)JSON文檔對(duì)象存入MongoDB數(shù)據(jù)庫(kù)。
表1 橫斷面地面線邏輯數(shù)據(jù)模型
圖1 路基橫斷面圖
該JSON文檔有“里程”、“左側(cè)”、“中樁”、“右側(cè)”共4個(gè)頂層鍵,“里程”、“左側(cè)”、“右側(cè)”3個(gè)鍵的值都是一個(gè)數(shù)組?!白髠?cè)”和“右側(cè)”鍵值數(shù)組中存儲(chǔ)的是記錄若干個(gè)地面點(diǎn)參數(shù)的JSON文檔對(duì)象,這些JSON文檔對(duì)象被稱為嵌套文檔數(shù)組,“中樁”鍵的值是一個(gè)嵌套JSON文檔對(duì)象。
橫斷面地層線的數(shù)據(jù)組織,以一個(gè)包含有一般水平地層、透鏡體地層和尖滅地層的最特殊橫斷面為例(如圖1所示),用表2所示的JSON文件來記錄地層線。每一個(gè)橫斷面地層線數(shù)據(jù),都可以按表2的形式組織為一個(gè)JSON文檔對(duì)象存入MongoDB數(shù)據(jù)庫(kù)。
表2 橫斷面地層線邏輯數(shù)據(jù)模型
此處的示例,僅列舉了一些最基礎(chǔ)的數(shù)據(jù),格式化編入了JSON文檔,工程師可以根據(jù)不同的應(yīng)用場(chǎng)景添加更多自定義的鍵值數(shù)據(jù)靈活擴(kuò)展,例如可以在“地層”的鍵值下方添加該地層的黏聚力c、內(nèi)摩擦角φ等巖土物理力學(xué)指標(biāo)。
上述橫斷面地面線和地層線JSON文件所記錄的數(shù)據(jù)格式,是一種帶有嵌套的半結(jié)構(gòu)化數(shù)據(jù),這種數(shù)據(jù)格式具有“自我描述性”易于人類閱讀理解,層級(jí)結(jié)構(gòu)可以兼容不規(guī)則數(shù)據(jù),數(shù)據(jù)易于擴(kuò)充等特點(diǎn)。由于嵌套表違反傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)第1范式,因此未經(jīng)處理不能直接存入傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù),雖然某些關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品提供了對(duì)嵌套表這種非第1范式結(jié)構(gòu)的支持[8],但是增加了應(yīng)用的復(fù)雜性且靈活性差,這種綁定與某個(gè)特定數(shù)據(jù)庫(kù)產(chǎn)品的方式不具備普遍推廣的前景。
工程領(lǐng)域的數(shù)據(jù)普遍具有半結(jié)構(gòu)化數(shù)據(jù)的特征,如果采用傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)進(jìn)行管理,由于存在半結(jié)構(gòu)化數(shù)據(jù)與結(jié)構(gòu)化數(shù)據(jù)之間阻抗不匹配的情況,需要由工程師人工進(jìn)行關(guān)系數(shù)據(jù)表設(shè)計(jì),這個(gè)人工設(shè)計(jì)工作的難度和工作量都較大,且不同的工程師數(shù)據(jù)庫(kù)設(shè)計(jì)領(lǐng)域的經(jīng)驗(yàn)和能力各不相同,最終的關(guān)系數(shù)據(jù)表設(shè)計(jì)質(zhì)量將參差不齊。
目前的開源NoSQL數(shù)據(jù)庫(kù)軟件已經(jīng)提供了直接處理半結(jié)構(gòu)化數(shù)據(jù)的能力,因此工程師可以直接利用MongoDB這類開源的非關(guān)系數(shù)據(jù)庫(kù)軟件用于工程軟件的開發(fā),這將大大減少軟件開發(fā)的工作量,同時(shí)由于采用了非關(guān)系數(shù)據(jù)庫(kù),各種繁雜多變的工程數(shù)據(jù)處理將變得簡(jiǎn)單?;贜oSQL的路基橫斷面數(shù)據(jù)處理新方法和常規(guī)軟件優(yōu)缺點(diǎn)對(duì)比見表3。
表3 基于NoSQL的新方法和常規(guī)軟件優(yōu)缺點(diǎn)對(duì)照表
前述表2所示的橫斷面地層線JSON數(shù)據(jù),是一種帶有嵌套的JSON文檔,這種嵌套的JSON文檔在數(shù)據(jù)應(yīng)用時(shí),例如,需要獲取里程CK78+040處路基橫斷面中,編號(hào)為“3”的地層類型值,可以采用表4所示的MongoDB聚合命令進(jìn)行查詢并返回一個(gè)自定義的普通鍵值格式JSON文檔對(duì)象。
表4 用MongoDB聚合命令獲取編號(hào)為“3”的地層類型值
本文通過對(duì)國(guó)內(nèi)公路、鐵路設(shè)計(jì)院相關(guān)路基設(shè)計(jì)軟件及國(guó)外路基設(shè)計(jì)軟件的調(diào)研,提出了一種將路基橫斷面數(shù)據(jù)編碼為嵌套層次JSON半結(jié)構(gòu)化數(shù)據(jù)的新方法,并采用非關(guān)系數(shù)據(jù)庫(kù)MongoDB進(jìn)行管理?;贜oSQL的新方法,不需要開發(fā)者有成熟的關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn),設(shè)計(jì)非關(guān)系數(shù)據(jù)庫(kù)時(shí)不需要考慮滿足關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)范式要求,只要開發(fā)者掌握面向?qū)ο笤O(shè)計(jì)方法即可無阻抗集成非關(guān)系數(shù)據(jù)庫(kù),大大降低了土木工程師開發(fā)工程軟件的難度,實(shí)現(xiàn)了相比傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)技術(shù)更為靈活、簡(jiǎn)單、高效的效果,可對(duì)各種繁雜多變的工程數(shù)據(jù)進(jìn)行統(tǒng)一處理,適用于各類不同場(chǎng)景的路基設(shè)計(jì)軟件開發(fā)。該新方法可以提高國(guó)產(chǎn)專業(yè)工程軟件的成熟度,促進(jìn)我國(guó)專業(yè)工程軟件自主可控可持續(xù)發(fā)展。