羅尹奇,湯偉,許毅
(電子科技大學(xué) 圖書館,四川 成都 611730)
在“新冠疫情”常態(tài)化的背景下,線上教育逐漸成為重要的教學(xué)手段并得到廣泛應(yīng)用[1-2]。高校同樣也存在建設(shè)在線課程資源平臺的內(nèi)在需求。
一方面,高校圖書館數(shù)字資源一般由各數(shù)字資源廠商提供,存在扁平化、分散化的特點(diǎn),數(shù)字資源與課程設(shè)置無關(guān)聯(lián),用戶需通過特定的檢索系統(tǒng)查詢,才能得到該課程的教材教參信息。因此在線課程資源平臺需實(shí)現(xiàn)基于課程信息的資源導(dǎo)航功能,以滿足用戶端的易用性需求。
另一方面,雖然通過EXCEL列表可有效的表示課程與其教材教參之間的關(guān)系[3],但在平臺的運(yùn)維上,不同的學(xué)期具有不同的課程,同一門課程可能擁有不同的教材教參,而同一本教材教參又有可能分屬于不同的課程。因此在線課程資源平臺需能靈活的對課程與數(shù)字資源分別維護(hù),同時也能對兩者之間的關(guān)聯(lián)關(guān)系進(jìn)行調(diào)整,以滿足管理員端的可維護(hù)性需求。
本文以電子科技大學(xué)在線課程資源平臺二期系統(tǒng)為例,分析了其底層數(shù)據(jù)庫設(shè)計方案,論證了該方案能夠同時滿足用戶的使用需求與管理員的維護(hù)需求,并最后給出了基于Hibernate框架的對象關(guān)系映射的關(guān)鍵代碼實(shí)現(xiàn)。
實(shí)體-關(guān)系模型(Entity-Relationship Model)是一種面向用戶的數(shù)據(jù)建模方法,是概念數(shù)據(jù)模型的高層描述所使用的抽象表示或模式圖,其本身與具體的數(shù)據(jù)庫管理軟件無關(guān),在數(shù)據(jù)庫設(shè)計中被廣泛用作數(shù)據(jù)建模的工具[4-5]。
實(shí)體-關(guān)系模型基于應(yīng)用場景,主要由實(shí)體、屬性和關(guān)系組成。其中實(shí)體是系統(tǒng)中客觀存在的事物,具有相同性質(zhì)(或?qū)傩裕┑膶?shí)體集合構(gòu)成了實(shí)體集。屬性是實(shí)體集中每個成員所擁有的描述性性質(zhì)。關(guān)系則是用于描述多個實(shí)體之間的關(guān)聯(lián)方式。實(shí)體-關(guān)系模型建模的目的在于從抽象概念層面上,構(gòu)建在線課程資源平臺的數(shù)據(jù)模型,其建模的基本步驟如下:
(1)識別并提取有效的實(shí)體。實(shí)體必須是客觀存在并可以區(qū)分的,在在線課程資源平臺應(yīng)用場景中,有效的實(shí)體包括了學(xué)院、課程、數(shù)字資源。由于平臺是開放式的,對于用戶的類型并不做嚴(yán)格的區(qū)分,因此諸如授課教師、學(xué)生等實(shí)體在該場景中屬于無效實(shí)體。
(2)提取實(shí)體的關(guān)鍵屬性。實(shí)體本身的屬性可能是非常多的,需提取符合應(yīng)用場景要求的關(guān)鍵屬性,而忽略非必要的次要屬性。例如課程名稱是課程實(shí)體的關(guān)鍵屬性,而選課人數(shù)則屬于次要屬性。
(3)分析實(shí)體與實(shí)體之間的關(guān)系。實(shí)體之間的關(guān)系分3種類型:一對一的關(guān)系、一對多的關(guān)系、多對多的關(guān)系。學(xué)院與課程之間屬于一對多的關(guān)系,即一個學(xué)院會開設(shè)多門課程;課程與數(shù)字資源之間屬于多對多的關(guān)系,即一門課程會擁有多本教材教參,而同一本教材教參又有可能被多門課程使用。
根據(jù)上述的建模步驟,得到實(shí)體-關(guān)系模型的圖形表示,其中實(shí)體用矩形表示,關(guān)系用菱形表示,屬性用橢圓表示,如圖1所示:
根據(jù)圖1實(shí)體-關(guān)系模型,現(xiàn)將其轉(zhuǎn)化為對應(yīng)的數(shù)據(jù)庫模型。在轉(zhuǎn)化過程中實(shí)體(實(shí)體集)多數(shù)情況下會采用數(shù)據(jù)庫表來表示;而屬性則一般會轉(zhuǎn)化為數(shù)據(jù)庫表中的字段,其類型由實(shí)際應(yīng)用場景決定。特別需要注意的是,實(shí)體-關(guān)系模型中的關(guān)系在轉(zhuǎn)化時,依照關(guān)系類型的不同,決定了其在數(shù)據(jù)庫中的表現(xiàn)形式:
(1)一對一的關(guān)系:當(dāng)實(shí)體-關(guān)系模型中存在一對一關(guān)系時,其在數(shù)據(jù)庫中會表示為兩表之間的主鍵約束,即A表的主鍵是B表的主鍵,同時也是B表的外鍵,如圖2所示:
圖2 一對一的關(guān)系
(2)一對多的關(guān)系:當(dāng)實(shí)體-關(guān)系模型中存在一對多的關(guān)系時,其在數(shù)據(jù)庫中會表示為兩表之間的外鍵約束,即A表的主鍵是B表的外鍵,如圖3所示:
圖3 一對多的關(guān)系
(3)多對多的關(guān)系:當(dāng)實(shí)體-關(guān)系模型中存在多對多的關(guān)系時,此時在數(shù)據(jù)庫中關(guān)系會作為單獨(dú)的一張表建立,其作用在于通過復(fù)合主鍵的形式來描述多對多的關(guān)系。由于復(fù)合主鍵是通過多個主鍵的排列組合來保證唯一性,因此復(fù)合主鍵的排列組合過程實(shí)現(xiàn)了多對多關(guān)系,而唯一性則保證了這種關(guān)系是確定的,如圖4所示:
圖4 多對多的關(guān)系
(4)帶屬性的多對多的關(guān)系:作為特殊的多對多的關(guān)系,其關(guān)系中存在其他屬性,此時該表的結(jié)構(gòu)與一般的關(guān)系表結(jié)構(gòu)所有差異,該表主鍵只是自增鍵或隨機(jī)字符串,而關(guān)聯(lián)實(shí)體的主鍵會作為該表的外鍵,同時該表中還包含了其他屬性字段,如圖5所示:
圖5 帶屬性的多對多的關(guān)系
基于上述實(shí)體-關(guān)系模型到數(shù)據(jù)庫表的轉(zhuǎn)化規(guī)則,現(xiàn)將圖1轉(zhuǎn)化為數(shù)據(jù)庫表,得到的結(jié)果如圖6所示:
圖6 數(shù)據(jù)庫模型
根據(jù)圖6的數(shù)據(jù)庫模型,現(xiàn)將各表數(shù)據(jù)詞典列出,如表1至表4所示:
表1 學(xué)院t_institute表
表2 課程t_course表
表3 數(shù)字資源t_resource表
需要注意的是,在表4中l(wèi)ink_type字段描述了課程-資源關(guān)系類型。一門課程中可能有多本教材以及參考資料,而數(shù)字資源本身是無法區(qū)分其是否為教材還是參考資料的,也就是同一個數(shù)字資源可能在這一門課程里是作為教材,而在另外的課程中則可能是參考資料,因此通過在課程-資源關(guān)系表中加入link_type字段來加以區(qū)分。
從用戶角度來看,數(shù)據(jù)庫設(shè)計方案滿足了用戶的一般使用行為。由于該平臺用戶多為在校師生,其關(guān)注的往往是本學(xué)院所開設(shè)的課程及相關(guān)數(shù)字資源,因此用戶可以根據(jù)學(xué)院表進(jìn)行導(dǎo)航。課程表中的學(xué)院序號字段則提供了查詢條件,平臺顯示對應(yīng)學(xué)院下所開設(shè)的所有課程,這樣有助于用戶找到本學(xué)期或以往的課程。利用課程編號以及課程-資源關(guān)系表,可以進(jìn)一步查詢出該課程下所關(guān)聯(lián)的數(shù)字資源以及該資源是否為教材或參考資料。整個訪問過程將課程與對應(yīng)的數(shù)字資源以樹狀結(jié)構(gòu)展示出來,滿足了用戶數(shù)據(jù)上鉆下探的需求。
從管理員角度來看,數(shù)據(jù)庫設(shè)計方案滿足了簡化運(yùn)維的需求。課程與數(shù)字資源是相對獨(dú)立的兩張表,在運(yùn)維過程中可以分開管理,課程可以與學(xué)校教務(wù)系統(tǒng)保持一致,數(shù)字資源則可以與第三方廠商保持一致,兩者信息更新可以是異步的,相互之間不會發(fā)生干擾。管理員僅需維護(hù)課程-資源關(guān)系表,即在平臺上選擇相關(guān)資源并關(guān)聯(lián)(或解除關(guān)聯(lián))到對應(yīng)的課程上。整個運(yùn)維過程簡化為對課程-資源關(guān)聯(lián)關(guān)系的運(yùn)維,而課程與數(shù)字資源本身的信息則可以與其他系統(tǒng)自動化同步。
對象關(guān)系映射(Object Relational Mapping,ORM)是一種程序設(shè)計技術(shù),用于將面向?qū)ο缶幊陶Z言里的對象,與關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換[6]。由于面向?qū)ο笫菑能浖こ痰幕A(chǔ)上發(fā)展起來的,而關(guān)系數(shù)據(jù)庫則是從數(shù)學(xué)理論發(fā)展而來的[7],兩套理論存在顯著的區(qū)別,存在范式不匹配的現(xiàn)象,因此ORM技術(shù)主要實(shí)現(xiàn)了在關(guān)系型數(shù)據(jù)庫和程序?qū)ο笾g作數(shù)據(jù)映射,以屏蔽底層復(fù)雜的SQL操作。
Hibernate框架是一種基于Java語言的ORM技術(shù)實(shí)例,通過Hibernate框架可以實(shí)現(xiàn)Java對象與數(shù)據(jù)庫表間數(shù)據(jù)相互轉(zhuǎn)化。本文采用的Hibernate版本為4.1.7,開發(fā)模式為基于XML配置文件。
由于學(xué)院表主要做導(dǎo)航功能,因此對于學(xué)院表僅做最基本的映射,直接將其Java代碼與數(shù)據(jù)庫字段進(jìn)行對應(yīng)。結(jié)果如表5與表6所示:
表5 學(xué)院對象關(guān)鍵代碼
表6 學(xué)院表映射關(guān)鍵代碼
在實(shí)際應(yīng)用場景中,由于課程對象一方面需要能夠?qū)崿F(xiàn)上鉆,獲取其所開設(shè)的學(xué)院;另一方面又要能實(shí)現(xiàn)下探,得到該課程下的教材與參考資料。因此課程對象中需要同時包含對學(xué)院和數(shù)字資源的引用。但事實(shí)上需要注意的是,由于課程-資源關(guān)系表中附帶了區(qū)分教材教參的字段,若課程對象直接對數(shù)字資源引用則無法在程序邏輯上實(shí)現(xiàn)區(qū)分教材教參,故此時的課程對象不直接對數(shù)字資源引用,而是轉(zhuǎn)化為對課程-資源關(guān)系的引用,進(jìn)而完成間接引用數(shù)字資源。其結(jié)果如表7與表8所示:
表7 課程對象關(guān)鍵代碼
表8 課程表映射關(guān)鍵代碼
與課程表的映射過程類似,資源對象同樣不直接引用課程,而是對課程-資源關(guān)系表引用,這樣才能區(qū)分該資源在課程中的類型是否為教材。映射結(jié)果如表9與表10所示:
表9 資源對象關(guān)鍵代碼
表10 資源表映射關(guān)鍵代碼
需要注意的是,資源的ID采用了UUID生成策略,這是因?yàn)橐环矫?,?shù)字資源的來源可能是多家第三方廠商,平臺需要進(jìn)行統(tǒng)一編號;另一方面,資源名、ISBN編號等信息不足以對資源加以區(qū)分,特別是針對同一本書籍可能有多個第三方廠商提供網(wǎng)址訪問,故而使用UUID來作為資源的特定編號。
在實(shí)際應(yīng)用場景下,由于需要統(tǒng)計平臺的教材與教參數(shù)量,因此需要對課程-資源關(guān)系表進(jìn)行映射,結(jié)果如表11與表12所示:
表11 課程-資源關(guān)系對象關(guān)鍵代碼
表12 課程-資源關(guān)系表映射關(guān)鍵代碼
綜上所述,本文以電子科技大學(xué)在線課程資源平臺二期系統(tǒng)為例,分析了基于實(shí)體-關(guān)系模型的數(shù)據(jù)建模技術(shù),構(gòu)建了平臺的實(shí)體-關(guān)系模型;然后提出了將實(shí)體-關(guān)系模型轉(zhuǎn)化為數(shù)據(jù)庫表的方法,基于該方法建立了數(shù)據(jù)庫模型并描述了其數(shù)據(jù)詞典;最后本文基于Java編程語言中的Hibernate框架,提供了數(shù)據(jù)庫表與程序?qū)ο笥成涞年P(guān)鍵代碼。
基于上述方法,本文展示了數(shù)據(jù)建模到數(shù)據(jù)庫建立,再到程序代碼映射的一般開發(fā)過程,特別是將實(shí)體-關(guān)系模型轉(zhuǎn)化為數(shù)據(jù)庫表的方法對于其他資源平臺的建設(shè)具有一定的借鑒意義。