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