1. 程式人生 > >【資料倉庫】2.維度建模

【資料倉庫】2.維度建模

0x00 前言

前一篇已經對常用的幾種資料模型做了簡單的介紹,本篇主要對其中最常用的維度建模做一個深入的理解。

0x01 什麼是維度建模

維度模型是資料倉庫領域另一位大師 Ralph Kimball 所倡導,他的《The DataWarehouse Toolkit-The Complete Guide to Dimensona Modeling,中文名《資料倉庫工具箱》,是資料倉庫工程領域最流行的數倉建模經典。

按照書中所講,維度建模並不要求維度模型必須滿足第3正規化。資料庫中強調的 3NF 主要是為了消除冗餘。規範化的 3NF 將資料劃分為多個不同的實體,每個實體構成一個關係表。比如說訂單資料庫,開始可能是每個訂單中的一行表示一條記錄,到後來為了滿足 3NF會變成蜘蛛網狀圖,也許會包含上百個規範化表。而且對於 BI 查詢來講,規範化模型太複雜,使用者會難以理解和記錄這些模型的使用。 而維度建模解決了模式過分複雜的問題。

我們換一種方式來解釋什麼是維度建模。學過資料庫的童鞋應該都知道星型模型,星型模型在資料倉庫的設計中可以為是一種典型的維度模型。我們在進行維度建模的時候會建一張事實表,這個事實表就是星型模型的中心,然後會有一堆維度表,這些維度表就是向外發散的星星。那麼什麼是事實表、什麼又是維度表嗎,下面會專門來解釋。

0x02 基本概念

維度建模中有一些比較重要的概念,理解了這些概念,基本也就理解了什麼是維度建模。

為了便於理解,我們先假設一個業務場景:聊天! 比如簡訊聊天、軟體聊天這些聊天場景。 下圖是在聊天場景中我們設計的一個簡單的星型模型,裡面有三個最常用到的概念:事實表、維度表和度量值。

1. 事實表

發生在現實世界中的操作型事件,其所產生的可度量數值,儲存在事實表中。從最低的粒度級別來看,事實錶行對應一個度量事件,反之亦然。

額,看了這一句,其實是不太容易理解到底什麼是事實表的。書中就是這麼寫的,剛入門的時候看的時候一臉懵逼。

回到前面的圖,最中間那個chat表就是一個事實表,你可以理解他就是在現實中發生的一次操作型事件,我們每次給一個小夥伴發一條資訊,就相當於是一個事實,它在表中的體現就是一條記錄。

我們可以回過頭再看一下事實表的特徵,在維度表裡沒有存放實際的內容,他是一堆主鍵的集合,這些ID分別能對應到維度表中的一條記錄。

2. 維度表

每個維度表都包含單一的主鍵列。維度表的主鍵可以作為與之關聯的任何事實表的外來鍵,當然,維度錶行的描述環境應與事實錶行完全對應。 維度表通常比較寬,是扁平型非規範表,包含大量的低粒度的文字屬性。

我們的圖中的圍繞在chat表周圍的四張表都屬於維度表,這些表都有一個唯一的主鍵,然後在表中存放了詳細的資料資訊。

3. 度量值

度量值是什麼?看一下chat表中最後一個欄位:內容長度(content_length),它表示我們在簡訊中的發了多少個字。 度量值是對一次行為的度量,可以是一次簡訊的文字長度、一次電話的通話時間、一個訂單的訂單金額。

0x03 實踐

下面我們將以聊天場景為例,詳細講一下維度建模的建模方式,並舉例如果使用這個模型(這點還是很重要的)。

一、業務場景

假設我們在一家通訊性質的公司工作,公司需要對業務進行建模,我們首先限定業務場景為聊天,這種場景會有下面幾個要素:

  1. 一次聊天行為的發起需要有這幾個個體的參與:傳送訊息者、接受訊息者、時間、ip、裝置。

  2. 一個使用者可以給多個使用者發訊息,可以不同時間發很多條。

好,基於這兩點,我們來設計我們的模型。

二、模型設計

首先,我想一下如果不按照什麼維度建模來設計,我們可以怎麼做?

如果是我,我會設計下面這張表。你信不信,我能列出來50個欄位!

如果按照維度建模的方式來設計的話,我們會得到這張表,也就是前面貼出來的。

其實我個人認為怎麼設計這種表都有其合理性,我們不論對錯,單說一下兩者的優缺點。

先說我們的維度模型:

  1. 資料冗餘小(因為很多具體的資訊都存在相應的維度表中了,比如使用者資訊就只有一份)

  2. 結構清晰(表結構一目瞭然)

  3. 便於做OLAP分析(資料分析用起來會很開心)

  4. 增加使用成本,比如查詢時要關聯多張表

  5. 資料不一致,比如使用者發起購買行為的時候的資料,和我們維度表裡面存放的資料不一致

再說我們這張大款表的優缺點:

  1. 業務直觀,在做業務的時候,這種表特別方便,直接能對到業務中。

  2. 使用方便,寫sql的時候很方便。

  3. 資料冗餘巨大,真的很大,在幾億的使用者規模下,他的訂單行為會很恐怖

  4. 粒度僵硬,什麼都寫死了,這張表的可複用性太低。

三、使用示例

資料模型的建立必須要為更好的應用來服務,下面我先舉一個例子,來切實地感受一下來怎麼用我們的模型。

需求:求出2017年在廣東省每個市的男性分別給女性發過多少字。

實現

實現是不是很簡單?然後還有各種上鑽和下探的操作都可以基於這幾張表來實現。

0xFF 總結

維度建模是一種十分優秀的建模方式,他有很多的優點,但是我們在實際工作中也很難完全按照它的方式來實現,都會有所取捨,比如說為了業務我們還是會需要一些寬表,有時候還會有很多的資料冗餘。

維度模型在很多開源的系統都中都有支援,比如Kylin,在建模的時候就是用的維度建模中的星型模型,當然在最新版本中也支援了雪花模型。

 

轉載