問題提出:
在進行數據庫開發過程中,我們往往會碰到這種情形:
如在勞資計算中,對每個人有很多薪酬項目需要匯總計算出工資,如基本工資,計件工資,計時工資,獎金,補貼,代扣等等,但我們在建表的過程中既不能確定薪酬的名稱,也不能確定到底有多少個項目,所以在建表的時候面臨一個問題,建多少列?起什么名?
下面我以前做過的一個收費系統舉例,簡單說明一下對於這種情況的處理。
案例情況:
某單位收費系統,現確定收管轄區的暖氣費、物業費、治安費、衛生費、收視費、過水熱費、熱水費、房租、水電費、攤位費、商鋪租金十一個收費項目,但客戶提出有可能增加垃圾清運費、綠化費等一些現在還未確定的費用以及將來可能要增加的收費項目。
實現目標:
根據案例情況,我們必須要考慮動態設計列,而不是在客戶需增加列的時候去直接修改數據庫表結構。
實現方法:
采用列映射為行的處理方法,將無意義但有規律的列名映射出無規律但有意義的行。
實現步驟(設計工具 PowerDesigner9.5 數據為MS SqlServer2000):
一、 確定項目最多幾項
收費項目具體有多少項目,因為存在變數,我們不能確定,但最多不會超過多少項目,雖然我們仍然沒辦法確定,但這個是可以估計的。通過綜合分析系統使用對象的實際情況以及系統的生命周期,像這種臨時或將要增加的收費項目不會超過現有確定的項目的一半,所以在本系統估計最大收費項目會月16列。(注意:增加的收費項目不會超過現有確定的項目的一半,僅僅是指這個案例,具體問題具體分析)。
二、 建立項目信息表
建立一個用來存儲項目(列)信息的表,表結構如下:
數據內容如下:
這樣,我們就用這個項目信息表把每個項目對應的列名確定下來了,或者說,在別的表中相應的列名對應的收費項目就確定下來了。
我們在需要變更收費項目名稱或增減收費項目時只需修改表中類別名稱即可。
在這個表中還可以根據實際情況保存一些額外的信息,如增加計算公式列,對公式C13=C1+C5,行號為13的公式列可以保存C1+C5,這僅僅是一個簡單的例子,可以跟據實際情況保存很多擴展信息。
一、 使用項目信息表
我們建立的項目信息表,主要是為了在所有使用這些收費項目的其它表中使用。比如我們我們另一個表代扣項目設置表(設置哪些收費項目由交費用戶所在單位代扣),表結構如下:
數據表中數據表示次單位是否代扣此項目,如單位編碼為001的單位,DK_C01為1表示001單位代扣暖氣費,為0表示不代扣。
其它別的比如收費信息表(存儲收費用戶個人收費信息),個人收費項目表(存儲收費用戶個人有哪些收費項目)等表中均可使用類似定義列,我們在做數據庫操作的時候,可動態使用列名,如收費信息表中,存儲費用信息的列為FY_C01…FY_C16,我們計算此用戶總費用時可使用循環累加,列名由循環變里動態組合而成,如”FY_C”+循環變量處理形式表示。
方案優缺點:
優點:1、能夠靈活的設置項目(具有共性的多個分類)的名稱或表示形式,而不受數據庫實際列的限制,而且能夠方便的進行修改。
2、在進行數據處理時能根據某種規律動態生成列名而讀取或更新數據。
缺點:如不能正確估計項目最多有幾項,會導致需修改多個表。
注:這篇文章是我以前做過一個項目中實際碰到實際問題,我只是最近閑下來做了個整理,其實是一個很簡單的處理方式,不是寫給高手看的,只是希望對碰到問題類似問題的朋友做一參考。
————————————————
版權聲明:本文為CSDN博主「chaihuo」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/chaihuo/article/details/1631680