陳豪
(中交第二公路勘察設計研究院有限公司,湖北 武漢 430052)
鐵路、公路、城市道路及軌道交通都屬于條形帶狀工程,與路基設計有關的輸入和輸出數據量大,在長大線的情況下,數據量更是會迅速增大[1]。這些繁雜無序的數據如何準確高效地處理,一直是路基設計人員面臨的一個挑戰。
針對現有技術中沒有一套靈活、簡單、高效、準確、容易查錯的路基橫斷面數據處理方法的情況[2],本文作者結合路基設計軟件開發技術調研,嘗試提出一種基于非關系數據庫(NoSQL)的路基數據處理方法,并以MongoDB舉例說明供同行探討。
目前,國內外路基設計軟件無論是二維設計軟件還是三維設計軟件,都是基于橫斷面設計的模式做的開發[3-4]。路基橫斷面設計,需要處理大量的橫斷面地面線、地層線以及試驗數據等?,F有的國內外路基設計軟件,對路基橫斷面有關數據的處理方法主要有以下兩種:
一是將數據保存在不同的自定義平面文件或二進制文件中,然后根據不同的設計場景,自己編寫各種操控數據增刪查改的程序功能。
二是將數據保存在統一的項目關系數據庫中,如Access數據庫、SQLite數據庫等,然后根據不同的設計場景,用標準的結構化查詢語言SQL或者借助一些對象關系映射ORM中間件編寫各種操控數據增刪查改的功能。
目前,國內幾個大型鐵路設計院和公路設計院開發的路基設計軟件,在處理路基橫斷面地面線數據方面,采用的方法基本相同,即分左、右側對每個橫斷面實測記錄地面點到線路中心點的平距和高差[5-6],不同的軟件數據存儲格式和形式不同,有些存儲在平面文件中,有些存儲在關系數據庫中。在處理路基橫斷面地層線數據方面,由于行業習慣的差異,鐵路設計院比公路設計院在這方面的研究較多一些,幾家鐵路設計院的地層線數據處理方法差異較大,但是均定義了內部的橫斷面地質填圖數據互提接口格式。
下面基于NoSQL數據庫MongoDB,介紹一種不同于傳統平面文件及關系數據庫的橫斷面地面線、地層線數據處理方法。
MongoDB是用C++開發的一個高效、開源、無模式的文檔型數據庫,其底層采用高效的BSON作為數據存儲和傳輸格式,支持嵌套對象和數組,易于非結構化海量數據[7]的存儲。
如圖1所示的路基橫斷面,橫斷面實測地面線的數據組織,可以用表1所示的JSON文件來記錄地面點到線路中心點的平距和高差。每一個橫斷面地面線數據,都可以按表1的形式組織為一個JSON文檔對象存入MongoDB數據庫。

表1 橫斷面地面線邏輯數據模型

圖1 路基橫斷面圖
該JSON文檔有“里程”、“左側”、“中樁”、“右側”共4個頂層鍵,“里程”、“左側”、“右側”3個鍵的值都是一個數組?!白髠取焙汀坝覀取辨I值數組中存儲的是記錄若干個地面點參數的JSON文檔對象,這些JSON文檔對象被稱為嵌套文檔數組,“中樁”鍵的值是一個嵌套JSON文檔對象。
橫斷面地層線的數據組織,以一個包含有一般水平地層、透鏡體地層和尖滅地層的最特殊橫斷面為例(如圖1所示),用表2所示的JSON文件來記錄地層線。每一個橫斷面地層線數據,都可以按表2的形式組織為一個JSON文檔對象存入MongoDB數據庫。

表2 橫斷面地層線邏輯數據模型
此處的示例,僅列舉了一些最基礎的數據,格式化編入了JSON文檔,工程師可以根據不同的應用場景添加更多自定義的鍵值數據靈活擴展,例如可以在“地層”的鍵值下方添加該地層的黏聚力c、內摩擦角φ等巖土物理力學指標。
上述橫斷面地面線和地層線JSON文件所記錄的數據格式,是一種帶有嵌套的半結構化數據,這種數據格式具有“自我描述性”易于人類閱讀理解,層級結構可以兼容不規則數據,數據易于擴充等特點。由于嵌套表違反傳統關系數據庫設計第1范式,因此未經處理不能直接存入傳統的關系數據庫,雖然某些關系數據庫產品提供了對嵌套表這種非第1范式結構的支持[8],但是增加了應用的復雜性且靈活性差,這種綁定與某個特定數據庫產品的方式不具備普遍推廣的前景。
工程領域的數據普遍具有半結構化數據的特征,如果采用傳統的關系數據庫進行管理,由于存在半結構化數據與結構化數據之間阻抗不匹配的情況,需要由工程師人工進行關系數據表設計,這個人工設計工作的難度和工作量都較大,且不同的工程師數據庫設計領域的經驗和能力各不相同,最終的關系數據表設計質量將參差不齊。
目前的開源NoSQL數據庫軟件已經提供了直接處理半結構化數據的能力,因此工程師可以直接利用MongoDB這類開源的非關系數據庫軟件用于工程軟件的開發,這將大大減少軟件開發的工作量,同時由于采用了非關系數據庫,各種繁雜多變的工程數據處理將變得簡單?;贜oSQL的路基橫斷面數據處理新方法和常規軟件優缺點對比見表3。

表3 基于NoSQL的新方法和常規軟件優缺點對照表
前述表2所示的橫斷面地層線JSON數據,是一種帶有嵌套的JSON文檔,這種嵌套的JSON文檔在數據應用時,例如,需要獲取里程CK78+040處路基橫斷面中,編號為“3”的地層類型值,可以采用表4所示的MongoDB聚合命令進行查詢并返回一個自定義的普通鍵值格式JSON文檔對象。

表4 用MongoDB聚合命令獲取編號為“3”的地層類型值
本文通過對國內公路、鐵路設計院相關路基設計軟件及國外路基設計軟件的調研,提出了一種將路基橫斷面數據編碼為嵌套層次JSON半結構化數據的新方法,并采用非關系數據庫MongoDB進行管理?;贜oSQL的新方法,不需要開發者有成熟的關系數據庫設計經驗,設計非關系數據庫時不需要考慮滿足關系數據庫設計范式要求,只要開發者掌握面向對象設計方法即可無阻抗集成非關系數據庫,大大降低了土木工程師開發工程軟件的難度,實現了相比傳統關系數據庫技術更為靈活、簡單、高效的效果,可對各種繁雜多變的工程數據進行統一處理,適用于各類不同場景的路基設計軟件開發。該新方法可以提高國產專業工程軟件的成熟度,促進我國專業工程軟件自主可控可持續發展。