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