杜海舟,石光輝,潘耀芳,秦勁松
(上海電力學(xué)院a.計算機(jī)科學(xué)與技術(shù)學(xué)院,b.教務(wù)處,上海 200090)
隨著近年來高校的迅速發(fā)展,原有的學(xué)籍管理方式和信息化系統(tǒng)已經(jīng)無法適應(yīng)當(dāng)前教學(xué)實踐的需要.上海電力學(xué)院2000年以前的學(xué)籍管理采用學(xué)年制管理,使用的是Foxpro文件型數(shù)據(jù)庫,2000年后的學(xué)籍管理采用通用的學(xué)分制管理,而FoxPro文件型數(shù)據(jù)庫用于現(xiàn)在的學(xué)籍管理系統(tǒng)存在很多問題.
對于數(shù)據(jù)庫重構(gòu)方法,國內(nèi)有人針對數(shù)據(jù)庫重構(gòu)中特定物理模型和邏輯模型,分別提出了各自的元模型,以統(tǒng)一各方法中模型的表現(xiàn)形式,并進(jìn)一步提出如何把現(xiàn)有方法的規(guī)則轉(zhuǎn)化為對查詢/視圖/轉(zhuǎn)換的描述.在該框架下,對于一個特定的數(shù)據(jù)庫而言,交叉使用現(xiàn)有重構(gòu)方法中的某幾種方法,只需要把幾種方法的規(guī)則重新組合成新的方法,最后交由特定的模型驅(qū)動框架來實現(xiàn)[1].有人利用計算機(jī)輔助軟件設(shè)計 ERwin和Sqlserver數(shù)據(jù)庫自帶的工具Osql進(jìn)行數(shù)據(jù)庫的重構(gòu)[2].也有人在剖析基本表結(jié)構(gòu)的基礎(chǔ)上,提出利用數(shù)據(jù)解析的方式建立數(shù)據(jù)庫重構(gòu)模型的設(shè)計方法,并采用PB設(shè)計實現(xiàn)了向?qū)綌?shù)據(jù)庫重構(gòu)模塊[3].筆者基于模型驅(qū)動和逆向工程開發(fā)了一個基于c/s結(jié)構(gòu)的重構(gòu)系統(tǒng),其目的就是將原有的學(xué)年制學(xué)生成績管理的文件型數(shù)據(jù)庫進(jìn)行重構(gòu),并將數(shù)據(jù)還原和加載到目前主流的Oracle關(guān)系型數(shù)據(jù)庫中.
由于原有的FoxPro數(shù)據(jù)庫系統(tǒng)開發(fā)時間較早,因而存在原有數(shù)據(jù)庫不支持多線程編程調(diào)用,存儲和讀取效率低,又缺乏相應(yīng)的開發(fā)、維護(hù),以及說明文檔等問題,因此有必要對教學(xué)管理數(shù)據(jù)庫進(jìn)行重構(gòu).
數(shù)據(jù)庫結(jié)構(gòu)重構(gòu)是指在新運(yùn)行環(huán)境下重新構(gòu)造數(shù)據(jù)庫結(jié)構(gòu),使之與開發(fā)程序時的結(jié)構(gòu)完全一致.數(shù)據(jù)庫結(jié)構(gòu)重構(gòu)是數(shù)據(jù)庫發(fā)布的中心環(huán)節(jié)[4].本文采用以下幾個步驟進(jìn)行數(shù)據(jù)庫結(jié)構(gòu)的重構(gòu):
(1)讀取FoxPro數(shù)據(jù)庫的數(shù)據(jù)文件;
(2)分析中間數(shù)據(jù)集的數(shù)據(jù);
(3)基于ERwin專業(yè)建模軟件工具重新建模;
(4)生成相應(yīng)的Oracle數(shù)據(jù)庫的Sql腳本;
(5)新的數(shù)據(jù)結(jié)構(gòu)建成后開發(fā)新的學(xué)生成績管理系統(tǒng).
由于原有的FoxPro數(shù)據(jù)庫沒有相應(yīng)的開發(fā)文檔,所以整個數(shù)據(jù)庫的結(jié)構(gòu)無法獲得,只能通過讀取原有FoxPro數(shù)據(jù)庫的數(shù)據(jù)文件后根據(jù)數(shù)據(jù)集重新進(jìn)行分析.要分析dbf數(shù)據(jù)文件,需要通過以下步驟打開相應(yīng)的數(shù)據(jù)文件:
(1)讀取文件頭信息;
(2)將字段類型轉(zhuǎn)化為系統(tǒng)數(shù)據(jù)類型;
(3)構(gòu)建Dataset類型數(shù)據(jù).
由于dbf數(shù)據(jù)文件是一張表格對應(yīng)一個文件,其分散的形式不利于數(shù)據(jù)庫的重構(gòu),而且在處理數(shù)據(jù)時還需要整合和批量讀取,但文件流操作全部在內(nèi)存進(jìn)行,所以整合和表格的重構(gòu)就不能在當(dāng)前的文件流進(jìn)行,需要增加相應(yīng)的文件流操作.增加的操作如下:
(1)采用打開文件流的方式來打開FoxPro數(shù)據(jù)庫的dbf自由表文件;
(2)讀取文件頭信息;
(3)將字段類型轉(zhuǎn)換為系統(tǒng)數(shù)據(jù)類型;
(4)獲取dbf自由表文件對應(yīng)的數(shù)據(jù)集;
(5)設(shè)置相應(yīng)的標(biāo)題及數(shù)據(jù)類型;
(6)逐條添加數(shù)據(jù).
通過這些步驟能把dbf文件在脫離FoxPro的環(huán)境下以Dataset數(shù)據(jù)結(jié)構(gòu)讀取到內(nèi)存中.其中要先分析DBF文件結(jié)構(gòu)特征.FoxPro數(shù)據(jù)庫的DBF數(shù)據(jù)文件結(jié)構(gòu)包括文件結(jié)構(gòu)說明區(qū)和數(shù)據(jù)區(qū)兩大部分.文件結(jié)構(gòu)說明區(qū)包括數(shù)據(jù)庫參數(shù)區(qū)和記錄結(jié)構(gòu)表區(qū).其中數(shù)據(jù)庫參數(shù)區(qū)占32 B,具體參數(shù)說明見表1.
表1 數(shù)據(jù)庫參數(shù)說明
同樣,數(shù)據(jù)記錄結(jié)構(gòu)表包括每個字段參數(shù),每個字段占32 B,具體說明如表2所示.
表2 記錄結(jié)構(gòu)表說明
在數(shù)據(jù)區(qū)中還通過一些特殊標(biāo)志來描述FoxPro的相應(yīng)版本信息[5],具體對應(yīng)關(guān)系見表3.
表3 FoxPro版本信息對應(yīng)
通過以上步驟,可以把相應(yīng)FoxPro數(shù)據(jù)庫的數(shù)據(jù)文件中的數(shù)據(jù)讀取到內(nèi)容中,形成中間數(shù)據(jù)集.
把中間數(shù)據(jù)集當(dāng)成內(nèi)存中的數(shù)據(jù)庫,數(shù)據(jù)集是不依賴于數(shù)據(jù)庫的獨(dú)立數(shù)據(jù)集合.數(shù)據(jù)集在內(nèi)部是用XML來描述數(shù)據(jù)的,由于XML是一種與平臺、語言無關(guān)的數(shù)據(jù)描述語言,而且可以用來描述復(fù)雜關(guān)系的數(shù)據(jù),比如父子關(guān)系的數(shù)據(jù),因此數(shù)據(jù)集實際上可以容納具有復(fù)雜關(guān)系的數(shù)據(jù),而且不再依賴于數(shù)據(jù)庫鏈路.
Dataset數(shù)據(jù)集是ADO.NET結(jié)構(gòu)的主要組件,是從數(shù)據(jù)源中檢索到的數(shù)據(jù)在內(nèi)存中的緩存.還可通過使用UniqueConstraint和ForeignKeyConstraint對象在DataSet中實現(xiàn)數(shù)據(jù)的完整性.在訪問數(shù)據(jù)表對象時,需注意它們是按條件區(qū)分大小寫的.數(shù)據(jù)集可將數(shù)據(jù)和架構(gòu)作為XML文檔進(jìn)行讀寫.數(shù)據(jù)和架構(gòu)可通過 HTTP傳輸,并在支持XML的任何平臺上讓所有的應(yīng)用程序使用.
在典型的多層實現(xiàn)中,創(chuàng)建和刷新數(shù)據(jù)集并依次更新原始數(shù)據(jù)的步驟包括:
(1)通過DataAdapter使用數(shù)據(jù)源中的數(shù)據(jù)生成和填充數(shù)據(jù)集中的每個數(shù)據(jù)表;
(2)通過添加、更新或刪除DataRow對象更改單個數(shù)據(jù)表對象中的數(shù)據(jù);
(3)調(diào)用GetChanges方法以創(chuàng)建只反映對數(shù)據(jù)進(jìn)行更改的第二個Dataset數(shù)據(jù)集;
(4)調(diào)用DataAdapter的Update方法,并將第二個數(shù)據(jù)集作為參數(shù)傳遞;
(5)調(diào)用Merge方法將第二個數(shù)據(jù)集中的更改合并到第一個中;
(6)針對數(shù)據(jù)集調(diào)用AcceptChanges,接受更改,或調(diào)用RejectChanges以取消更改.
數(shù)據(jù)集所有數(shù)據(jù)都加載在內(nèi)存上執(zhí)行,雖然可以提高數(shù)據(jù)訪問速度,極大改善程序運(yùn)行的速度和穩(wěn)定性,但由于在內(nèi)存中讀取數(shù)據(jù)集、批量轉(zhuǎn)換這些文件時會有內(nèi)存溢出等問題,因此采用直接將數(shù)據(jù)集Dataset處理并直接寫入數(shù)據(jù)庫、再調(diào)數(shù)據(jù)庫函數(shù)對數(shù)據(jù)進(jìn)行操作的方法.
經(jīng)過上面的技術(shù)分析后,可以確定該過程的開發(fā)分為以下幾個步驟:
(1)連接Oracle數(shù)據(jù)庫,取其數(shù)據(jù)源作為數(shù)據(jù)集;
(2)通過DataAdapter使用數(shù)據(jù)源中的數(shù)據(jù),生成和填充DataSet中的每個DataTable;
(3)讀取單個或多個 dbf文件,并構(gòu)建其Dataset和DataTable;
(4)輸出XML文件,或與同類型的Oracle數(shù)據(jù)庫的數(shù)據(jù)集合并;
(5)用 DataAdapter的Update方法修改返回Oracle數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)的合并;
(6)數(shù)據(jù)提交返回Oracle數(shù)據(jù)庫后,便對Oracle數(shù)據(jù)庫進(jìn)行操作.
因為在早期的FoxPro數(shù)據(jù)庫中,每門課都沒有相應(yīng)的課程編號,無法與現(xiàn)在的學(xué)生成績管理系統(tǒng)相結(jié)合,因此在重構(gòu)過程中應(yīng)先根據(jù)數(shù)據(jù)集列出所有課程名稱,然后根據(jù)入學(xué)年份+專業(yè)+學(xué)期+課程號(自增編號)的格式生成學(xué)生成績管理系統(tǒng)中作為唯一標(biāo)識列的內(nèi)部課程號.
ERwin是關(guān)系數(shù)據(jù)庫應(yīng)用開發(fā)的優(yōu)秀計算機(jī)輔助軟件設(shè)計工具,可用于建立實體關(guān)系(Entity Relation,E-R)模型,方便地構(gòu)造實體和聯(lián)系,表達(dá)實體間的各種約束關(guān)系,并根據(jù)模板創(chuàng)建相應(yīng)的存儲過程,以及包、觸發(fā)器、角色等,還可編寫相應(yīng)的擴(kuò)展屬性等.通過它不僅能得到優(yōu)化的業(yè)務(wù)功能和數(shù)據(jù)需求模型,而且可以實現(xiàn)由E-R模型向數(shù)據(jù)庫物理設(shè)計的轉(zhuǎn)換.ERwin所支持的數(shù)據(jù)庫多達(dá)20多種,是最常用的建模工具之一[6].
ERwin的設(shè)計和使用包括正向和逆向兩個過程:正向過程是用ERwin模型到數(shù)據(jù)庫物理結(jié)構(gòu)轉(zhuǎn)換來生成數(shù)據(jù)庫的表結(jié)構(gòu)以及生成建立數(shù)據(jù)庫結(jié)構(gòu)的Sql命令的過程;逆向過程是在生成Sql和建立數(shù)據(jù)模型時,建模工具根據(jù)已經(jīng)部署的物理數(shù)據(jù)模式,抽出實體和關(guān)系信息,再重新構(gòu)建數(shù)據(jù)庫結(jié)構(gòu)的過程.通過ERwin的正向過程來設(shè)計數(shù)據(jù)庫的物理結(jié)構(gòu),進(jìn)而形成開發(fā)時需要的數(shù)據(jù)字典;利用ERwin的逆向過程來實現(xiàn)系統(tǒng)數(shù)據(jù)庫結(jié)構(gòu)的重構(gòu).通過數(shù)據(jù)庫正向過程實現(xiàn)對前面的兩個表的重構(gòu)的過程[7],即:建立數(shù)據(jù)庫結(jié)構(gòu)的實體關(guān)系;生成目標(biāo)數(shù)據(jù)庫結(jié)構(gòu).
要將上面設(shè)計的數(shù)據(jù)表結(jié)構(gòu)移植到指定的目標(biāo)數(shù)據(jù)庫,需要數(shù)據(jù)庫管理系統(tǒng)和目標(biāo)數(shù)據(jù)庫的支持.通過ERwin直接與目標(biāo)數(shù)據(jù)庫相連,可以將已設(shè)計好的表結(jié)構(gòu)轉(zhuǎn)移到目標(biāo)數(shù)據(jù)庫中.
通過ERwin正向過程來進(jìn)行數(shù)據(jù)庫結(jié)構(gòu)的設(shè)計,簡化了手工建立數(shù)據(jù)庫結(jié)構(gòu)的大量工作,提高了設(shè)計效率.ERwin可以進(jìn)行逆向工程,能夠自動生成文檔,支持與數(shù)據(jù)庫同步,為目標(biāo)Ooracle數(shù)據(jù)庫生成合適的Sql命令文件[8].
通過ERwin專業(yè)重構(gòu)工具,根據(jù)教學(xué)管理系統(tǒng)的業(yè)務(wù)邏輯,創(chuàng)建E-R圖,并將E-R圖點擊生成數(shù)據(jù)字典后產(chǎn)生相應(yīng)的Oracle數(shù)據(jù)庫數(shù)據(jù)字典,其建模過程如圖1所示.
最后將基于ERwin軟件生成的數(shù)據(jù)字典自動產(chǎn)生相應(yīng)的Sql腳本語言.
圖1 ERwin工具建模過程
根據(jù)以上的開發(fā)步驟和思路,本課題利用Visual Studio2008軟件中的c#作為開發(fā)語言,成功開發(fā)了一套相應(yīng)的數(shù)據(jù)庫重構(gòu)系統(tǒng),實現(xiàn)了對原有的用于學(xué)年制學(xué)生成績管理的FoxPro文件型數(shù)據(jù)庫的重新構(gòu)建,并且將數(shù)據(jù)還原和加載到現(xiàn)有主流的Oracle關(guān)系型數(shù)據(jù)庫.數(shù)據(jù)庫的重構(gòu)如圖2所示.
圖2 數(shù)據(jù)庫重構(gòu)系統(tǒng)管理界面
圖2a是原來FoxPro數(shù)據(jù)庫中學(xué)生在大學(xué)4年的選課信息,而圖2b則是數(shù)據(jù)庫重構(gòu)后導(dǎo)入到Oracle數(shù)據(jù)庫中的選課信息.
建立學(xué)生成績管理系統(tǒng)重構(gòu)數(shù)據(jù)庫是快速有效地進(jìn)行學(xué)生學(xué)籍重構(gòu)的主要方法.在以前FoxPro文件型數(shù)據(jù)庫的基礎(chǔ)上,根據(jù)軟件的逆向工程,以及ERwin專業(yè)建模軟件工具建立了適合Oracle關(guān)系型數(shù)據(jù)庫的高校學(xué)生重構(gòu)系統(tǒng),以滿足上海電力學(xué)院教學(xué)實際的需要.同時,本文也為數(shù)據(jù)庫開發(fā)者實現(xiàn)數(shù)據(jù)庫從開發(fā)環(huán)境到應(yīng)用環(huán)境的轉(zhuǎn)變提供了一種可行的解決方案.
[1] 王函哲,沈備軍.基于模型驅(qū)動架構(gòu)的數(shù)據(jù)庫重構(gòu)[J].計算機(jī)工程,2009(24):25-37.
[2] 劉立,金甌.一種基于ERwin和Osql實現(xiàn)數(shù)據(jù)庫重構(gòu)的方法研究[J].電腦與信息技術(shù).2003(2):9-11.
[3] 戴大蒙,劉均.關(guān)系數(shù)據(jù)庫重構(gòu)模型的研究與實現(xiàn)[J]計算機(jī)工程2005(23):211-213.
[4] 鄭勁松,盧志明.在Oracle中創(chuàng)建自己的數(shù)據(jù)庫及優(yōu)化[J].計算機(jī)應(yīng)用與軟件,2002(5):16-17.
[5] 馮文雍,葉斌,陳興源,等.Visual FoxPro 5.0數(shù)據(jù)庫開發(fā)實例[M].北京:人民郵電出版社,1999:25-36.
[6] 賴尚丁,齊文春,李輝.生產(chǎn)過程重構(gòu)數(shù)據(jù)庫設(shè)計[J].航空制造工程,1997(6):16-17.
[7] 朱更明,李和軍.基于用戶數(shù)據(jù)庫系統(tǒng)表的數(shù)據(jù)字典輔助工具設(shè)計[J].計算機(jī)應(yīng)用研究,2001,18(8):128-130.
[8] 屈松.同義詞的數(shù)據(jù)庫重構(gòu)[J].科技信息,2008(13):36-38.