徐明民 彭中華 王黎維
(1.武漢大學(xué)計(jì)算機(jī)學(xué)院 武漢 430072)(2.武漢大學(xué)國(guó)際軟件學(xué)院 武漢 430072)
基于表分區(qū)和內(nèi)存數(shù)據(jù)庫(kù)的族譜生成系統(tǒng)優(yōu)化
徐明民1彭中華2王黎維2
(1.武漢大學(xué)計(jì)算機(jī)學(xué)院 武漢 430072)(2.武漢大學(xué)國(guó)際軟件學(xué)院 武漢 430072)
論文為現(xiàn)有的族譜系統(tǒng)數(shù)據(jù)存儲(chǔ)提出一種優(yōu)化的存儲(chǔ)方案——基于表分區(qū)的存儲(chǔ)方案。分析現(xiàn)有的族譜系統(tǒng)在數(shù)據(jù)存儲(chǔ)方案上的不足,參考PostgreSQL的表分區(qū)技術(shù),使用表分區(qū)方案來(lái)對(duì)族譜人物及關(guān)系數(shù)據(jù)重新建模和存儲(chǔ),提高了對(duì)族譜數(shù)據(jù)的管理和操作效率;基于現(xiàn)有族譜生成系統(tǒng)在族譜生成過(guò)程中對(duì)數(shù)據(jù)處理的特點(diǎn),引入內(nèi)存數(shù)據(jù)庫(kù)技術(shù),采用內(nèi)存數(shù)據(jù)庫(kù)SQLite在數(shù)據(jù)處理過(guò)程中存儲(chǔ)數(shù)據(jù),提高了對(duì)數(shù)據(jù)的處理效率。實(shí)驗(yàn)部分測(cè)試了使用表分區(qū)和內(nèi)存數(shù)據(jù)庫(kù)技術(shù)的可行性和性能影響,實(shí)驗(yàn)結(jié)果表明,使用表分區(qū)方案和內(nèi)存數(shù)據(jù)庫(kù)技術(shù)方案可以支持族譜數(shù)據(jù)的存儲(chǔ)和族譜生成過(guò)程中內(nèi)存數(shù)據(jù)的處理需求,并且在一定程度上優(yōu)化族譜生成系統(tǒng)的性能。
族譜; PostgreSQL; 表分區(qū); 內(nèi)存數(shù)據(jù)庫(kù); SQLite
Class Number TP311
族譜又稱為家譜、宗譜,是一種記錄家族世代繁衍和重要人物事跡的圖文體裁。族譜文獻(xiàn)對(duì)于我們了解人文歷史有很大的幫助,并且在政治經(jīng)濟(jì)學(xué)、地理學(xué)、群體遺傳學(xué)等方面都有著潛在的研究?jī)r(jià)值[1]。傳統(tǒng)的中式族譜通常以紙質(zhì)、布質(zhì)等形式的譜書為承載形式,各族、各家擁有自己獨(dú)立的譜書。這些譜書在存在形式上相互獨(dú)立,但是在內(nèi)容上卻有很強(qiáng)的相關(guān)性。傳統(tǒng)的譜書式族譜在信息交互和共享方面存在著先天不足,且實(shí)體的譜書不便于后續(xù)的修改(續(xù)修)以及保存。因此,近年來(lái)族譜數(shù)字化受到了社會(huì)的廣泛關(guān)注。數(shù)字化族譜系統(tǒng)除了能提供給用戶錄入族譜信息、利用族譜信息的功能之外,還需要兼顧中式族譜的特殊需求。家族在編修族譜時(shí),通常都需要以采集好的族譜數(shù)據(jù)為基礎(chǔ),通過(guò)編輯、排版形成內(nèi)容豐富、圖文并茂、樣式美觀的譜書,然后將其印刷成冊(cè)并分發(fā)給族人。目前,國(guó)內(nèi)外在數(shù)字化族譜系統(tǒng)方面已有一些研究和開(kāi)發(fā)工作。著名的族譜網(wǎng)站FamilySearch[2]中,用戶可以方便地創(chuàng)建和管理個(gè)性化族譜空間,但沒(méi)有提供族譜數(shù)據(jù)紙質(zhì)化輸出功能。文獻(xiàn)[3~4]都實(shí)現(xiàn)了基于單機(jī)形式的族譜錄入軟件:將族譜的制作工作分割成多個(gè)任務(wù),由多位制作人員分別完成這些任務(wù)并以文件存儲(chǔ)任務(wù)中輸入的族譜數(shù)據(jù),最后將多個(gè)數(shù)據(jù)文件合并、編輯形成最終的族譜。但是這種數(shù)據(jù)管理方式不利于信息的共享,而且多個(gè)數(shù)據(jù)文件之間存在較多冗余以及沖突,無(wú)法自動(dòng)完成數(shù)據(jù)文件合并。為了加快族譜數(shù)字化進(jìn)程,結(jié)合實(shí)際的應(yīng)用需求,本文實(shí)現(xiàn)了一個(gè)基于B/S架構(gòu)的族譜信息系統(tǒng)[5~6]。該系統(tǒng)提供了族譜數(shù)據(jù)錄入、查詢服務(wù)以及族譜紙質(zhì)化輸出等功能,但隨著錄入族譜的人物數(shù)據(jù)量的急速增長(zhǎng),數(shù)據(jù)庫(kù)表內(nèi)的人物和人物關(guān)系條數(shù)會(huì)急速增長(zhǎng),在目前族譜系統(tǒng)人物數(shù)據(jù)和人物關(guān)系數(shù)據(jù)單表的存儲(chǔ)方案下,查詢服務(wù)效率會(huì)急劇下降,對(duì)族譜數(shù)據(jù)的管理很不方便且可維護(hù)性很差;在面對(duì)大數(shù)據(jù)量族譜的生成時(shí),目前內(nèi)存數(shù)據(jù)的存儲(chǔ)方式對(duì)數(shù)據(jù)的操作效率影響很大,同時(shí)也易造成系統(tǒng)的不穩(wěn)定,導(dǎo)致系統(tǒng)長(zhǎng)時(shí)間無(wú)響應(yīng)甚至“假死”。結(jié)合族譜信息系統(tǒng)中的實(shí)際需求,本文對(duì)該系統(tǒng)的族譜數(shù)據(jù)存儲(chǔ)方案進(jìn)行了改進(jìn),采用表分區(qū)技術(shù),提升了對(duì)族譜數(shù)據(jù)的操作和管理效率,同時(shí)在族譜的生成過(guò)程中,采用內(nèi)存數(shù)據(jù)庫(kù)SQLite,提高了對(duì)族譜數(shù)據(jù)操作的效率,從而提升族譜生成系統(tǒng)的效率和穩(wěn)定性。
傳統(tǒng)族譜信息系統(tǒng)采用的是單機(jī)管理不易于擴(kuò)展功能,其中的數(shù)據(jù)分散且有大量冗余,而且傳統(tǒng)族譜信息系統(tǒng)面向的是族譜制作用戶,無(wú)法利用其中的族譜數(shù)據(jù)向公眾用戶提供服務(wù)。為了更好地收集和利用族譜數(shù)據(jù),本文設(shè)計(jì)并開(kāi)發(fā)了一款族譜信息系統(tǒng),整個(gè)系統(tǒng)如圖1所示[5]。族譜信息系統(tǒng)分為族譜信息錄入系統(tǒng)、族譜生成系統(tǒng)以及姓氏網(wǎng)站展示系統(tǒng)三個(gè)子系統(tǒng),族譜系統(tǒng)的主要功能包括數(shù)據(jù)錄入、數(shù)據(jù)服務(wù)和數(shù)據(jù)輸出。族譜信息錄入系統(tǒng)是基于B/S架構(gòu)的,該系統(tǒng)可以支持多用戶并行地錄入同一族譜中的數(shù)據(jù),并統(tǒng)一對(duì)族譜數(shù)據(jù)進(jìn)行管理,同時(shí)通過(guò)本系統(tǒng)還可向公眾用戶提供對(duì)已錄入族譜數(shù)據(jù)的檢索。族譜信息錄入系統(tǒng)提供數(shù)據(jù)錄入的功能,錄入功能主要包括三部分:世系數(shù)據(jù)錄入、文檔數(shù)據(jù)錄入、多媒體數(shù)據(jù)錄入。姓氏網(wǎng)站展示系統(tǒng)提供數(shù)據(jù)服務(wù)的功能,主要包括數(shù)據(jù)展示、統(tǒng)計(jì)檢索、一鍵尋祖和一鍵尋親。族譜生成系統(tǒng)則為用戶提供數(shù)據(jù)輸出的功能,主要包括族譜編排和族譜生成。族譜編排功能是通過(guò)用戶的個(gè)性化需求對(duì)譜書的樣式、數(shù)據(jù)出現(xiàn)的順序、詞語(yǔ)的表達(dá)方式等進(jìn)行設(shè)置;而族譜生成功能主要是在族譜編排過(guò)后,按照用戶的個(gè)性化需求從原始族譜數(shù)據(jù)中轉(zhuǎn)換生成電子版的譜書以供印刷。
族譜生成系統(tǒng)是整個(gè)族譜系統(tǒng)的關(guān)鍵所在,生成系統(tǒng)生成族譜的大體流程如圖2所示,主要涉及到數(shù)據(jù)獲取、數(shù)據(jù)處理、數(shù)據(jù)填充和生成族譜四個(gè)階段。數(shù)據(jù)獲取是指從族譜數(shù)據(jù)庫(kù)中取出對(duì)應(yīng)要生成的族譜所有數(shù)據(jù)信息的過(guò)程,數(shù)據(jù)信息主要包括族譜全局?jǐn)?shù)據(jù)、人物數(shù)據(jù)和人物關(guān)系數(shù)據(jù);數(shù)據(jù)處理即是對(duì)取出的族譜數(shù)據(jù)進(jìn)行規(guī)范化以及按照用戶的設(shè)置進(jìn)行再處理轉(zhuǎn)化的過(guò)程;數(shù)據(jù)填充即是用經(jīng)過(guò)處理加工后的數(shù)據(jù)與用戶選擇的版式進(jìn)行結(jié)合,填充對(duì)應(yīng)的版式;生成族譜環(huán)節(jié)包括先將處理后的數(shù)據(jù)信息和HTML格式的族譜模板組合生成一頁(yè)頁(yè)HTML格式的族譜,在此過(guò)程中同時(shí)還包括生成人物的頁(yè)碼信息,對(duì)應(yīng)更新族譜數(shù)據(jù)庫(kù)人物信息表的人物頁(yè)碼字段,然后替換HTML格式族譜中對(duì)應(yīng)的人物頁(yè)碼字段等。最終由HTML格式的族譜生成PDF格式的族譜。
在多次生成族譜的過(guò)程中發(fā)現(xiàn),在數(shù)據(jù)獲取階段,獲取的數(shù)據(jù)信息中主要包括人物信息和人物關(guān)系信息,分別對(duì)應(yīng)存儲(chǔ)在數(shù)據(jù)庫(kù)的人物表和人物關(guān)系表中,并且每次都只會(huì)獲取與該族譜有關(guān)的所有數(shù)據(jù)。在數(shù)據(jù)獲取的過(guò)程中,人物表和人物關(guān)系表的信息都是基于選擇的族譜ID(Gid)來(lái)進(jìn)行過(guò)濾,從而取出所有關(guān)聯(lián)的人物數(shù)據(jù)和人物關(guān)系數(shù)據(jù)。隨著族譜系統(tǒng)錄入的族譜數(shù)量越來(lái)越多,人物表和人物關(guān)系表的數(shù)據(jù)條目也急劇增加,而每次需要獲取的數(shù)據(jù)相對(duì)于整張表而言,相對(duì)很少;以單表的形式來(lái)存儲(chǔ),不僅影響操作的效率,而且不方便進(jìn)行管理。在數(shù)據(jù)處理和數(shù)據(jù)填充以及族譜生成階段,由于存取到的表數(shù)據(jù)需要常駐內(nèi)存,在此基礎(chǔ)上還需要對(duì)數(shù)據(jù)進(jìn)行查詢和運(yùn)算,目前的系統(tǒng)采用DataSet的存儲(chǔ)方式,以DataTable來(lái)存儲(chǔ)表數(shù)據(jù)的信息,當(dāng)需要計(jì)算的人物數(shù)據(jù)和關(guān)系數(shù)據(jù)量較大時(shí),極易造成系統(tǒng)無(wú)響應(yīng)或者程序中斷的不穩(wěn)定情形出現(xiàn)。
綜上所述,原來(lái)的數(shù)據(jù)存儲(chǔ)方案有如下缺陷:隨著錄入的數(shù)據(jù)越來(lái)越多,人物表和人物關(guān)系表的數(shù)據(jù)條目會(huì)急劇增長(zhǎng),單表存儲(chǔ)的數(shù)據(jù)管理方式顯然是不合適的;盡管在原來(lái)關(guān)系表的對(duì)應(yīng)字段上建有索引,在數(shù)據(jù)量增大后索引的性能也會(huì)極大下降;隨著族譜系統(tǒng)的推廣使用,生成系統(tǒng)對(duì)族譜數(shù)據(jù)的并行操作是很常見(jiàn)的情形,目前單表的存儲(chǔ)方式很影響系統(tǒng)的性能。在數(shù)據(jù)處理和數(shù)據(jù)填充階段,以Dataset方式來(lái)存儲(chǔ)數(shù)據(jù),處理的過(guò)程中效率較低;在族譜生成階段還涉及對(duì)族譜數(shù)據(jù)庫(kù)中人物頁(yè)碼字段的更新,此時(shí)網(wǎng)絡(luò)狀況很可能成為瓶頸因素;在內(nèi)存中處理大量數(shù)據(jù)時(shí),由于沒(méi)有一些對(duì)應(yīng)的數(shù)據(jù)保護(hù)機(jī)制,很難保證數(shù)據(jù)的完整性和系統(tǒng)的穩(wěn)定性。
圖1 族譜系統(tǒng)介紹
圖2 族譜生成子系統(tǒng)流程示意圖
根據(jù)上述分析,本文提出存儲(chǔ)優(yōu)化方案——表分區(qū)方案以及內(nèi)存數(shù)據(jù)庫(kù)技術(shù)方案??傮w來(lái)看,使用表分區(qū)技術(shù)優(yōu)化存儲(chǔ)有以下優(yōu)勢(shì):分區(qū)后,獲取族譜數(shù)據(jù)的查詢性能可以得到一定提升;通過(guò)將不同分區(qū)存儲(chǔ)在不同的磁盤,使多用戶并行獲取不同分區(qū)的族譜數(shù)據(jù)時(shí),可以有效地分散I/O;分區(qū)后,可以將全局索引替換為分區(qū)索引,分區(qū)表的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于原來(lái)的表,索引能更有效地發(fā)揮性能;同時(shí)對(duì)族譜數(shù)據(jù)的管理也更有效地進(jìn)行,批量刪除族譜數(shù)據(jù)可以通過(guò)簡(jiǎn)單的刪除某個(gè)分區(qū)來(lái)實(shí)現(xiàn)。使用內(nèi)存數(shù)據(jù)庫(kù)技術(shù)對(duì)于族譜生成有以下優(yōu)勢(shì):利用內(nèi)存數(shù)據(jù)庫(kù)SQLite替換原來(lái)的DataSet的存儲(chǔ)形式,可以有效地提高數(shù)據(jù)處理的效率;使用內(nèi)存數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)族譜的數(shù)據(jù)信息后,在族譜完全生成完成之前,生成系統(tǒng)只需和本地的SQLite進(jìn)行交互,不再需要和遠(yuǎn)程族譜數(shù)據(jù)庫(kù)通信,因此有效地減小了網(wǎng)絡(luò)因素的影響;內(nèi)存數(shù)據(jù)庫(kù)利用數(shù)據(jù)庫(kù)的事務(wù)管理等機(jī)制可以保證族譜數(shù)據(jù)的完整性和安全性,從而有效地提高生成系統(tǒng)的穩(wěn)定性。
3.1 表分區(qū)方案
數(shù)據(jù)庫(kù)分區(qū)是一種物理數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù),分區(qū)就是把邏輯上的一個(gè)大表分割成物理上的幾個(gè)塊。雖然分區(qū)技術(shù)可以實(shí)現(xiàn)很多效果,但其主要目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減查詢時(shí)間。分區(qū)主要有兩種形式:水平分區(qū)和垂直分區(qū)。水平分區(qū)是對(duì)表的行記錄進(jìn)行分區(qū),通過(guò)這樣的方式不同分組里的物理列分割的數(shù)據(jù)集得以組合,從而進(jìn)行個(gè)體分割(單分區(qū))或集體分割(一個(gè)或多個(gè)分區(qū));垂直分區(qū)一般來(lái)說(shuō)是通過(guò)對(duì)表的垂直劃分來(lái)減少目標(biāo)表的寬度,使某些特定的列被劃分到特定的分區(qū),每個(gè)分區(qū)都包含了其中的列所對(duì)應(yīng)的行,所有在表中定義的列在每個(gè)數(shù)據(jù)集中都能找到,所以表的特性依然得以保持。分區(qū)不僅能帶來(lái)訪問(wèn)速度的提升,關(guān)鍵的是還它能帶來(lái)管理和維護(hù)上的方便。PostgreSQL數(shù)據(jù)庫(kù)支持基本的表分區(qū)功能,在PostgreSQL中表分區(qū)是通過(guò)表的繼承來(lái)實(shí)現(xiàn)的,目前PostgreSQL的表分區(qū)方案有:范圍分區(qū)和列表分區(qū)。范圍分區(qū)是指表被一個(gè)或者多個(gè)鍵字字段分區(qū)成“范圍”,在這些范圍之間沒(méi)有重疊的數(shù)值分布到不同的分區(qū)里。列表分區(qū)則是指表是通過(guò)明確地列出每個(gè)分區(qū)里應(yīng)該出現(xiàn)那些鍵字值實(shí)現(xiàn)的。
目前的族譜數(shù)據(jù)庫(kù)中的數(shù)據(jù)表主要有族譜表、人物表以及人物關(guān)系表。族譜表主要包含每個(gè)族譜的描述信息,人物表記錄了錄入系統(tǒng)錄入的所有人物描述信息,人物關(guān)系表記錄了人物表中所有的人物之間的關(guān)系信息。隨著人物數(shù)據(jù)信息不斷地錄入,人物表和關(guān)系表的記錄條數(shù)會(huì)急劇增長(zhǎng);并且隨著族譜系統(tǒng)的進(jìn)一步推廣和使用,極易出現(xiàn)對(duì)族譜數(shù)據(jù)庫(kù)數(shù)據(jù)的并行操作,引成的I/O集中會(huì)引起系統(tǒng)的性能變慢。
因此考慮采用表分區(qū)方案對(duì)族譜系統(tǒng)數(shù)據(jù)庫(kù)中關(guān)鍵的數(shù)據(jù)表——人物表和人物關(guān)系表,進(jìn)行分區(qū)處理。利用PostgreSQL數(shù)據(jù)庫(kù)的分區(qū)技術(shù)并參考族譜系統(tǒng)對(duì)數(shù)據(jù)存儲(chǔ)和操作的方式,利用族譜ID(Gid)對(duì)人物表和人物關(guān)系表進(jìn)行范圍分區(qū)。以人物表為例,首先創(chuàng)建對(duì)應(yīng)范圍的分區(qū)表,設(shè)定一定的ID范圍對(duì)分區(qū)進(jìn)行控制,然后創(chuàng)建觸發(fā)器函數(shù),這樣數(shù)據(jù)導(dǎo)入時(shí)則會(huì)按照設(shè)定的分區(qū)范圍,相對(duì)均勻地分布在多個(gè)分區(qū)。在族譜生成過(guò)程中需要獲取對(duì)應(yīng)族譜的所有數(shù)據(jù)時(shí),則不再需要在一張千萬(wàn)級(jí)的數(shù)據(jù)表中進(jìn)行檢索,而是按照規(guī)則去對(duì)應(yīng)的分區(qū)中進(jìn)行檢索,提高了查詢效率;同時(shí)原來(lái)數(shù)據(jù)表的索引可以分散到各個(gè)分區(qū),由于每個(gè)分區(qū)的記錄數(shù)遠(yuǎn)遠(yuǎn)小于原來(lái)的表,分區(qū)上的索引可以更好地實(shí)現(xiàn)加快查詢的效果;隨著族譜數(shù)據(jù)的錄入和族譜的生成完成,需要對(duì)某個(gè)族譜段的族譜數(shù)據(jù)進(jìn)行刪除時(shí),可以通過(guò)簡(jiǎn)單地刪除某一個(gè)或者幾個(gè)分區(qū)來(lái)進(jìn)行,方便了對(duì)族譜數(shù)據(jù)的管理;并且可以考慮將多個(gè)分區(qū)分別放置在不同的物理磁盤上,這樣在處理對(duì)族譜數(shù)據(jù)的并行操作時(shí),I/O可以被有效地分散,提高了生成系統(tǒng)的響應(yīng)時(shí)間和系統(tǒng)的穩(wěn)定性。
3.2 內(nèi)存數(shù)據(jù)庫(kù)技術(shù)
內(nèi)存數(shù)據(jù)庫(kù)拋棄了傳統(tǒng)的磁盤數(shù)據(jù)管理方式,基于全部數(shù)據(jù)都在內(nèi)存中重新設(shè)計(jì)體系結(jié)構(gòu),并且在數(shù)據(jù)緩存、快速算法、并行操作方面都進(jìn)行了相應(yīng)的改進(jìn),所以數(shù)據(jù)處理速度比傳統(tǒng)數(shù)據(jù)庫(kù)的數(shù)據(jù)處理方式要快很多。內(nèi)存數(shù)據(jù)庫(kù)和傳統(tǒng)數(shù)據(jù)庫(kù)的區(qū)別在于傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)是關(guān)系型數(shù)據(jù)庫(kù),開(kāi)發(fā)這種數(shù)據(jù)庫(kù)的目的是處理永久、穩(wěn)定的數(shù)據(jù);關(guān)系數(shù)據(jù)庫(kù)強(qiáng)調(diào)維護(hù)數(shù)據(jù)的完整性、一致性,但很難顧及有關(guān)數(shù)據(jù)及其處理的實(shí)時(shí)要求。對(duì)內(nèi)存數(shù)據(jù)庫(kù)而言,將整個(gè)數(shù)據(jù)庫(kù)或其主要的“工作”部分放入內(nèi)存,使每個(gè)事務(wù)在執(zhí)行過(guò)程中沒(méi)有I/O,則為系統(tǒng)較準(zhǔn)確估算和安排事務(wù)的運(yùn)行時(shí)間,使之具有較好的實(shí)時(shí)處理能力。常見(jiàn)的內(nèi)存數(shù)據(jù)庫(kù)有:SQLite、FastDB、Memcached和Redis等,結(jié)合在族譜生成過(guò)程中對(duì)數(shù)據(jù)處理的特點(diǎn),最終選用了SQLite數(shù)據(jù)庫(kù),因?yàn)镾QLite作為一款開(kāi)源的內(nèi)存數(shù)據(jù)庫(kù)軟件,相比其他內(nèi)存數(shù)據(jù)庫(kù),不受許可證費(fèi)用約束,在便攜性、 易用性、 緊湊性、 高效性和可靠性方面都有突出的表現(xiàn),更加輕量級(jí),同時(shí)不僅支持對(duì)數(shù)據(jù)的查詢,也支持對(duì)數(shù)據(jù)的更新等操作,很好地滿足了族譜生成過(guò)程中對(duì)數(shù)據(jù)處理的需求。
在族譜系統(tǒng)中,如圖2中所示,將該族譜的數(shù)據(jù)從服務(wù)器數(shù)據(jù)庫(kù)獲取到本機(jī)后,需要經(jīng)過(guò)數(shù)據(jù)處理、數(shù)據(jù)填充以及族譜生成這幾個(gè)階段后才能完成族譜PDF的最終生成。在這幾個(gè)處理階段中,族譜數(shù)據(jù)尤其是人物數(shù)據(jù)和人物關(guān)系表數(shù)據(jù)都會(huì)以DataTable的形式常駐在內(nèi)存中,當(dāng)該族譜涉及到的人物數(shù)據(jù)和人物關(guān)系數(shù)據(jù)較大時(shí),內(nèi)存中的數(shù)據(jù)集也會(huì)很大,并且在此過(guò)程中涉及到對(duì)該數(shù)據(jù)集的查詢和更新操作,采用DataTable的形式進(jìn)行存儲(chǔ),處理效率較低,同時(shí)很難保證系統(tǒng)的穩(wěn)定性。因此考慮采用內(nèi)存數(shù)據(jù)庫(kù)技術(shù)對(duì)該內(nèi)存數(shù)據(jù)集進(jìn)行優(yōu)化存儲(chǔ)。基于族譜生成系統(tǒng)的數(shù)據(jù)操作特點(diǎn),采用SQLite來(lái)存儲(chǔ)生成過(guò)程中需要處理的內(nèi)存數(shù)據(jù)集。
圖3所示為使用內(nèi)存數(shù)據(jù)庫(kù)SQLite后生成系統(tǒng)進(jìn)行數(shù)據(jù)處理的過(guò)程。需要計(jì)算的內(nèi)存數(shù)據(jù)集會(huì)存儲(chǔ)在SQLite中,從而程序只需與本地的SQLite交互,生成族譜PDF中的人物頁(yè)碼信息也直接存儲(chǔ)在SQLite中,而不需要與遠(yuǎn)程的族譜服務(wù)器進(jìn)行通信。圖4所示為生成系統(tǒng)程序中具體對(duì)SQLite調(diào)用的過(guò)程。首先需要打開(kāi)和連接本地的SQLite數(shù)據(jù)庫(kù),將從族譜服務(wù)器獲取到的數(shù)據(jù)寫入到SQLite中進(jìn)行初始化。在后續(xù)的數(shù)據(jù)處理、數(shù)據(jù)填充以及族譜生成階段,需要做查詢和操作時(shí),都直接通過(guò)SQL語(yǔ)句與SQLite進(jìn)行交互,獲取到相應(yīng)的數(shù)據(jù)集后進(jìn)行操作;在數(shù)據(jù)操作的過(guò)程中,也會(huì)涉及對(duì)數(shù)據(jù)庫(kù)的清理,同時(shí)會(huì)涉及到對(duì)族譜數(shù)據(jù)進(jìn)行備份等處理操作,最后在族譜生成工作完成后,關(guān)閉SQLite數(shù)據(jù)庫(kù)。利用SQLite的優(yōu)化存儲(chǔ),在提高了生成系統(tǒng)效率的同時(shí),更好地保證了內(nèi)存數(shù)據(jù)集的完整性和安全性,有效地提高了生成系統(tǒng)的穩(wěn)定性。
圖3 使用SQLite的族譜生成系統(tǒng)
圖4 調(diào)用數(shù)據(jù)庫(kù)SQLite的主要流程
實(shí)驗(yàn)部分別對(duì)文中提出的基于表分區(qū)和使用內(nèi)存數(shù)據(jù)庫(kù)SQLite的方案進(jìn)行功能測(cè)試和性能測(cè)試,并對(duì)測(cè)試結(jié)果進(jìn)行分析和總結(jié)。
4.1 實(shí)驗(yàn)環(huán)境與測(cè)試數(shù)據(jù)
測(cè)試選用的系統(tǒng)環(huán)境是一臺(tái)處理器為Intel Core i3-M3702.40GHz,2.0G內(nèi)存的PC機(jī),操作系統(tǒng)選用Windows7的32位版本。測(cè)試使用未使用表分區(qū)方案和內(nèi)存數(shù)據(jù)庫(kù)SQLite的族譜生成系統(tǒng)和最新版本的族譜生成系統(tǒng)。
測(cè)試數(shù)據(jù)集選取如下:數(shù)據(jù)集分別為DS1~DS5五個(gè)族譜,族譜的ID以及族譜的人物節(jié)點(diǎn)數(shù)和族譜的人物關(guān)系記錄依次如表1中所示。
表1 測(cè)試數(shù)據(jù)集
4.2 實(shí)驗(yàn)結(jié)果與分析
1) 功能測(cè)試
功能測(cè)試主要測(cè)試基于表分區(qū)的方案能否滿足系統(tǒng)對(duì)族譜數(shù)據(jù)庫(kù)數(shù)據(jù)的操作,其中包括族譜數(shù)據(jù)的存儲(chǔ)、查詢、插入和刪除;以及測(cè)試基于內(nèi)存數(shù)據(jù)庫(kù)技術(shù)的存儲(chǔ)方案能否滿足族譜成功生成的功能。
針對(duì)以上需要測(cè)試的功能,以人物表t_individual為例,設(shè)計(jì)幾個(gè)測(cè)試用例如下:
(1)SELECTgid,fullname From t_individual ;
(2)INSERT INTO t_individual( gid, fullname ) VALUES (1 ,’張三’);
(3)UPDATE t_individual SET fullname = ’李四’ WHERE gid=1 AND fullname = ’張三’;
(4)DELETE FROM t_individual WHERE gid =1 AND fullname = ’李四’;
上述幾個(gè)測(cè)試用例涉及到了人物表分區(qū)后的查詢、插入、更新以及刪除操作。測(cè)試用例的運(yùn)行正確表明了表分區(qū)方案用于族譜系統(tǒng)數(shù)據(jù)庫(kù)的可行性;分別使用原來(lái)的系統(tǒng)和使用SQLite后的生成系統(tǒng),生成相同的族譜PDF進(jìn)行對(duì)比,發(fā)現(xiàn)內(nèi)容一致,也證明了內(nèi)存數(shù)據(jù)庫(kù)SQLite用于族譜系統(tǒng)的可行性。
2) 性能測(cè)試
圖5所示為表分區(qū)方案前后對(duì)人物信息表進(jìn)行查詢時(shí),數(shù)據(jù)集里對(duì)應(yīng)族譜數(shù)據(jù)檢索所消耗的時(shí)間對(duì)比。實(shí)驗(yàn)結(jié)果表明:進(jìn)行表分區(qū)后,對(duì)數(shù)據(jù)的檢索效率得到一定提升。并且在數(shù)據(jù)庫(kù)整體的數(shù)據(jù)集越大時(shí),表分區(qū)的優(yōu)勢(shì)會(huì)更明顯。圖6所示為使用內(nèi)存數(shù)據(jù)庫(kù)SQLite前后,對(duì)應(yīng)不同大小的族譜數(shù)據(jù)集,利用生成系統(tǒng)生成族譜時(shí)消耗的時(shí)間對(duì)比。
綜上,對(duì)于族譜數(shù)據(jù)查詢和族譜生成的性能測(cè)試,充分說(shuō)明了使用表分區(qū)方案可以在一定程度上優(yōu)化族譜數(shù)據(jù)的查詢性能,并且方便了對(duì)族譜數(shù)據(jù)的管理;通過(guò)使用內(nèi)存數(shù)據(jù)庫(kù)技術(shù),有效地提升了生成系統(tǒng)的效率。
圖5 表分區(qū)前后查詢效率對(duì)比
圖6 使用內(nèi)存數(shù)據(jù)庫(kù)SQLite前后的效率對(duì)比
在目前的族譜生成系統(tǒng)中,在族譜數(shù)據(jù)庫(kù)里人物數(shù)據(jù)和人物關(guān)系數(shù)據(jù)分別利用一張關(guān)系表來(lái)存儲(chǔ),隨著族譜數(shù)據(jù)在錄入系統(tǒng)的不斷錄入,人物表和人物關(guān)系表的記錄條數(shù)會(huì)急劇增長(zhǎng),對(duì)族譜信息的獲取相對(duì)耗時(shí),且存在多用戶并發(fā)操作族譜數(shù)據(jù)庫(kù)數(shù)據(jù)的情形,因此對(duì)人物表和關(guān)系表采用表分區(qū)機(jī)制,提高數(shù)據(jù)的獲取效率,同時(shí)增加了對(duì)族譜數(shù)據(jù)管理的方便性和可維護(hù)性;從數(shù)據(jù)庫(kù)取出數(shù)據(jù)后,在族譜生成階段對(duì)族譜數(shù)據(jù)需要進(jìn)行不同的操作,但數(shù)據(jù)都需常駐內(nèi)存,并且生成系統(tǒng)還需要和族譜數(shù)據(jù)庫(kù)進(jìn)行交互,當(dāng)族譜的數(shù)據(jù)量很大時(shí),易造成程序的不穩(wěn)定;在和數(shù)據(jù)庫(kù)交互時(shí),網(wǎng)絡(luò)狀況對(duì)系統(tǒng)的影響很大,因此采用內(nèi)存數(shù)據(jù)庫(kù)SQLite來(lái)存儲(chǔ)對(duì)應(yīng)數(shù)據(jù)。
采用表分區(qū)方案及內(nèi)存數(shù)據(jù)庫(kù)技術(shù)方案:參考族譜系統(tǒng)應(yīng)用場(chǎng)景的具體情況,考慮對(duì)人物表和人物關(guān)系表進(jìn)行表分區(qū),可以將不同的分區(qū)存儲(chǔ)到不同的磁盤,在分區(qū)的基礎(chǔ)上再建立索引,在提升對(duì)數(shù)據(jù)獲取效率的同時(shí)也方便了對(duì)族譜數(shù)據(jù)的管理;在將族譜數(shù)據(jù)取出后在內(nèi)存中對(duì)其進(jìn)行處理時(shí),采用內(nèi)存數(shù)據(jù)庫(kù)SQLite對(duì)其進(jìn)行存儲(chǔ),不僅減小了族譜生成過(guò)程中的網(wǎng)絡(luò)因素影響,同時(shí)有效地提升了生成系統(tǒng)的性能和穩(wěn)定性。
[1] 張卓.開(kāi)發(fā)利用族譜檔案的意義[J].云南檔案,2006(3):32-33. ZHANG Zhuo. Meaningof develop and exploit pedigree archives[J]. YunnanArchives,2006(3):32-33.
[2] FamilySeareh[EB/OL]. http://www.familysearch.org.
[3] 啟航宗譜[EB/OL]. http://www.qhzprj.com.
[4] 中根網(wǎng)[EB/OL]. http://www.zongen.com.
[5] 張文杰,彭智勇,彭煜煒.內(nèi)存數(shù)據(jù)管理技術(shù)在族譜信息系統(tǒng)中的應(yīng)用[J].華東師范大學(xué)學(xué)報(bào):自然科學(xué)版,2014(5):311-319. ZHANG Wenjie, PENG Zhiyong, PENG Yuwei. Application ofin-memory data management technologyin genealogy information system[J]. Journal of East China Normal University:Nature Science Edition, 2014(5):311-319.
[6] 姜洋,彭智勇,彭煜煒.基于圖數(shù)據(jù)庫(kù)的在線族譜編錄系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2015,35(1):125-130. JIANG Yang, PENG Zhiyong, PENG Yuwei. Online pedigree editing system based on graph database[J]. Journal of Computer Applications,2015,35(1):125-130.
[7] 彭智勇,彭煜瑋.PostgreSQL數(shù)據(jù)庫(kù)內(nèi)核分析[M].北京:機(jī)械工業(yè)出版社,2012. PENG Zhiyong, PENG Yuwei. PostgreSQL Database Kernel Analysis[M]. Beijing: China Machine Press,2012.
[8] PL/pgSQL[EB/OL]. http//www.Postgresql.org/docs/8.3/static/plpgsql.Html
[9] G Eadon,EI Chong,S Shankar et al.Supporting table partitioning by reference in oracle[C]//Acm Sigmod International Conference on Managementof Data,2008:1111-1122.
[10] 李亞龍,朱巖.表分區(qū)在分界開(kāi)關(guān)監(jiān)控系統(tǒng)數(shù)據(jù)庫(kù)的應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2016(2):235-238. LI Yalong, ZHU Yan. Application of Table Partition in Boundary Load Switch Monitoring System Database[J]. Computer Systems & Applications,2016(2):235-238.
[11] 劉玉紅,羅曉沛.表分區(qū)技術(shù)在短信增值業(yè)務(wù)中的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,17(11):72-75. LIU Yuhong, LUO Xiaopei. Study and Application of Partitioned Tables in SMS Business[J]. Computer Systems & Applications,2008,17(11):72-75.
[12] J Lv,S Xu,Y Li. Application Reasearch of Embedded Database SQLite[J].International Forum on Information Technology & Application,2009,2:539-543.
[13] 萬(wàn)瑪寧,關(guān)永,韓相軍.嵌入式數(shù)據(jù)庫(kù)典型技術(shù)SQLite和Berkeley DB的研究[J].微計(jì)算機(jī)信息,2006,22(2):91-93. WAN Maning, GUAN Yong, HAN Xiangjun. Research on Typical Technologies of embedded database-SQLite and Berkeley DB[J]. Microcomputer Information,2006,22(2):91-93.
[14] 王珊,肖艷芹,劉大為,等.內(nèi)存數(shù)據(jù)庫(kù)關(guān)鍵技術(shù)研究[J].計(jì)算機(jī)應(yīng)用,2007,27(10):2353-2357. WANG Shan, XIAO Yanqin, LIU Dawei, et al. Research of main memory database[J]. Journal of Computer Applications,2007,27(10):2353-2357.
[15] 邵璐,費(fèi)洪曉.內(nèi)存數(shù)據(jù)庫(kù)技術(shù)在移動(dòng)實(shí)時(shí)累加系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2011,20(8):169-173. SHAO Lu, FEI Hongxiao.Application of MDB Technology to Mobile Real-Time Accumulative System[J]. Journal of Computer Applications,2011,20(8):169-173.
Genealogy Generation System Optimization Based on Table Partition andMain Memory Database
XU Mingmin1PENG Zhonghua2WANG Liwei2
(1. Computer School, Wuhan University, Wuhan 430072) (2. International School of Software,Wuhan University, Wuhan 430072)
This paper proposes an optimal storage solution for the genealogy data storage system — storage solution based on the table partition. The shortage of existing data storage solution on the genealogy system is analyzed, the genealogy data is re-modeled and storaged with the help of the PostgreSQL table partition. This method improves the management and operational efficiencyof genealogy data, based on the characteristics of data processing in the existing system , inmain memory database technology is brought. Thus, using SQLite database to store data in memory can improve the efficiency ofdata processing. Experiments test the feasibility and properties of table partition and main memory database technology.It turns out that the use of table partition scheme and main memory database technology can support the storage and processing requirements and partly optimize the performance of genealogy system.
genealogy, PostgreSQL, table partition, main memory database, SQLite
2016年8月15日,
2016年9月29日
徐明民,男,碩士研究生,研究方向:數(shù)據(jù)庫(kù)原理、數(shù)據(jù)管理。彭中華,男,碩士研究生,研究方向:軟件工程。王黎維,女,博士,副教授,研究方向:數(shù)據(jù)質(zhì)量、數(shù)據(jù)溯源、科學(xué)工作流。
TP311
10.3969/j.issn.1672-9722.2017.02.015