任毅
摘 要:目前在數(shù)據(jù)庫(kù)應(yīng)用中,有時(shí)候會(huì)遇到列不完全明確的情況,存在增加列或者減少列的情況,例如工資表,可能會(huì)根據(jù)情況添加新的工資收入列或者去除已經(jīng)不再適用的列,此時(shí),就需要對(duì)字段進(jìn)行動(dòng)態(tài)處理,以適應(yīng)不斷變化的查詢、統(tǒng)計(jì)需求。文章以一個(gè)實(shí)際的應(yīng)用為例,實(shí)現(xiàn)了字段的動(dòng)態(tài)處理。
關(guān)鍵詞:數(shù)據(jù)庫(kù);動(dòng)態(tài);字段
1 動(dòng)態(tài)字段處理方法
動(dòng)態(tài)字段目前主要有以下幾種處理方案[1]:
(1)動(dòng)態(tài)增加數(shù)據(jù)庫(kù)表字段。動(dòng)態(tài)增加數(shù)據(jù)庫(kù)字段會(huì)改變表結(jié)構(gòu),增加維護(hù)的難度,有的數(shù)據(jù)庫(kù)系統(tǒng)并不支持動(dòng)態(tài)增加字段。
(2)預(yù)留足夠的空白字段,運(yùn)行時(shí)作動(dòng)態(tài)影射。提前預(yù)留field0.field1.....fieldN字段。優(yōu)點(diǎn):相較于其他做法,比較穩(wěn)定,不用行轉(zhuǎn)列,不用解析XML。缺點(diǎn):會(huì)有大量的空余字段,需要記錄映射關(guān)系,查詢時(shí)比較復(fù)雜。
(3)用XML格式保存在單字段里。添加一個(gè)XML格式字段,將動(dòng)態(tài)字段以逗號(hào)分隔,所有的字段都在一個(gè)列里。優(yōu)點(diǎn):擴(kuò)展容易,維護(hù)容易。缺點(diǎn):在查詢或解析時(shí)需要大量的用substring等對(duì)字符串的處理,性能上有問(wèn)題。
(4)改列為行,用另外一個(gè)表存放定制字段。只用一個(gè)表,3個(gè)字段id,fieldName,fieldValue,將動(dòng)態(tài)字段的名稱和值放進(jìn)去。優(yōu)點(diǎn):擴(kuò)展容易,結(jié)構(gòu)簡(jiǎn)單,缺點(diǎn):數(shù)據(jù)量比較大,查詢時(shí)可能比較慢。
2 相關(guān)表設(shè)計(jì)
某單位需要編制一個(gè)工資發(fā)放管理系統(tǒng),要求:
(1)本月工資數(shù)據(jù)由上一月工資數(shù)據(jù)生成,然后在其基礎(chǔ)上修改,以減小工作量。
(2)能添加、刪除工資字段,即字段不固定。
(3)員工的工資收入須發(fā)到兩張卡里,每張卡上工資所涉及的字段統(tǒng)一指定[2]。
在認(rèn)真分析具體需求后,對(duì)數(shù)據(jù)庫(kù)進(jìn)行了設(shè)計(jì),準(zhǔn)備采用動(dòng)態(tài)字段解決用戶的問(wèn)題,以下是幾張關(guān)鍵的數(shù)據(jù)表設(shè)計(jì):
(1)工資字段表(W_GzItem)。
工資字段表反映了每月有哪些工資項(xiàng),包括ItemID(工資字段編號(hào))、ItemName(工資項(xiàng)名稱)、BankCode(銀行信息)等字段。
(2)員工工資表(W_Gzdata)。
員工工資表反映員工每月工資情況,在此按照預(yù)留字段進(jìn)行設(shè)計(jì),該系統(tǒng)目前需要字段不超過(guò)30個(gè),考慮到以后的發(fā)展,再預(yù)留30個(gè)字段,字段名以字母A開(kāi)始,其后跟一編號(hào),此編號(hào)與工資字段表W_GzItem中的ItemID存在一一對(duì)應(yīng)關(guān)系,即列與行對(duì)應(yīng),從而實(shí)現(xiàn)動(dòng)態(tài)字段[3],如圖1所示。
3 功能實(shí)現(xiàn)
在本系統(tǒng)工資數(shù)據(jù)處理中,關(guān)鍵地方在于生成查詢串及更新串,其中查詢串還需要判斷工資項(xiàng)是“發(fā)錢”還是“扣錢”,以計(jì)算實(shí)發(fā)工資,更新串用于用戶對(duì)數(shù)據(jù)修改后保存到表中,程序流程如圖2所示。
4 結(jié)語(yǔ)
動(dòng)態(tài)字段主要應(yīng)用于用戶數(shù)據(jù)表列(例如工資項(xiàng))動(dòng)態(tài)變化的情況,并且這些字段數(shù)據(jù)類型一致,處理方法相同。采用預(yù)留字段來(lái)處理動(dòng)態(tài)字段,需要構(gòu)建查詢字符串及更新字條串,可節(jié)省數(shù)據(jù)查詢時(shí)間,提高查詢效率,但會(huì)多占用一部分?jǐn)?shù)據(jù)表存儲(chǔ)空間。
[參考文獻(xiàn)]
[1]謝國(guó)坤,霍愛(ài)清,湯楠.Vcard數(shù)據(jù)的動(dòng)態(tài)字段解析和存儲(chǔ)方案的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2011(9):3231-3234.
[2]黃飛江,盧曉春,邊玉敬,等.基于數(shù)據(jù)窗口的動(dòng)態(tài)字段查詢的設(shè)計(jì)與實(shí)現(xiàn)[J].大眾科技,2007(2):67-68.
[3]阮國(guó)龍,劉銘.在Delphi數(shù)據(jù)集中實(shí)現(xiàn)查找字段的動(dòng)態(tài)創(chuàng)建[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2004(9):66-68.