摘 要:提出了一種生命科學主題數據庫的快速構建方法。使用管理表和數據表共同管理生命科學數據,通過查詢模板靈活控制對數據庫的訪問,采用構件化方法設計和構造數據庫應用程序,從而快速構建主題數據庫。基于該方法構建的主題數據庫能夠快速增刪主題數據的類型,具有高度的靈活性。
關鍵詞:生命科學; 主題數據庫; 查詢模板; 構件
中圖分類號:TP311.132文獻標志碼:A
文章編號:1001-3695(2007)06-0012-03
隨著生命科學研究的不斷進步,特別是測序技術的蓬勃發展,人們能夠對越來越多的生物物種進行全基因組范圍的研究,并且可以運用不同的生物技術,用不同類型的數據來描述模式生物的性質。根據KEGG的統計,目前全世界已經完成測序以及正在測序的物種共有383種。不僅生物物種的數量龐大,而且每種生物物種都有多種數據。對于生命科學的研究人員而言,如果這些數據散放在不同位置的數據庫中,那么需要在多個數據庫中進行多次查詢才能得到結果,極大地浪費了研究人員的精力。更為糟糕的是,如果研究人員不知道存放某類數據的是什么數據庫,那么他還需要花額外的時間去搜索這類數據。為了有效地解決這些情況,提高研究人員查詢數據的效率,很多研究機構和數據管理中心均基于自己的數據管理策略,從特定的角度搜集并管理各類生命科學數據,構建生命科學主題數據庫(以下簡稱主題數據庫)。
建立主題數據庫的目的在于從特定的角度管理多類數據,并且提供統一的接口來進行數據訪問。高質量的主題數據庫不僅能夠管理當前數據,而且應能很方便地整合新的數據類型。主題數據庫可以按照多種方式來組織數據:①根據物種來組織數據,如酵母基因組數據庫[1];②根據疾病來組織數據,如癌癥與心血管疾病數據庫[2];③還可以根據其他的生物學含義來組織數據,如蛋白質組數據庫[3]。然而采用通常方法開發的主題數據庫雖然能夠提供統一接口來訪問多種數據,但難以應需而變。當需要在主題數據庫中增加新的數據類型,或者改變現有數據的展示方式時,需要較長時間來調整數據庫應用程序。
為了解決構建主題數據庫所面臨的問題,基于軟件構件的設計思想,本文提出了一種新的主題數據庫的快速構建方法。
1 生命科學主題數據庫的傳統構建方法
在主題數據庫的建設過程中,應用程序是基于數據庫表進行設計的,因此數據庫表的設計質量會直接影響應用程序的設計與開發。以下詳細介紹傳統的表數據方法與應用程序設計方法。
1.1 傳統生命科學數據表設計方法的弊端
由于生命科學數據有眾多的類型,在數據庫表設計過程中,除去用于管理的表之外,還需要設計表來維護生命科學數據。傳統的生命科學數據庫表設計方法可以劃分為:
①一個數據庫管理一類數據。各類數據位于不同的數據庫中。
②一個數據庫管理多類數據。每類數據一組表;各類數據之間不共用表。
③一個數據庫管理多類數據。多類數據的共同屬性存放到公用表;每類數據的特有屬性存放到該類數據的特有表。這些傳統的數據庫設計方式均存在一定的問題,無法完全滿足生命科學主題數據庫的靈活需求。方法①是很多小型主題數據庫的設計思路。它實際上只是把多類數據簡單地放在一起。雖然能夠很方便地增加新類型的數據,但是每增加一類設計,就需要完全重復一遍開發過程,產生大量的冗余代碼。隨著業務功能的增加,需要維護的代碼數量迅速增加,使后期維護極為困難。方法②與方法①很類似,區別在于它只需要一個數據庫就可以管理多類數據,缺點也與其類似,難以進行后期維護。方法③主要用在項目設計開始之前就需要管理多類數據,其抽象出這些數據的共性,在數據類型不發生變化的場合下能夠較好地運行。但是如果考慮不周的話,很容易過度抽象,即將當前多種類型的數據共性都抽象出來。一旦增加新類型的數據,原有類型數據的共性不再合適,需要重新抽取共性。上述提到的三種方法均是比較僵硬的數據庫設計方法,一旦增加新的數據類型,不僅要重新設計數據庫,更重要的是還要對程序代碼進行較大的更改,日后的維護工作十分困難。
1.2 傳統應用程序設計方法的現狀與趨勢
從計算機技術的發展現狀來看,目前軟件成本居高不下、開發周期長、用戶需求不斷變化,同時對軟件質量的要求越來越高。軟件功能需求變化的不斷加劇、規模和復雜度的迅速增大,是導致目前軟件問題的核心所在。在此形勢下,傳統的封閉式、作坊式的一切從零開始的軟件開發模式已不能滿足人們對軟件開發效率和質量的要求。軟件開發必須在軟件資源充分共享和復用的情況下,實現軟件產業范圍內開放式的專業化分工和協作。
軟件構件技術是支持軟件復用的核心技術,是近幾年來迅速發展并受到高度重視的一個學科分支。基于構件的開發或基于構件的軟件工程是軟件開發的新范型。它通過復用若干現成的軟件構件和開發少量的黏合代碼,快速組裝出高質量的應用軟件方法[4~7]。軟件構件化是解決目前軟件開發問題的現實且有效的途徑,是軟件復用技術的關鍵因素之一[8],已成為目前提高軟件生產率與質量,解決軟件危機的主流技術手段。
2 基于構件的主題數據庫構建方法
為了克服傳統主題數據庫構建方法的不足,本文采用構件化開發方法來構建生命科學主題數據庫。現在就系統架構、表設計、基于構建的應用設計來介紹這種方法;并以血吸蟲主題數據庫的構建為例,介紹如何構建并部署主題數據庫。
2.1 系統架構
主題數據庫系統采用多層體系結構,如圖1所示。底層是數據源,包括存放數據管理信息的各種管理表和存放數據的各種數據表。第二層(數據源的上一層)是構件層,包括兩類構件,即基礎構件和組合構件。基礎構件有很多,主要完成相對獨立的簡單功能。圖1中列出了六類相對重要的基礎構件,包括用戶交互相關的查詢數據、展現數據和存儲數據構件,以及數據維護相關的采集數據、載入數據和更新數據構件。組合構件由基礎構件組裝而成,能夠完成相對獨立的復雜功能。構件層上面是構件組裝與部署平臺。該平臺根據需要把多個構件按照一定的時序組裝成能夠行使特定功能的功能模塊,并且部署到Web服務器上。完成構件的組裝與部署后,就可以得到具有統一訪問接口的主題數據庫。
圖1 主題數據庫系統架構圖
2.2 表設計
由于主題數據庫需要管理的數據類型多樣,根據生命科學數據的特點,將生命科學數據的表分為兩類,即管理表和數據表。在管理表中存放所有數據類型都有的屬性數據,如提交者、提交日期、參考文獻等數據;在數據表中存放各種數據類型所特有的屬性數據。由于需要存放并維護不同類型的數據,同時數據庫管理系統如Oracle支持同一個數據庫包含多個模式(Schema),每類數據的數據表存放到相應的數據模式,所有類型數據的管理表均存放到管理模式。這從邏輯上區分開了不同類型的數據。每一類具體的分類數據可以稱為一個生命科學數據庫,能夠實施安全的數據訪問和維護授權策略。
管理表的引入,改變了以往傳統生命科學數據庫的設計思路。在管理模式中,不僅有存放數據公共屬性的管理表,還有存放數據分類信息相關的管理表。生命科學數據類型可以按照樹型結構來分類,即數據類型可能包括多種子數據類型。而子類型數據可能包括更詳細的數據類型。所有的數據類型均存放在管理表中,而且具體數據所對應的數據分類信息是樹型結構中的葉節點,數據所屬的上層分類信息為非葉節點。管理表中還存放了一項傳統數據庫中所沒有的數據,即查詢模板;每類數據對應一個查詢模板。查詢模板主要用于描述該類數據的哪些屬性可以被查詢或顯示,包括這些屬性所屬的表,以及在表中的名稱和類型。使用查詢模板能夠極大地減少程序維護的工作量。除此之外,管理模式中的管理表存放其他信息,如特定類型數據的描述、某類數據當前是否可用(主要用于維護)等。2.3 基于構件的主題數據庫應用設計
在主題數據庫的設計過程中,按照功能相對獨立、可復用性高的原則來進行構件的切分。首先設計了一組基礎構件,并在基礎構件的基礎上設計了六個組合構件。
基礎構件是構件層的底層部分。合適的構件劃分能夠降低系統的耦合度。下面詳細描述圖1中的六個基礎構件。
(1)構造樹型節點構件。將數據庫中的數據分類信息轉換成樹型數據結構中的樹型節點對象。該節點對象存儲訪問該數據分類所需要的所有信息。
(2)構造查詢模板構件。查詢模板是符合指定XML格式的文檔。它可以是文件也可以是數據庫中的CLOB數據,甚至可以是內存中的XML Document對象。一個查詢模板對應一類數據。定義該類數據可以查詢的表、表中可以查詢的列、表中可以在簡要搜索結果中顯示的類、可以查詢/顯示的列的數據類型等信息。該構件讀取模板文檔,得到XML Document對象,并生成查詢模板實例。
(3)生成查詢語句構件。查詢模板實例不僅反映查詢模板文件的內容,還可以接收用戶輸入的查詢關鍵字以及查詢連接條件。從查詢模板實例中獲取用戶輸入的查詢條件后,生成可執行的SQL語句。該構件很靈活,不需要預先設定數據庫表的相關信息;所有查詢條件均是從查詢模板中獲取,動態生成實現用戶查詢需求的查詢語句。
(4)展現簡要查詢結果構件。得到查詢的結果后,需要轉換原始的查詢結果,生成可以在Web頁面上展現的對象。(5)展現數據庫記錄構件。生命科學主題數據可以有不同的展現風格。不僅不同的數據類型可以有不同的展現風格,即使是同一數據類型也可以有文本、圖形、文本圖形混雜三種展現方法。為了方便擴展,每種數據的每種展現風格均設計為一種構件,從而共同構成展現數據構件。
(6)即時存儲搜索結果構件。在搜索到感興趣的數據后,用戶可能希望存儲部分數據,甚至希望存儲為特定的格式。由于存在多種下載格式的問題,每種格式一個構件,從而共同構成存儲數據構件。
組合構件可以是若干個基礎構件按照一定時序組裝而成,如查詢數據構件由構造樹型節點構件、構造查詢模板構件和生成查詢語句構件共同組裝而成。組合構件也可以是同一類型的基礎構件組合成一個大的構件,如展現數據構件是由多個展示不同風格的展現數據庫記錄構件構成,而存儲數據構件是由多個不同格式的即時存儲查詢結果構件構成。主題數據庫中有六個組合構件。它們的功能如下:
(1)查詢數據構件。執行用戶的查詢,返回查詢結果。
(2)展現數據構件。以多種風格展現特定種類的數據。
(3)存儲數據構件。以多種格式存儲搜索得到的結果。
(4)采集數據構件。自動從相關數據庫中提取相應的數據。數據來源既可以是用戶提交的數據,也可以是發表在其他數據庫中的數據。
(5)更新數據構件。及時更新主題數據庫中的數據,確保主題數據庫中的數據與相關數據庫中數據的一致性。
(6)載入數據構件。處理采集數據構件和根系數據構件得到的原始數據,轉換成應用程序能夠識別的數據,并把轉換后的數據導入到主題數據庫中。
2.4 主題數據庫的構建與部署
下面以開發血吸蟲主題數據庫為例,描述如何構建并部署主題數據庫。
(1)數據種類與來源。血吸蟲主題數據庫包括日本血吸蟲和曼氏血吸蟲的核酸數據與蛋白質數據。這兩類數據分別來自上海生命科學數據中心的核酸數據庫和蛋白質數據庫。基于對數據訪問速度和數據更新的考慮,血吸蟲主題數據庫中的數據實際上是核酸或者蛋白數據庫的物化視圖(Materialized View)。
(2)數據采集、加載與更新。由于血吸蟲主題數據庫的數據庫實際上是由上海生命科學數據中心的核酸和蛋白質數據的物化視圖構成,需要考慮的是如何從公共數據庫(如NCBI)上采集數據,并加載到核酸和蛋白質數據庫中。采集數據構件從公共數據庫中采集日本血吸蟲和曼氏血吸蟲的多類數據后,以GenBank[9]格式存放到本地。加載數據構件將GenBank格式的數據轉換成XML格式,并加載到核酸和蛋白質數據庫中。更新數據構件定時查詢公共數據庫,得到新增的數據并存儲到本地。
(3)數據訪問與用戶交互。查詢數據、展現數據和存儲數據三個組合構件共同構成生命科學數據搜索引擎BioEngine,再用JSP頁面實現Web交互。BioEngine對數據庫的訪問是通過查詢模板實現的,并且可以同時搜索多類數據。BioEngine提供了靈活的搜索方式,如簡單搜索、高級搜索等;提高了多種展現風格,如完整的數據記錄、不包含序列的數據記錄、只包含序列的數據記錄和圖形顯示特殊描述信息的數據記錄;此外,支持多種下載格式,如當前頁面搜索結果集的FASTA格式、GenBank格式、XML格式和所有搜索結果集的XML格式。
(4)新增數據類型的處理流程。如果血吸蟲主題數據庫需要增加新的數據類型,那么除了新增存儲新數據類型的數據表和增加新的展現構件外,主題數據庫的其他部分基本不需要大的修改,保證了系統架構的穩定性。為了管理新增數據類型,需要進行的數據庫設計工作包括三部分,即設計該類數據的數據表、查詢模板和定義新類型數據的描述信息。如果沒有能夠展現新數據類型的構件,需要開發一個新的展現數據庫記錄構件,以及調用該構件的接口展現新類型的數據。此外,還要更新采集數據、加載數據和更新數據這三個數據維護構件,讓它們能夠支持新類型的數據。除此之外,其他部分的構件以及代碼無須作任何更改。
3 結束語
與傳統的數據庫構建方法相比,本文提出的生命科學主題數據庫構建方法在數據庫和應用程序設計方面均有顯著的不同:
①數據庫中把生命科學數據分別存放到管理表和數據表中,減少了數據冗余量,同時避免了對數據共性的過度抽象。
②一類數據對應一個模式,數據庫設計和管理不受其他類型數據的影響,減少了數據維護的工作量。
③利用查詢模板定義數據庫的可訪問內容。一類數據一個模板。對不同類型數據的訪問(不包括數據展現)只需要更改模板。它能夠靈活地應對數據類型的更改,極大地縮減了系統開發周期。
④基于構件的數據庫應用程序能夠降低系統內部的程序耦合度。各部分之間的交互主要通過組裝代碼調用構件接口實現,提高了程序的可移植性和可復用性。
⑤基于構件的主題數據庫構建方法能夠有效地管理種類繁多的生命科學數據,靈活地滿足數據類型不斷增加的需求,從而快速開發出高質量的生命科學主題數據庫。
致謝:感謝上海軟件構件化服務中心葛孝堃主任、張敬周博士、李寅博士以及上海生物信息技術研究中心的李榮博士在項目實施過程以及本文成文過程中提供的大量幫助。
本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。