, , , ,
(1.貴州省煙草科學(xué)研究院,貴陽 550081; 2.中國地質(zhì)大學(xué) 自動(dòng)化學(xué)院,武漢 430074)
需求分析一直以來都是軟件工程項(xiàng)目的重點(diǎn)和難點(diǎn)環(huán)節(jié),如何做好用戶需求分析,從而盡可能的避免應(yīng)用系統(tǒng)投運(yùn)后再返回修改功能需求,是工業(yè)界和學(xué)術(shù)界關(guān)注的重要問題。當(dāng)前,Internet技術(shù)的發(fā)展,使得基于Web的數(shù)據(jù)庫應(yīng)用項(xiàng)目數(shù)量激增,且遍布社會(huì)生活的各行各業(yè),這使得在進(jìn)行項(xiàng)目需求分析時(shí),用戶類別更加廣泛,用戶需求和數(shù)據(jù)類型則更加多樣和易變,因此,提高數(shù)據(jù)庫應(yīng)用系統(tǒng)的用戶適應(yīng)性,進(jìn)而減少用戶需求變化對(duì)軟件工程項(xiàng)目的不良影響,具有重要的研究意義和實(shí)際應(yīng)用價(jià)值[1],在國內(nèi)外都得到了廣泛研究。
對(duì)于用戶多變的數(shù)據(jù)需求或未知的數(shù)據(jù)結(jié)構(gòu),常見的處理方法有以下幾類:第一類是把未知的數(shù)據(jù)結(jié)構(gòu)保存為xml格式文件的形式[2-4];第二類是用鍵-值映射關(guān)系來實(shí)現(xiàn)靜態(tài)數(shù)據(jù)庫的列-屬性映射關(guān)系[5-6];第三類是采用靜態(tài)表結(jié)構(gòu)描述動(dòng)態(tài)表結(jié)構(gòu)[7-8];第四類是SaaS(Software as a service, 軟件即服務(wù))模式下多租戶技術(shù)[9-12]中的共享關(guān)系表方法[13]。前兩類方法都存在編碼量大、存取效率低、數(shù)據(jù)不易管理等缺點(diǎn),第三類方法是比較高效的方法[14],但是邏輯處理比較復(fù)雜,難以應(yīng)用于大型關(guān)系模式;第四類方法只能在一定范圍內(nèi)滿足有同類數(shù)據(jù)需求的用戶自適應(yīng)性,無法滿足大多數(shù)用戶的數(shù)據(jù)需求,局限性較大。
本文結(jié)合實(shí)際工程項(xiàng)目中所出現(xiàn)的:非信息專業(yè)用戶數(shù)據(jù)庫知識(shí)欠缺,同時(shí)又希望能夠自定義和管理自身數(shù)據(jù),從而造成用戶需求難以在需求分析階段完全確定等問題,將上述第三類和第四類方法相結(jié)合,使用主、從兩個(gè)相關(guān)聯(lián)的靜態(tài)關(guān)系表來描述動(dòng)態(tài)表結(jié)構(gòu),主表用于存儲(chǔ)用戶自定義虛擬關(guān)系表信息;使用多租戶技術(shù)實(shí)現(xiàn)從表的數(shù)據(jù)共享功能,用于存儲(chǔ)所有用戶自定義數(shù)據(jù)。給出了一個(gè)實(shí)際的工程用例,運(yùn)行結(jié)果表明,利用該關(guān)系模型設(shè)計(jì)數(shù)據(jù)庫,用戶可以通過瀏覽器自定義并且管理虛擬關(guān)系表,從而有效提高數(shù)據(jù)庫應(yīng)用系統(tǒng)對(duì)用戶需求變化的適應(yīng)性,同時(shí)改善Web站點(diǎn)的性能。
多租戶技術(shù)中的共享關(guān)系表可以滿足所有同類租戶的數(shù)據(jù)需求。在沒有單獨(dú)為每個(gè)租戶建立獨(dú)立關(guān)系表的情況下,通過一張共享關(guān)系表來存儲(chǔ)所有同類租戶數(shù)據(jù),以租戶ID來隔離不同租戶之間的數(shù)據(jù),同時(shí)每個(gè)租戶擁有自己獨(dú)立的關(guān)系表,但這些獨(dú)立關(guān)系表在數(shù)據(jù)庫中并不是物理存在的,而是一種虛擬或邏輯關(guān)系表。所有虛擬關(guān)系表實(shí)際上共用了共享關(guān)系表的關(guān)系模型,因此不需要再為每個(gè)虛擬關(guān)系表建立獨(dú)立的關(guān)系模型。
本文利用了該方法通過通用關(guān)系模型,在不新建數(shù)據(jù)庫關(guān)系表的情況下可以擁有任意多個(gè)虛擬關(guān)系表的特點(diǎn),采用靜態(tài)表結(jié)構(gòu)表現(xiàn)動(dòng)態(tài)表結(jié)構(gòu)設(shè)的思想計(jì)出一種基于Web的用戶自適應(yīng)關(guān)系模型,如圖1所示。
圖1 自適應(yīng)關(guān)系模型的數(shù)據(jù)庫關(guān)系表
該關(guān)系模型分為兩部分,主關(guān)系模型和從關(guān)系模型,分別對(duì)應(yīng)數(shù)據(jù)庫中主、從兩種靜態(tài)關(guān)系表。主表用于存儲(chǔ)用戶自定義關(guān)系表的表名、字段名以及該表在從表中所使用的起止字段等結(jié)構(gòu)信息;從表類似于多租戶技術(shù)中的共享關(guān)系表,用于存儲(chǔ)用戶自定義數(shù)據(jù),插入的記錄通過表名來隔離、區(qū)分。主表中一條記錄映射到用戶新建虛擬關(guān)系表的結(jié)構(gòu)信息,因此可對(duì)應(yīng)從表中同一表名的多條記錄。
當(dāng)用戶通過瀏覽器網(wǎng)頁新建數(shù)據(jù)庫關(guān)系表時(shí),新建虛擬關(guān)系表的結(jié)構(gòu)信息存儲(chǔ)在主表中,當(dāng)用戶需要管理自定義虛擬關(guān)系表的數(shù)據(jù)時(shí),后臺(tái)邏輯就先通過主表查詢到該虛擬關(guān)系表的結(jié)構(gòu)信息,比如該表的字段名、該表在從表中所使用的起止字段等等,然后根據(jù)查詢到的虛擬關(guān)系表結(jié)構(gòu)信息來對(duì)從表進(jìn)行相應(yīng)操作。
圖2 自適應(yīng)關(guān)系模型ER圖
用戶建立的所有虛擬關(guān)系表結(jié)構(gòu)信息都存儲(chǔ)在主表中,表名不允許重復(fù),故設(shè)置表名tableName為主鍵,主表中還有如下幾個(gè)字段:startColumn、endColumn、columnName。 startColumn字段表示該虛擬關(guān)系表的記錄在從表中是從第幾個(gè)字段開始,endColumn字段表示該虛擬關(guān)系表的記錄在從表中到第幾個(gè)字段結(jié)束,columnName字段表示該虛擬關(guān)系表的字段名,把用戶新建的虛擬關(guān)系表的所有字段名用特殊符號(hào)“|”隔開,連接成字符串存儲(chǔ)在columnName這個(gè)字段。主表的數(shù)據(jù)字典如表1所示。
表1 主表TableInfor數(shù)據(jù)字典
從表設(shè)置一個(gè)int類型自增主鍵id,用來表示每條記錄的編號(hào)。由于從表中的記錄通過表名來區(qū)分該條記錄屬于哪個(gè)虛擬關(guān)系表,用戶只有在新建了虛擬關(guān)系表之后才能向新建的虛擬關(guān)系表中插入數(shù)據(jù),因此設(shè)置主表的主鍵tableName為從表的外鍵,這樣能夠保證所有出現(xiàn)在從表中的記錄的表名都能夠在主表中找到。由于無法預(yù)知用戶新建的虛擬關(guān)系表的字段數(shù),所以從表的字段數(shù)應(yīng)盡量大,這樣才能夠滿足所有用戶的需求。從表的其他字段就用來存儲(chǔ)用戶插入到虛擬表中的記錄,其他字段的命名方式按照字段編號(hào)來命名,考慮到Java語言中一個(gè)對(duì)象最多只能擁有255個(gè)屬性,這里我們把其他字段分別命名為column1、column2 … column250。從表的數(shù)據(jù)字典如表2。
表2 從表TableData 數(shù)據(jù)字典
本方法中虛擬關(guān)系表實(shí)際上并不是真正的在數(shù)據(jù)庫中去創(chuàng)建新關(guān)系表,而是通過數(shù)據(jù)庫中已經(jīng)存在的一個(gè)主表TableInfor來存儲(chǔ)用戶自定義關(guān)系表的結(jié)構(gòu)信息,自定義關(guān)系表的結(jié)構(gòu)信息包括:表名、起始字段、終止字段、字段名。把用戶所要插入到自己創(chuàng)建的關(guān)系表的記錄都存儲(chǔ)在從表TableData中,如圖3所示:在TableData表中設(shè)置tableName為外鍵,通過這個(gè)外鍵來約束從表TableData中記錄的tableName字段一定是在主表TableInfor中存在的。主表中的columnName字段是用來存儲(chǔ)用戶創(chuàng)建的關(guān)系表的字段名,把用戶定義的所有字段名通過“|”符號(hào)鏈接成一個(gè)字符串存儲(chǔ)在表中。主表中的startColumn與endColumn字段是通過分割columnName后,根據(jù)得到虛擬關(guān)系表的字段數(shù)目計(jì)算而來。它們代表其對(duì)應(yīng)虛擬關(guān)系表中的記錄在從表TableData中所使用的是哪些字段,為簡單起見,默認(rèn)設(shè)置用戶新建虛擬關(guān)系表中除主鍵id外所有字段為varchar數(shù)據(jù)類型。
圖3 數(shù)據(jù)庫物理模型
2.1.1 “新增”自定義虛擬關(guān)系表
通過API(Application Programming Interface,應(yīng)用程序接口)新增虛擬關(guān)系表,用戶通過瀏覽器網(wǎng)頁填寫自定義虛擬關(guān)系表的結(jié)構(gòu)信息確定后,后臺(tái)通過http協(xié)議獲取用戶填寫的關(guān)系表結(jié)構(gòu)信息,并對(duì)用戶填寫的關(guān)系表結(jié)構(gòu)信息進(jìn)行校驗(yàn),校驗(yàn)包括用戶自定義虛擬關(guān)系表表名是否已經(jīng)存在、自定義虛擬關(guān)系表字段名是否符合格式要求,如果校驗(yàn)失敗,提示用戶重新填寫信息,如果校驗(yàn)成功,則向主表插入記錄。
2.1.2 “刪除”自定義虛擬關(guān)系表
通過API刪除某自定義虛擬關(guān)系表,后臺(tái)通過http協(xié)議獲取到要?jiǎng)h除的自定義虛擬關(guān)系表的表名,然后查看從表中是否存在該表名的記錄,若存在則先刪除中該表名的所有記錄,然后再刪除主表中該表名的記錄。
2.1.3 “修改”自定義虛擬關(guān)系表
通過API修改某自定義虛擬關(guān)系表,后臺(tái)查詢主表中該表名的記錄,在前臺(tái)網(wǎng)頁顯示該表的結(jié)構(gòu)信息,前臺(tái)網(wǎng)頁可以對(duì)該表結(jié)構(gòu)信息進(jìn)行修改后保存,由于主表中表名為從表的外鍵,簡單起見不允許修改自定義虛擬關(guān)系表名,然后跳轉(zhuǎn)到后臺(tái),對(duì)修改后的表結(jié)構(gòu)信息進(jìn)行校驗(yàn),校驗(yàn)成功后更新主表中該表名的記錄,校驗(yàn)失敗則返回頁面提示用戶校驗(yàn)失敗原因,讓用戶重新修改。
2.1.4 “查詢”自定義虛擬關(guān)系表
通過API查詢自定義虛擬關(guān)系表,自定義虛擬關(guān)系表的信息查詢實(shí)際是對(duì)主表的數(shù)據(jù)進(jìn)行查詢,根據(jù)查詢條件生成相應(yīng)的sql查詢語句,執(zhí)行sql查詢語句,遍歷查詢結(jié)果,把查詢結(jié)果賦值給主表對(duì)應(yīng)的對(duì)象實(shí)例,然后通過http協(xié)議把實(shí)例對(duì)象傳到前臺(tái)網(wǎng)頁顯示。
綜上所述,主表的“增、刪、改、查”四種基本操作中除了刪除操作以外,其他三種操作只需要直接對(duì)主表直接操作即可,由于從表外鍵約束的原因,刪除操作必須聯(lián)合從表進(jìn)行相關(guān)檢查后操作,如圖4所示。
圖4 主表的基本操作
2.2.1 “新增”自定義虛擬關(guān)系表中的記錄
通過API新增某自定義虛擬關(guān)系表中記錄時(shí),先查詢主表中該虛擬關(guān)系表的結(jié)構(gòu)信息,把查詢結(jié)果傳到前臺(tái)網(wǎng)頁,在前臺(tái)網(wǎng)頁解析該虛擬關(guān)系表的結(jié)構(gòu)信息(主要指字段名),在網(wǎng)頁上顯示該虛擬關(guān)系表的表結(jié)構(gòu),以供用戶新增該虛擬關(guān)系表的記錄,在用戶新增記錄提交后,后臺(tái)通過http協(xié)議獲取到用戶新增的數(shù)據(jù),并給從表對(duì)應(yīng)的對(duì)象實(shí)例進(jìn)行賦值,然后向從表插入記錄。
2.2.2 “刪除”自定義虛擬關(guān)系表中的記錄
通過API刪除某自定義虛擬關(guān)系表中記錄時(shí),先查詢主表中該虛擬關(guān)系表的結(jié)構(gòu)信息,同時(shí)查詢從表中該表名的記錄,分別給主表與從表對(duì)應(yīng)的實(shí)例對(duì)象賦值,傳到前臺(tái)網(wǎng)頁,在網(wǎng)頁上解析主表的結(jié)構(gòu)信息,在網(wǎng)頁上顯示該虛擬關(guān)系表的表結(jié)構(gòu),并遍歷從表實(shí)例對(duì)象,把遍歷結(jié)果一一對(duì)應(yīng)放在已經(jīng)解析好的虛擬關(guān)系表中,選中記錄刪除后,后臺(tái)通過http協(xié)議獲取到需要?jiǎng)h除的記錄的id,然后刪除從表中對(duì)應(yīng)的記錄。
2.2.3 “修改”自定義虛擬關(guān)系表中的記錄
通過API點(diǎn)擊修改某自定義虛擬關(guān)系表中記錄時(shí),先查詢主表中該虛擬關(guān)系表的結(jié)構(gòu)信息,同時(shí)查詢從表中該表名的記錄,分別給主表與從表對(duì)應(yīng)的實(shí)例對(duì)象賦值,傳到前臺(tái)網(wǎng)頁,在網(wǎng)頁上解析主表的結(jié)構(gòu)信息,在網(wǎng)頁上顯示出該虛擬關(guān)系表的表結(jié)構(gòu),并遍歷從表實(shí)例對(duì)象,把遍歷結(jié)果一一對(duì)應(yīng)放在已經(jīng)解析好的虛擬關(guān)系表中,修改保存后,后臺(tái)通過http協(xié)議獲取到修改后的數(shù)據(jù),并保存到數(shù)據(jù)庫從表中。
2.2.4 “查詢”自定義虛擬關(guān)系表中的記錄
通過API點(diǎn)擊查詢某自定義虛擬關(guān)系表中記錄時(shí),先查詢主表中該虛擬關(guān)系表的結(jié)構(gòu)信息,同時(shí)查詢從表中該表名的記錄,分別給主表與從表對(duì)應(yīng)的實(shí)例對(duì)象賦值,傳到前臺(tái)網(wǎng)頁,在網(wǎng)頁上解析主表的結(jié)構(gòu)信息,在網(wǎng)頁上顯示出該虛擬關(guān)系表的表結(jié)構(gòu),并遍歷從表實(shí)例對(duì)象,把遍歷結(jié)果一一對(duì)應(yīng)放在已經(jīng)解析好的虛擬關(guān)系表中。
從表的“增、刪、改、查”操作如圖5所示。
圖5 從表的基本操作
“煙草業(yè)數(shù)據(jù)共享平臺(tái)”是一個(gè)基于Web的數(shù)據(jù)庫應(yīng)用系統(tǒng),該系統(tǒng)按照統(tǒng)一的數(shù)據(jù)標(biāo)準(zhǔn)體系,提供統(tǒng)一的數(shù)據(jù)上傳接口把煙葉生產(chǎn)各個(gè)環(huán)節(jié)的測試或試驗(yàn)數(shù)據(jù)進(jìn)行集中的數(shù)據(jù)庫存儲(chǔ)與管理,并經(jīng)過一定的關(guān)聯(lián)性分析與數(shù)據(jù)挖掘,從而達(dá)到指導(dǎo)煙葉生產(chǎn)的目的。
在“煙草業(yè)數(shù)據(jù)共享平臺(tái)”項(xiàng)目開發(fā)需求調(diào)研階段,有著這樣一種用戶需求:研究人員為了找出彰顯煙葉風(fēng)格特色相關(guān)因素,會(huì)對(duì)各個(gè)地區(qū)的煙葉樣品采摘回來進(jìn)行化學(xué)成分分析、代謝物質(zhì)分析、評(píng)析指標(biāo)分析等幾十種甚至上百種測試或試驗(yàn)分析。然而像化學(xué)成分分析與物質(zhì)代謝分析是無法預(yù)先知道化學(xué)成分與代謝物質(zhì)的,有時(shí)會(huì)為了單獨(dú)分析某種因素而臨時(shí)增加一些試驗(yàn),這就需要提供用戶在瀏覽器網(wǎng)頁上可以隨時(shí)新建并修改數(shù)據(jù)庫關(guān)系表的功能。
傳統(tǒng)Web開發(fā)關(guān)系模型設(shè)計(jì)方式顯然難以滿足這樣不確定的用戶數(shù)據(jù)需求,然而本文提出的自適應(yīng)關(guān)系模型能夠提供用戶通過瀏覽器網(wǎng)頁自定義數(shù)據(jù)庫關(guān)系表,解決了不明確的用戶需求給項(xiàng)目開發(fā)帶來的困擾。
項(xiàng)目在Windows 7平臺(tái)上進(jìn)行開發(fā),開發(fā)中使用Eclipse作為集成開發(fā)工具,Tomcat 7作為Web服務(wù)器,SQL Server 2008數(shù)據(jù)庫。
下面通過煙“草業(yè)數(shù)據(jù)共享平臺(tái)”項(xiàng)目中自適應(yīng)關(guān)系模型的應(yīng)用實(shí)例來對(duì)自適應(yīng)關(guān)系模型進(jìn)行分析說明,表3、4分別為主表TableInfor與從表TableData中的存儲(chǔ)數(shù)據(jù)實(shí)例。
由主表實(shí)例可以看出,自定義虛擬關(guān)系表“代謝物質(zhì)”的起始字段為1,終止字段為2,字段名為“草酸(mg/g) | 煙堿(mg/g)”,意思是從表中tableName為“代謝物質(zhì)”的記錄中column1的值即為虛擬關(guān)系表“代謝物質(zhì)”中“草酸(mg/g)”字段的值,column2的值即為虛擬關(guān)系表“代謝物質(zhì)”中“煙堿(mg/g)”字段的值;自定義虛擬關(guān)系表“化學(xué)成分”的起始字段為1,終止字段為3,字段名為“鉀(mg/g) | 氯(mg/g) | 磷(mg/g)”,意思是從表中tableName為“化學(xué)成分”的記錄中column1的值即為虛擬關(guān)系表“化學(xué)成分”中“鉀(mg/g)”字段的值,column2的值即為虛擬關(guān)系表“化學(xué)成分”中“氯(mg/g)”字段的值, column3的值即為虛擬關(guān)系表“化學(xué)成分”中“磷(mg/g)”字段的值;自定義虛擬關(guān)系表“感官評(píng)價(jià)”的起始字段為1,終止字段為3,字段名為“香氣量 | 雜氣 | 甜度”,意思是從表中tableName為“感官評(píng)價(jià)”的記錄中column1的值即為虛擬表關(guān)系“感官評(píng)價(jià)”中“香氣量”字段的值,column2的值即為虛擬關(guān)系表“感官評(píng)價(jià)”中“雜氣”字段的值,column3的值即為虛擬關(guān)系表“感官評(píng)價(jià)”中“甜度”字段的值。
表3 主表TableInfor 實(shí)例
表4 從表TableData實(shí)例
idtableNamecolumn1column2column3…column2501代謝物質(zhì)3.242.87NULLNULLNULL2代謝物質(zhì)3.152.56NULLNULLNULL3化學(xué)成分0.150.650.34NULLNULL4化學(xué)成分0.240.530.28NULLNULL5感官質(zhì)量6.075.715.93NULLNULL6感官質(zhì)量7.265.675.84NULLNULL
從以上實(shí)例可以看出用戶自定義虛擬關(guān)系表的表結(jié)構(gòu)信息都存儲(chǔ)在表3中,而對(duì)應(yīng)的記錄存儲(chǔ)在表4中,同時(shí),用戶可以隨意建立滿足自己需求的虛擬關(guān)系表。
數(shù)據(jù)庫應(yīng)用系統(tǒng)的用戶往往不具有信息專業(yè)的相關(guān)知識(shí)和技能,系統(tǒng)開發(fā)過程中用戶的需求也經(jīng)常發(fā)生變化,從而嚴(yán)重影響了軟件工程項(xiàng)目的進(jìn)度和質(zhì)量。針對(duì)這一問題,本文提出了一種基于web的用戶自適應(yīng)關(guān)系模型,該方法通過特殊的關(guān)系模型設(shè)計(jì),以及建立虛擬關(guān)系表的思想,使用靜態(tài)表結(jié)構(gòu)來表現(xiàn)動(dòng)態(tài)表結(jié)構(gòu),實(shí)現(xiàn)了用戶可根據(jù)自身需要在網(wǎng)頁上新建以及動(dòng)態(tài)管理數(shù)據(jù)表及其數(shù)據(jù)的功能,一定程度上提高了對(duì)用戶需求的自適應(yīng)。在“煙草業(yè)數(shù)據(jù)共享平臺(tái)”數(shù)據(jù)庫系統(tǒng)的應(yīng)用結(jié)果表明了本文所提方法的有效性,對(duì)一類具有需求不確定軟件工程項(xiàng)目的研發(fā)具有參考和應(yīng)用價(jià)值。