摘 ? 要:在軟件系統(tǒng)分析和設(shè)計過程中,圍繞軟件體系結(jié)構(gòu)這一中心,利用類圖模型和關(guān)系型數(shù)據(jù)庫關(guān)系模型之間的映射,可以加速數(shù)據(jù)庫設(shè)計。文章結(jié)合某高校智慧校園建設(shè)重點項目“科研管理系統(tǒng)數(shù)據(jù)庫設(shè)計”實例,提出了一種綜合面向?qū)ο蟮臄?shù)據(jù)庫設(shè)計方法和UML方法,是以多層軟件體系結(jié)構(gòu)為中心的數(shù)據(jù)庫設(shè)計方法。文章重點介紹了在多層軟件體系結(jié)構(gòu)框架內(nèi),類、類的方法到關(guān)系型數(shù)據(jù)庫的表、視圖、存儲過程的映射方法。
關(guān)鍵詞:軟件體系結(jié)構(gòu);關(guān)系型數(shù)據(jù)庫;映射;面向?qū)ο蠓治雠c設(shè)計;智慧校園
中圖分類號:TP311.13 文獻標志碼:B 文章編號:1673-8454(2020)05-0089-05
數(shù)據(jù)庫設(shè)計是指對于一個給定的應用環(huán)境,構(gòu)造數(shù)據(jù)邏輯模式和存儲方式,建立數(shù)據(jù)庫,使其能夠滿足各種應用對數(shù)據(jù)的需求[1]。常用的以數(shù)據(jù)為中心的方法把數(shù)據(jù)庫設(shè)計分為六個階段:①需求分析;②概念結(jié)構(gòu)設(shè)計;③邏輯結(jié)構(gòu)設(shè)計;④物理結(jié)構(gòu)設(shè)計;⑤數(shù)據(jù)庫實施;⑥數(shù)據(jù)庫運行和維護[2] 。數(shù)據(jù)庫設(shè)計方法的選擇是決定數(shù)據(jù)庫設(shè)計質(zhì)量的關(guān)鍵因素。目前,常用的數(shù)據(jù)庫設(shè)計的方法有新奧爾良方法、基于E-R模型的方法、3NF方法、面向?qū)ο蠓椒?、UML方法等[3]。這些方法對數(shù)據(jù)庫設(shè)計走向規(guī)范化、標準化起到巨大的推動作用,但隨著數(shù)據(jù)庫越來越龐大、應用越來越復雜、用戶要求越來越高,上述的方法暴露出一些局限性[4]。以軟件體系結(jié)構(gòu)為中心的數(shù)據(jù)庫方法為數(shù)據(jù)庫設(shè)計提供了新的思路。該方法綜合了面向?qū)ο髷?shù)據(jù)庫設(shè)計方法和UML方法的優(yōu)點,在面向?qū)ο蟮南到y(tǒng)分析和系統(tǒng)設(shè)計階段,突出以軟件體系結(jié)構(gòu)為中心,把類分析、類設(shè)計和數(shù)據(jù)庫設(shè)計過程結(jié)合起來,快速進行高質(zhì)量、規(guī)范化的數(shù)據(jù)庫應用系統(tǒng)開發(fā)。
一、多層軟件體系結(jié)構(gòu)
軟件體系結(jié)構(gòu)是軟件系統(tǒng)的映射,它定義了軟件系統(tǒng)的不同組成部分、它們之間的關(guān)系和交互、通信機制、以及如何修改系統(tǒng)組件、如何添加新組件等整體規(guī)則[5]。
依據(jù)層模式理論建立的多層軟件體系結(jié)構(gòu)廣泛應用于軟件系統(tǒng)的搭建。在層模式理論指導下,基于微軟ASP.NET MVC框架,可以設(shè)計出一種通用的多層軟件體系結(jié)構(gòu)。這種多層軟件體系結(jié)構(gòu)劃分為用戶接口層(User Interface Layer,UIL)、業(yè)務邏輯層(Business Logic Layer, BLL)、數(shù)據(jù)訪問層(Data Access Layer,DAL)、實體域?qū)樱‥ntity Domain Layer, EDL)和數(shù)據(jù)存儲層(Data Storage Layer,DSL),共五層(見圖1)。
這里的用戶接口層UIL主要是指用戶界面;業(yè)務邏輯層BLL實現(xiàn)數(shù)據(jù)驗證、計算、業(yè)務規(guī)則等[6];數(shù)據(jù)訪問層主要由數(shù)據(jù)庫、文件系統(tǒng)等組成,通過與數(shù)據(jù)庫交互,數(shù)據(jù)訪問層DAL實現(xiàn)對數(shù)據(jù)庫對象(表、視圖、存儲過程等)的操作;實體域?qū)覧DL集中了對同一類業(yè)務實體或概念的抽象描述系統(tǒng)的實體類[7];數(shù)據(jù)存儲層DSL用來存儲系統(tǒng)永久性對象,主要是數(shù)據(jù)庫和文件系統(tǒng)。這種多層軟件體系結(jié)構(gòu)對軟件系統(tǒng)進行邏輯層次劃分,可以將業(yè)務邏輯和業(yè)務實體分離出來,實現(xiàn)類、組件的重用。
二、以軟件體系結(jié)構(gòu)為中心的數(shù)據(jù)庫設(shè)計方法
以軟件體系結(jié)構(gòu)為中心進行數(shù)據(jù)庫設(shè)計,突出了軟件體系結(jié)構(gòu)的核心地位,改變傳統(tǒng)的以數(shù)據(jù)為中心的思想。在軟件體系結(jié)構(gòu)框架內(nèi),把類的分析和設(shè)計與數(shù)據(jù)庫設(shè)計結(jié)合起來,利用基于UML的面向?qū)ο笙到y(tǒng)分析和設(shè)計得到的類圖模型映射到關(guān)系數(shù)據(jù)庫關(guān)系模型,把類的方法映射到關(guān)系數(shù)據(jù)庫對象視圖或存儲過程。
實體域?qū)又械念惖綌?shù)據(jù)庫表的映射。實體域?qū)又械膶嶓w類映射到數(shù)據(jù)存儲層數(shù)據(jù)庫基本表。實體類的屬性映射為表的字段(列),而其中實體類的關(guān)鍵屬性映射為數(shù)據(jù)庫表的主鍵,特殊情況如關(guān)聯(lián)類轉(zhuǎn)化來的實體類由屬性組合映射為數(shù)據(jù)庫關(guān)聯(lián)表的主鍵,屬性的類型映射為數(shù)據(jù)庫中相應數(shù)據(jù)類型。數(shù)據(jù)庫表之間聯(lián)系的設(shè)計可通過實體類之間的關(guān)系映射得到[8]。
數(shù)據(jù)訪問層類的方法到數(shù)據(jù)庫視圖或存儲過程的映射。數(shù)據(jù)訪問層類的方法映射為數(shù)據(jù)庫視圖或存儲過程,并通過嵌入在方法體中的SQL語句在數(shù)據(jù)庫操作中執(zhí)行這些視圖或存儲過程。
三、高??蒲泄芾硐到y(tǒng)數(shù)據(jù)庫設(shè)計應用
山東某高校是一所具有行業(yè)特色的綜合性普通高等院校。應智慧校園建設(shè)工作需要,該校急需開發(fā)一套服務于科研管理人員、研究人員和高層領(lǐng)導的可進行項目、成果、科研機構(gòu)和人員、科研考核、科研信息統(tǒng)計分析、科研資源共享的高質(zhì)量的科研管理應用軟件。
高??蒲泄芾硐到y(tǒng)的開發(fā)包括Web應用開發(fā)和數(shù)據(jù)庫設(shè)計兩部分。該科研管理軟件總體架構(gòu)采用了.Net框架下基于MVC設(shè)計模式的多層軟件體系結(jié)構(gòu)。數(shù)據(jù)存儲選擇利用Microsoft SQL Server 2008 企業(yè)版數(shù)據(jù)庫系統(tǒng)存儲和處理業(yè)務數(shù)據(jù)加文件系統(tǒng)的混合模式方案。在系統(tǒng)開發(fā)過程中,考慮到開發(fā)質(zhì)量和效率,數(shù)據(jù)庫的設(shè)計方法采用了前邊介紹的以多層軟件體系結(jié)構(gòu)為中心的數(shù)據(jù)庫設(shè)計方法。
1.高??蒲泄芾硐到y(tǒng)實體類圖
分布于實體域?qū)拥膶嶓w類主要由業(yè)務實體類以及這些業(yè)務實體類之間的關(guān)系轉(zhuǎn)化來的關(guān)聯(lián)類組成。實體域包中的類主要來自系統(tǒng)分析階段識別的實體分析類及參與者的映射,包括部門類Department、教師(科研人員)類Teacher、學術(shù)會議類AcademicMeeting 、學術(shù)報告類Lecture、論文類Paper、著作類Book、專利類Patent、成果獲獎類Award、縱向項目類VerticalProject、橫向課題HorizontalProject、校級項目類InternalProject、項目審核類ProjectAudit、項目中檢類ProjectMiddleCheck、項目結(jié)題類ProjectComplete、項目費用類ProjectCost、角色類Actor、用戶類SRUser等。圖2為高??蒲泄芾硐到y(tǒng)的主要實體類之間關(guān)系的類圖。
2.從類圖模型到關(guān)系數(shù)據(jù)庫數(shù)據(jù)模型的映射
實體域?qū)覦omain包中的類到關(guān)系數(shù)據(jù)庫表的映射和數(shù)據(jù)訪問層包中數(shù)據(jù)訪問邏輯類的方法到數(shù)據(jù)庫視圖或存儲過程的映射是從類圖模型到關(guān)系數(shù)據(jù)庫數(shù)據(jù)模型的映射的主要內(nèi)容。
(1)實體域?qū)又械念惖疥P(guān)系數(shù)據(jù)庫表的映射
由于對象模型側(cè)重于使用包含數(shù)據(jù)和行為的對象來構(gòu)建應用程序,而關(guān)系模型則主要針對于數(shù)據(jù)的存儲[9],因此根據(jù)實體類的特點和類之間的關(guān)系,從實體類到數(shù)據(jù)庫表的映射分為實體類直接到關(guān)系數(shù)據(jù)庫數(shù)據(jù)表映射、存在繼承關(guān)系的類到關(guān)系數(shù)據(jù)庫數(shù)據(jù)表的映射和存在關(guān)聯(lián)關(guān)系的類到關(guān)系數(shù)據(jù)庫數(shù)據(jù)表的映射三種情形。
①實體類直接到關(guān)系數(shù)據(jù)庫數(shù)據(jù)表映射。圖3表示實體域?qū)覦omain包中的成果獲獎類Award類模型到成果獲獎表Award模型映射關(guān)系圖。成果獲獎類Award中的屬性分別映射為成果獲獎表Award的字段(列),屬性的類型映射為數(shù)據(jù)庫中相應的數(shù)據(jù)類型;成果獲獎類 Award的關(guān)鍵屬性即標識符映射為AwardSn映射為成果獲獎表Award的主鍵AwardSn。實體域?qū)拥膶W術(shù)會議類AcademicMeeting、學術(shù)報告類Lecture、項目審核類ProjectAudit、項目中檢類ProjectMiddleCheck、項目結(jié)題類ProjectComplete、項目費用類ProjectCost等也直接映射為數(shù)據(jù)庫的表。
②存在繼承關(guān)系的類到關(guān)系數(shù)據(jù)庫數(shù)據(jù)表的映射。項目類Project有三個子類,分別為縱向項目VerticalProject、橫向項目HorizontalProject和校級項目InternalProject,如圖4所示繼承關(guān)系類圖。這四個類中Project只是作為抽象父類存在,因此只需映射它的子類到數(shù)據(jù)庫基本表。存在此類繼承關(guān)系的還有作品類Works和其子類論文類Paper、著作類Book、專利類Patent等,映射方法同項目類Project。
③存在關(guān)聯(lián)關(guān)系的類到關(guān)系數(shù)據(jù)庫數(shù)據(jù)表的映射??蒲泄芾韱T、科研秘書、教師(科研人員)、校領(lǐng)導用戶類、系統(tǒng)管理員等,這些業(yè)務角色可以抽象為角色類Actor和科研管理系統(tǒng)用戶類SRUser。角色類Actor和科研管理系統(tǒng)用戶類SRUser之間存在1對多的關(guān)聯(lián)關(guān)系,它們分別映射為數(shù)據(jù)庫表角色表Actor和科研管理系統(tǒng)用戶表SRUser(見圖5)。
存在關(guān)聯(lián)關(guān)系的學院部門類Department和教師(科研人員)類Teacher等,它們轉(zhuǎn)化為科研管理數(shù)據(jù)庫表學院部門表Department和教師(科研人員)表Teacher等。
在完成關(guān)系數(shù)據(jù)庫表設(shè)計基礎(chǔ)上,可以得到數(shù)據(jù)庫邏輯設(shè)計過程中的數(shù)據(jù)庫表關(guān)系圖(見圖6)。
通過以上過程得到的關(guān)系型數(shù)據(jù)庫表模型和表關(guān)系圖,結(jié)合選定的SQL Server數(shù)據(jù)庫管理系統(tǒng),可以快速創(chuàng)建出數(shù)據(jù)庫表。如根據(jù)成果獲獎表Award模型得到的成果獲獎表Award(見表1)。
(2)數(shù)據(jù)訪問層類的方法到關(guān)系數(shù)據(jù)庫視圖或存儲過程的映射
高??蒲泄芾硐到y(tǒng)的數(shù)據(jù)庫視圖和存儲過程由數(shù)據(jù)訪問層類的方法映射而來。數(shù)據(jù)訪問層中的類包括部門訪問類DepartmentDA、教師(科研人員)訪問TeacherDA、學術(shù)會議訪問類AcademicMeetingDA、報告訪問類LectureDA、論文訪問類PaperDA、著作訪問類BookDA、專利訪問類PatentDA、成果獲獎訪問類AwardDA、縱向項目訪問類VerticalProjectDA、橫向課題訪問類HorizontalProjectDA、橫向課題合同訪問類HorizontalProjectContractDA、校級項目訪問類InternalProjectDA、項目審核訪問類ProjectAuditDA、項目中檢訪問類ProjectMiddleCheDA、項目結(jié)題訪問類ProjectCompleteDA、項目經(jīng)費訪問類ProjectCostDA、角色訪問類ActorDA、用戶訪問類SRUserDA等。
①數(shù)據(jù)訪問層類的方法到關(guān)系數(shù)據(jù)庫視圖的映射。數(shù)據(jù)訪問層的數(shù)據(jù)訪問邏輯類的方法如果返回值為數(shù)據(jù)集、字符串等數(shù)據(jù)類型的結(jié)果,可以映射到數(shù)據(jù)庫視圖。如數(shù)據(jù)訪問層的論文訪問類PaperDA,它的一個獲取成果獲獎列表方法GetPaperList():
public DataSet GetPaperList(string c) {
StringBuilder sb = new StringBuilder();
sb.Append("SELECT ?* ");
sb.Append(" FROM V_Paper ");
if (c.Trim() != ""){ sb.Append(" WHERE " + c);}
return DatabaseAccess.Query(sb.ToString());
}
映射為關(guān)系數(shù)據(jù)庫的視圖V_Paper:
CREATE VIEW ?V_Paper
AS
SELECT ?* ?FROM ?Paper
根據(jù)系統(tǒng)業(yè)務邏輯功能,在設(shè)計數(shù)據(jù)訪問層類的類的方法時,可以映射出關(guān)系數(shù)據(jù)庫的單個表或多個表關(guān)聯(lián)查詢形成的多個視圖。
②數(shù)據(jù)訪問層類的方法到關(guān)系數(shù)據(jù)庫存儲過程的映射。數(shù)據(jù)訪問層的數(shù)據(jù)訪問邏輯類的方法如果通過其執(zhí)行插入記錄、更新記錄、刪除記錄等對數(shù)據(jù)庫操作,這些方法可以映射到關(guān)系數(shù)據(jù)庫存儲過程。如數(shù)據(jù)訪問層縱向項目數(shù)據(jù)訪問類VerticalProjectDA的更新狀態(tài)的方法UpdateVerticalProjectStatus():
public int UpdateVerticalProjectStatus(VerticalProject vp) {
SqlParameter[] parametersVerticalProject = {
new SqlParameter("@VerticalProjectSn", SqlDbType.Int,4),
new SqlParameter("@VerticalProjectStatus", SqlDbType.Int,4)};
parameters[0].Value = vp. VerticalProjectSn;
parameters[1].Value = vp. VerticalProjectStatus
try{
int ?result = new DatabaseAccess().UpdateProcedure("P_Update_VerticalProject_Status", parametersVerticalProject);}catch (Exception e){ throw new Exception(e.Message); }
return ?result;
}
對應數(shù)據(jù)庫中的存儲過程p_upate_VerticalProject_Status:
CREATE PROCEDURE p_update_VerticalProject_Status
(@VerticalProjectSn_1 int,@VerticalProjectStatus_2 tinyInt )
AS
BEGIN
UPDATE VerticalProject SET VerticalProjectStatus=@VerticalProjectStatus_2
WHERE VerticalProjectSn=@ VerticalProjectSn_1
END
四、結(jié)束語
以軟件體系結(jié)構(gòu)為中心的數(shù)據(jù)庫設(shè)計方法綜合了面向?qū)ο蟮臄?shù)據(jù)庫設(shè)計方法和UML方法,在多層軟件體系結(jié)構(gòu)框架內(nèi),以清晰的邏輯劃分,把位于實體域?qū)拥膶嶓w類等映射為數(shù)據(jù)存儲層的關(guān)系數(shù)據(jù)庫表、把數(shù)據(jù)訪問層包中數(shù)據(jù)訪問邏輯類的方法映射為數(shù)據(jù)存儲層的數(shù)關(guān)系據(jù)庫視圖或存儲過程進行數(shù)據(jù)庫設(shè)計。以軟件體系結(jié)構(gòu)為中心的數(shù)據(jù)庫設(shè)計方法是面向?qū)ο蟮臄?shù)據(jù)庫設(shè)計的改進。這種方法實現(xiàn)了面向?qū)ο蟮念悎D模型到關(guān)系型數(shù)據(jù)庫關(guān)系模型的映射,保證了設(shè)計的連續(xù)性和完整性,提高了數(shù)據(jù)庫設(shè)計質(zhì)量。相比傳統(tǒng)的以數(shù)據(jù)為中心的設(shè)計方法進行數(shù)據(jù)庫設(shè)計需要6個階段,以軟件體系結(jié)構(gòu)為中心的方法將數(shù)據(jù)庫設(shè)計階段融入軟件系統(tǒng)的分析和設(shè)計過程,簡化了數(shù)據(jù)庫設(shè)計流程,節(jié)省了開發(fā)時間,有利于提高軟件開發(fā)的效率。當然,這種數(shù)據(jù)庫設(shè)計方法在一定程度上減少了軟件系統(tǒng)和數(shù)據(jù)庫系統(tǒng)各自的內(nèi)聚性,如果業(yè)務邏輯發(fā)生改變,數(shù)據(jù)庫系統(tǒng)也需要改變,將增加系統(tǒng)維護難度,對軟件設(shè)計人員提出了更高的技術(shù)要求。
參考文獻:
[1]趙相偉,張中喜,王殷行.小型信息系統(tǒng)開發(fā)的關(guān)鍵技術(shù)探討[J].山東科技大學學報(自然科學版),2006,25(1):67-69.
[2]李運華,張吉禮.大型公共建筑運行能耗數(shù)據(jù)庫管理系統(tǒng)初步開發(fā)及應用[J].建筑科學,2007,23(10):62-66.
[3]王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論(第5版)[M].北京:高等教育出版社,2018.
[4]陳新安,鮮波,張繼棠.面向?qū)ο蟮姆治觯∣OA)方法在數(shù)據(jù)庫系統(tǒng)設(shè)計中的應用[J].計算機工程與應用,2000(5):124-125.
[5]袁曉曦.軟件體系結(jié)構(gòu)UML建模[J].科技傳播,2010(24):230-231.
[6]周實庫.風電用螺栓熱處理工藝設(shè)計系統(tǒng)的設(shè)計與實現(xiàn)[D].上海:上海交通大學,2014.
[7]馮小潔,Rational統(tǒng)一過程支持的中小型軟件項目開發(fā)[J].青島職業(yè)技術(shù)學院學報,2017,30(1):77-81.
[8]張莉.數(shù)據(jù)庫技術(shù)在教務管理系統(tǒng)中應用研究[J].裝備制造技術(shù),2011(7):85-86.
[9]賈曉輝,夏敏捷,趙巧萍等.UML類模式在數(shù)據(jù)庫中的應用[J].計算機應用與軟件,2007,24(7):77-78.
(編輯:王曉明)