筆者從98年進入資料庫及資料倉儲領域工作至今已經有近八年的時間,對資料建模工作接觸的比較多,創新性不敢談,本文只是將工作中的經驗總結出來,供大家一同探討和指正。
提起資料建模來,有一點是首先要強調的,資料建模師和DBA有著較大的不同,對資料建模師來說,對業務的深刻理解是第一位的,不同的建模方法和技巧是為業務需求來服務的。而本文則暫時拋開業務不談,主要關注於建模方法和技巧的經驗總結。
從目前的資料庫及資料倉儲建模方法來說,主要分為四類。
第一類是大家最為熟悉的關聯式資料庫的三範式建模,通常我們將三範式建模方法用於建立各種操作型資料庫系統。
第二類是Inmon提倡的三範式資料倉儲建模,它和操作型資料庫系統的三範式建模在側重點上有些不同。Inmon的資料倉儲建模方法分為三層,第一層是實體關聯層,也即企業的業務資料模型層,在這一層上和企業的操作型資料庫系統建模方法是相同的;第二層是資料項目集層,在這一層的建模方法根據資料的產生頻率及訪問頻率等因素與企業的操作型資料庫系統的建模方法產生了不同;第三層物理層是第二層的具體實現。
第三類是Kimball提倡的資料倉儲的維度建模,我們一般也稱之為星型結構建模,有時也加入一些雪花模型在裡面。維度建模是一種面向使用者需求的、容易理解的、訪問效率高的建模方法,也是筆者比較喜歡的一種建模方式。
第四類是更為靈活的一種建模方式,通常用於背景資料準備區,建模的方式不拘一格,以能滿足需要為目的,建好的表不對使用者提供介面,多為暫存資料表。
下面簡單談談第四類建模方法的一些的經驗。
資料準備區有一個最大的特點,就是不會直接面對使用者,所以對資料準備區中的表進行操作的人只有ETL工程師。ETL工程師可以自己來決定表中資料的範圍和資料的生命週期。下面舉兩個例子:
1)資料範圍小的暫存資料表
當需要整合或清洗的資料量過大時,我們可以建立同樣結構的暫存資料表,在暫存資料表中只保留我們需要處理的部分資料。這樣,不論是更新還是對錶中某些項的計算都會效率提高很多。處理好的資料發送入準備載入到資料倉儲中的表中,最後一次性載入入資料倉儲。
2)帶有冗餘欄位的暫存資料表
由於資料準備區中的表只有自己使用,所以建立冗餘欄位可以起到很好的作用而不用承擔風險。
舉例來說,筆者在項目中曾遇到這樣的需求,客戶表{客戶ID,客戶淨扣值},債項表{債項ID,客戶ID,債項餘額,債項淨扣值},即客戶和債項是一對多的關係。其中,客戶淨扣值和債項餘額已知,需要計算債項淨扣值。計算的規則是按債項餘額的比例分配客戶的淨扣值。這時,我們可以給兩個表增加幾個冗餘欄位,如客戶表{客戶ID,客戶淨扣值,客戶餘額},債項表{債項ID,客戶ID,債項餘額,債項淨扣值,客戶餘額,客戶淨扣值}。這樣通過三條SQL就可以直接完成整個計算過程。將債項餘額匯總到客戶餘額,將客戶餘額和客戶淨扣值冗餘到債項表中,在債項表中通過(債項餘額×客戶淨扣值/客戶餘額)公式即可直接計算處債項淨扣值。