凡是建設數據倉庫,一定會提到維度建模方法。這一方法是Kimball最先提出的,其最簡單的描述就是,按照事實表、維度表來構建數據倉庫、數據集市。在維度建模方法體系中,維度是描述事實的角度,如日期、商品、地址等,事實是要度量的指標,如用戶數、銷售額等。按照一般書籍的介紹,維度建模還會分為星型模型、雪花模型等,各有優缺點,但很少直接回答一個問題,也就是數據倉庫為什么要采用維度建模?
這個問題的基本判斷在於,數據是否要開放給業務人員使用?采用維度建模構建出來的數據庫結構表更加符合普通人的直覺、易於被普通人所理解,從而有利於數據的推廣使用。下面以超市收銀小票為例說明常規的三范式模型和維度模型。
三范式的數據模型示意如下:

維度模型示意如下:

以上兩個模型的最小數據粒度都是小票項目,可以容易看出來,維度模型是將關系模型的層次結構展開平鋪而成。從上面的這個范例可以引出采用維度建模方法的基本理由,就是:
數據結構簡單。在決定是否要采用維度建模之前,必須回答一個問題,“數據模型是否要開放給業務人員直接使用”,如果答案肯定,則應該采用維度建模的方法。維度模型這個概念有點學術化,但究其本質而言,是將層次化的數據結構展開為單一層次,有點類似於將一個業務過程的數據匯總到一個excel的sheet頁中。
不過維度建模的代價也很明顯,就是其靈活性較差,數據冗余較多,所以,在很多書中提出了一個折中的辦法,即“雪花模型”,同時還煞有介事的對比了雪花模型與星型模型(即上面的示例)的優缺點,讓很多初學者心中飄來了一個揮之不去的疑問,“既然雪花模型既有關系模型的優點,還有維度模型的優點,為什么還要存在星型模型呢”?。竊以為,這完全是多此一舉的做法,維度建模追求的是使用簡單,多增加一級關聯,增加的使用復雜度就會增加不止一點,會給多數不懂技術的業務人員帶來極大的障礙,是一種舍本逐末的做法。
基於這種考慮,在建設數據倉庫的過程中,明細層和集市層分別采用不同的建模方法,也就是:
明細層采用傳統的三范式關系模型。這一層次的數據模型要將業務過程描述清楚,將源數據(即業務系統)中隱含的、有歧義的概念進行清晰化,如活躍用戶、VIP用戶等。該層次的數據模型追求的目標是靈活地表達業務過程,要保證數據一致性、唯一性、正確性,以盡量少的代價與源數據保持數據同步,同時該層次的數據模型不建議開給不懂技術的業務人員直接使用,因此,采用關系型的三范式模型是最佳的選擇。
集市層采用維度模型。集市層是按照業務主題、分主題構建出來的、面向特定部門或人員的數據集合,該層次的數據模型會開放給業務人員使用,進行數據挖掘及業務分析。由於業務員多數不懂數據庫技術,缺少將業務需求轉換為關系型數據結構的邏輯思維,更寫不出復雜的SQL語句,因此,越簡單的數據模型,越能被他們所接受,因此,這個層次所構建出來的數據模型,要按照業務過程進行組織,每個事實表代表一個獨立的業務過程,事實表之間不存在直接的依賴關系,這樣業務人員可以很容易地將分析需求對應到事實表上,利用工具或手工寫出簡單的SQL,將統計數據提取出來進行分析。
以上,就是數據倉庫采用維度建模和關系建模的基本判斷。
