余肖生 汪宏舟



[摘要]電子報表在管理控制中發揮著越來越重要的作用。選擇一種最適合于信息系統功能需求的報表呈現方式,在一定程度上成了信息系統開發的關鍵。本文中筆者比較了三種常用的報表存取模式,認為表格類報表是信息系統報表呈現的主要形式,并詳細分析了表格類報表的設計方法、性能優化等問題。最后,以一個數據統計系統——五人制足球信息統計系統為例,討論了表格類報表的應用。
[關鍵詞]管理信息系統;報表存取模式;報表呈現
[中圖分類號]TP311
[文獻標識碼]A
[文章編號]1008-0821(2015)02-0053-04
隨著信息爆炸時代的到來,各行各業傳統的辦公模式面臨嚴峻的挑戰,產生了“無紙化辦公”、“網絡查詢”的要求,而電子報表作為現代技術的出現,在管理控制中發揮重要作用,尤其在財務報告及分析評價方面。因此在信息系統開發的過程中,除了常規事務,還更應關注報表的設計。報表設計主要包括兩方面內容:一方面是報表旱現形式。在信息系統中報表呈現形式主要有文字、圖形和表格等。文字類報表作為總結性報表之一,易受主觀意識影響,有遺漏潛在信息的可能;圖形類報表的報表內容客觀,但也易受到圖形的局限性而影響分析結果的評估;而表格類報表作為報表呈現的基本形式,在關系數據庫數據呈現中發揮著越來越重要的作用。另一方面是報表數據存取方式的選擇,這涉及報表存取模式。本文認為表格類報表是信息系統報表呈現的主要形式,并著重比較了3種常用的報表存取模式,接著詳細分析了表格類報表的設計方法、性能優化等問題,最后,以一個數據統計系統——五人制足球信息統計系統為例,討論了表格類報表的應用。
1 報表存取模式的比較
數據存取是指數據庫數據存儲組織和存貯路徑的實現和維護,而所謂報表存取模式是指報表的數據來源及其數據存儲組織的方式。在報表開發中,報表呈現的數據來源通常有三種,分別是視圖(View)、存儲表(Table)、數據倉庫(Data warehouse)。第一種是在數據庫中通過創建視圖,基于視圖做過濾查詢后,為前端應用程序提供數據源,輸出報表;第二種是在業務數據庫中創建存儲表,專門存儲報表數據,并在前端應用程序輸出報表;第三種是從數據源提取數據,存儲在數據倉庫中,利用即席查詢、OLAP分析、數據挖掘等訪問工具輸出報表。
在進一步討論報表存取模式之前,需要了解普通視圖和表的區別及執行效率問題。視圖是從一個或幾個基本表(或視圖)導出的表。它與基本表不同,是個虛表。數據庫中只存放視圖的定義,而不存放視圖對應的數據,這些數據仍存放在原來的基本表中。因此普通視圖實際就是多表查詢,顯然比單表查詢的效率要低些,這是視圖和表的區別。
下面討論常見的三種報表存取模式以及它們的優點與缺點,如表1所示。
通過創建視圖(View)來呈現報表是一種最基本的開發模式。通常,這一開發模式僅適合于只有少數幾個表的連接查詢或簡單計算的情形。Crystal Reports報表軟件是這種報表存取模式的典型代表。其主要特點是形式多樣的內容創建、支持多數據源、提供分析工具以及支持Web應用,可集成到開發者的開發環境中,如Visual Studio,.Net平臺等。這種報表開發方法直觀,數據基本不存在冗余,幫助開發者做出了大量報表。如果報表數據很復雜時,比如報表需要從復雜的數據源或者多個不同類型的數據源中獲取數據,獲取的數據可能還需要統計、格式轉換或其他處理。這樣的報表視圖查詢語句復雜,實現難度大。通過這類報表軟件制作復雜報表時,會因為在視圖中進行多次復雜的關系代數運算使得運行效率很低,無法高效地將數據庫中的數據加載到報表中。而用戶請求以最少的響應時延傳送Web頁面被公認為Web頁面最重要的設計準則,因此這種方法僅適用于業務規則簡單的報表。
物化視圖(Materialized View)是視圖的一種延伸。物化視圖把視圖結果存放在數據庫中,創建一個包含視圖數據的臨時表,基于這個臨時表再執行查詢。這種處理能夠在一定程度上提高報表查詢的效率。但開發者還是需要一口氣編寫復雜的視圖,難度大,也不便于開發者維護代碼。
相反若以存儲表(Table)的方式存取報表數據并輸出,其好處是報表查詢效率高。開發者只需要在業務系統中編寫少量程序,控制數據流的提取、轉換,保證數據的一致性,并將報表數據源存儲到存儲表中。這種方法在處理復雜數據源時,實現難度比視圖小。當然用存儲表的方式也會導致一些問題:①因需要在業務系統中自動提取轉換原始數據,從而拖累業務系統,導致業務系統運行效率相對低一點;②存在一定的數據冗余,這就需要開發人員確保數據的高度一致性。這種方法適用于業務規則復雜的報表。
以數據倉庫(Data warehouse)的方式開發報表,除數據倉庫數據庫服務器外,還需要創建分析服務器(Analysis Services),建立專門的多維數據庫,不僅在服務器資源上增加了額外的開銷,而且開發的成本要高很多,這種報表存取模式適用于企業級管理信息系統。
在實際開發中,對于小型常規的業務系統,多采用視圖或存儲表的設計方法;對于企業級管理信息系統,則更多采用創建數據倉庫的方式開發報表。
2 報表呈現過程的分析與設計
2.1報表呈現過程的數據流分析
在傳統的報表軟件中,報表統計處理單元從數據源中提取、轉換、加載數據,輸出報表呈現給用戶。如圖1所示,數據源直接把原始數據交給報表統計處理單元處理。當原始數據復雜時,一方面,實現難度增大;另一方面,增加了報表統計處理單元的負載,使查詢效率降低。
在這個過程中,如果能夠把數據的提取、轉換交給數據源來完成或者增加一個數據源加載處理單元來完成這部分的數據處理,會減輕報表統計處理單元的負載,如圖2所示。當數據源加載處理單元能夠在業務系統中運行,不在報表系統中運行,雖然會影響業務系統的運行效率,但有些情況下是值得的。endprint
三種報表存取模式中,存儲表和數據倉庫結構的報表存取模式,正是通過增加一個數據源加載處理單元來提取、轉換數據,使得報表統計處理單元的實現難度降低、查詢效率提高。
2.2報表呈現過程的設計
在報表呈現過程的設計階段,需要進行功能模塊設計和數據庫設計。本文以存儲表結構的報表存取模式為例,討論其實施步驟。
2.2.1功能模塊設計
根據需求分析、數據流程以及模塊劃分標準設計模塊并給出具體功能。從模塊聚合性方面考慮,報表呈現過程的數據流是先提取、轉換業務系統中的原始數據并存儲在存儲表中,之后再加載存儲表數據,生成報表。因此整個數據流可分為原始數據的提取、轉換和數據加載兩個不同時間段進行。從模塊耦合性方面考慮,原始數據的提取、轉換和數據的加載只是通過數據交換實現,并且控制信息的傳遞。
因此報表呈現過程中包括兩個功能模塊,分別是報表統計模塊和數據源加載模塊。報表統計模塊用于報表輸出和數據加載,即設計出符合客戶要求的報表樣式,并設計好數據加載接口。數據源加載模塊用于數據的提取、轉換及存儲,即在業務系統的業務流中選擇適當位置設計數據源加載模塊,獲取流經該業務的原始數據,轉換后存儲在存儲表中,并保持數據的一致性。
2.2.2數據庫設計
報表呈現過程中,數據庫設計也尤為重要,這里的數據庫主要是指存儲表。存儲表可以違背完整性約束以及范式,比如不設置主鍵或者設置自增長ID作為惟一標識;允許數據存在冗余,用業務表的有關非主屬性替代之間的關系或外鍵,其目的是達到所存儲的數據跟視圖基本一樣。對于需要復雜計算的派生列數據項要留有對應的列接收數據。
3 實例研究
筆者以五人制足球信息統計系統中的報表設計為例,對視圖和存儲表兩種報表存取模式及報表呈現過程的分析設計思想進一步分析與討論。本系統開發平臺為ASP.NET和SQL Server,主要完成系統管理、賽前管理、賽后管理和比賽報告等四大功能模塊。系統業務中涉及的用戶主要有裁判員、比賽監督員、賽區工作人員、體協管理員。主要業務描述如下:①裁判員在賽后登記裁判報告;②比賽監督員在賽后登記比賽監督報告;③賽區工作人員在賽后登記賽區工作報告;④體協管理員審核報告并做出停賽處理以及扣分罰款處理。
比賽報告模塊作為本系統的核心模塊,其包括裁判報告、比賽監督報告、賽區工作報告、積分榜、射手榜、停賽公告、扣分罰款統計等7張報表。在分析每張報表的數據來源時,發現裁判報告、比賽監督報告、賽區工作報告以及射手榜、積分榜的業務規則較簡單,其數據源大多來自一兩張表并且不需要對原始數據后續處理,容易創建視圖,得出符合要求的報表。射手榜報表數據源的創建視圖代碼如圖3所示。
從代碼量我們可看出代碼量極少,最終報表呈現的效果如圖4所示。這類業務規則簡單的報表,視圖方式顯然是更優的選擇。
而停賽公告和扣分罰款統計的業務規則比較復雜。以停賽公告為例,其業務規則如下:當1名隊員比賽時得到1張紅牌或者黃牌累計達到3張時,要求停賽1次;停賽場序由體協管理員審核完賽事報告后,繼續處理;如需要額外停賽,由體系管理員后續處理。報表輸出還要求同一隊員累加停賽場數,最終輸出1張信息自上而下累加的停賽公告報表。若以創建視圖的方式,查詢語句極其復雜,因此存儲表的存取模式是最佳的選擇。
在數據庫設計方面,停賽公告存儲表的關系模式是停賽公告表(編號,賽事年度,賽事輪數,賽事場序,球隊名稱,隊員名稱,隊員號碼,停賽場序,累積黃牌,累計紅牌,累計停賽,停賽原因,處理狀態)。停賽公告存儲表的關系模式顯然不滿足完整性約束和范式,更接近報表的數據源。
在功能模塊設計方面,賽事審核時,設計數據源加載模塊,獲取紅黃牌數據,轉換為停賽數據,控制信息的傳遞,保證數據一致性,并更新停賽存儲表,供用戶后續處理后輸出報表。處理代碼如圖5所示。
報表統計模塊的設計相對容易,從存儲表中加載數據,綁定到報表中,并輸出報表。停賽公告報表呈現的效果如圖6所示。
4 結語
筆者通過比較三種報表存取模式的差別及分析表格類報表的設計方法,就報表呈現過程中如何降低報表的實現難度和如何優化報表的查詢性能等問題,提出解決方案,并給出實例。在設計報表呈現過程時,如果業務規則較簡單,選擇視圖作為報表的數據來源比較合適;如果業務規則復雜且報表有特殊要求,選擇存儲表或數據倉庫作為數據來源更合適。然而存儲表這種報表存取模式實際上可以理解為一種小型的數據倉庫。筆者并沒有提出一種介于數據倉庫和視圖之間的新模式替代存儲表。這是本文存在的不足,也有待進一步研究探討。
(本文責任編輯:孫國雷)endprint