[摘 要] 現在大型應用系統越來越多,這不但體現在系統的功能數量上,還體現在系統底層的數據存儲數量上。本文基于作者在政府、企業項目的設計經歷,提出了在大型系統中數據庫設計的一些設計經驗,并從這些設計經驗中總結出兩種數據庫設計模式,從而解決了大型應用系統中統計、查詢等應用性能和應用完整性的問題。
[關鍵詞] 應用系統 數據庫 數據庫設計 設計模式
一、引言
現如今絕大部分的應用系統都是基于數據庫的,也就是說沒有數據存儲的應用系統是非常少的。那么在應用系統的設計階段,必然會涉及數據模型的概要設計和物理設計,良好的數據庫設計是關系到系統能否成功運行、維護的關鍵之一。在當今系統越來越龐大,應用數據越來越多的今天,數據庫設計的合理性和靈活性顯得越來越重要,因為在任何應用中,數據是最重要的、最核心的、最有價值的,技術上可以根據需要選擇不同的架構和技術,但數據不會因此改變而發生任何變化,甚至可以說數據是企業在信息世界的靈魂,例如現在的電信、金融、公安、勞動、民航等系統都是這種應用的典型代表。
在各種大型應用系統中,系統操作的信息主體無外乎單位和個人兩類,拿個人來說,個人基本信息按照信息生命周期的可變性分為不變屬性和可變屬性兩種,不變屬性包括:公民身份號碼(目前隨著二代身份證系統的實施,18位的公民身份號碼理論上可以保持惟一)、姓名、性別、出生日期、民族等,可變屬性包括:年齡、文化程度、政治面貌、戶籍所在地、居住所在地等,大部份的數據庫設計都會將個人不變屬性和可變屬性放在一個個人基本信息表中存儲,在業務表中通過公民身份號碼做主外鍵關聯。
但是,這樣的設計在實際應用系統中有時會存在非常大的問題。例如有如下業務場景:某人在某個時間點上做過一次業務,當時他(她)的文化程度是“大專”,在此之后又做過一次相同的業務,此時他(她)的文化程度是“本科”,當然這個業務場景存在的前提是業務邏輯是符合業務規則的。如果現在有一個按照時間范圍和文化程度的統計,時間跨度覆蓋此人的上述兩次辦理業務,那么,按照上面的描述應該把此人分別統計為“大專”分類1次/人,“本科”分類1次/人的統計數據,而不是2次/人的“本科”分類統計數據。這種情況如何解決呢?
二、數據庫設計模式
1.規范模式設計。這種模式是在個人基本信息表的基礎上設計一個變更表(見圖1),記錄此人歷次基本信息項變更時的信息(通過“變更類型”屬性區別本次變更的是個人基本信息表中的哪個屬性),在個人基本信息表中保存最新的個人基本信息,業務表記錄此人業務發生時的信息。這種設計完全符合數據庫關系模式的規范化要求,做到了最小的數據冗余(除主外鍵的關聯外),從而消除了數據的傳遞依賴,這是此模式的優點。但如果當需要針對業務表進行統計、查詢時,就需要關聯3個信息表,且當3個表的數據量處在較高的數量級別時(例如分別在上百萬數量級),那么關聯所占的臨時存儲空間和消耗的時間都是非常巨大的,甚至是不可忍受的。有些業務系統經常出現部分統計、查詢需要幾十分鐘,甚至幾個小時才能出現結果的情況,一般都是因為這個原因,當然部分情況可以通過建立索引或者優化索引的方式解決,但不能從根本上解決性能下降的問題。
2.冗余模式設計。這種模式是在業務表中增加必要的個人基本信息屬性的冗余,即冗余列反范式技術。這種方法的設計思想就是在當業務發生時,將當時個人的業務信息和相關的個人基本信息中的狀態信息記錄到業務表中,形成當時時間點上個人信息的一個“快照”。例如,如果業務需要對業務信息按文化程度屬性進行統計,那么就冗余文化程度屬性;如果需要按年齡段(20周歲至25周歲,25周歲至30周歲等)進行統計,那么就冗余年齡屬性,這樣在業務信息表中除了公民身份號碼作為外鍵關聯外,還將冗余文化程度和年齡屬性。而這些屬性實際在個人基本信息表中已經存在,在業務表中又保留了它的一個“拷貝”。此模式也可以增加一個變更表記錄歷次變更的信息,但它的作用只限于變更情況的記錄,不參與系統的統計、查詢操作。
當然冗余的設計需要在需求分析過程中,對業務需求進行詳細、充分的需求調研,要從業務的角度尋求對冗余的設計的業務需求支持,這決定了到底要冗余那些信息項;在系統設計過程中細致、縝密,并且具有豐富的業務和設計經驗,也就是說冗余要做到有效冗余,不能為了冗余而過度冗余那些沒有必要的屬性。這種方法的好處是減少了數據表之間的關聯,增加了業務統計、查詢的效率,缺點是需要額外的冗余數據存儲空間。
三、結束語
系統的建設應當是綜合設計的結果,不但要考慮系統的功能要求和非功能要求,還要從統計、查詢的效率,統計、分析的完整性,數據量估算、數據量增長等角度設計系統,當從這些維度考慮系統設計問題時,很多時候會對數據庫設計產生重大的影響。例如當考慮:為了保證業務的完整性,需要增加變更表記錄歷史變更信息;為了系統統計、分析的正確性,需要在業務表中冗余必要的屬性:為了統計、查詢的效率,需要關聯正確的數據表或者在業務表中冗余必要的屬性;考慮較快的數據增長速度,而又不能通過分區解決的,可以適當考慮數據冗余。
這些因素時,必須在數據庫規范化設計和數據冗余兩個方面做出綜合平衡,或者通過犧牲存儲空間獲得較高的系統性能,或者降低系統性能的要求而滿足數據存儲的要求。
參考文獻:
薩師煊 王 珊:數據庫系統概論[M].北京:高等教育出版社,1991
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”