聊聊數倉模型雜燴
本文轉載自微信公眾號「曾二爺」,作者曾二爺。轉載本文請聯系曾二爺公眾號。
一、什么是建模
人的大腦算力有限,世界又太過于復雜。需要將你的關注點抽象出簡單模型,用于問題的研究和解決。
比如數學建模,將關注的問題抽象成數學模型進行解決;比如AAARR增長黑客模型,抽象出用戶的5個生命周期進行研究和指導行動。
而數據建模便是將問題域用數據表示出。
二、業(yè)務模型
接下來我們以下面的公立校業(yè)務場景來進行探討:
老師創(chuàng)建作業(yè)布置到多個班級
班級里的學生做完后提交作業(yè)(一個學生只有一個班級)
這里涉四種實體(老師、作業(yè)、班級、學生)及四個業(yè)務流程(創(chuàng)建作業(yè)、布置作業(yè)、做作業(yè)、交作業(yè))。
三、關系型三范式模型
服務端的同學為了在關系型數據庫中滿足業(yè)務快速增刪改查,盡量減少數據冗余,常常采用三范式進行數據建模。
針對上述業(yè)務一般會有(老師、作業(yè)、班級、學生)四種實體表和(班級-作業(yè)、學生-作業(yè))兩個關系表。
創(chuàng)建作業(yè)這個業(yè)務弱化到了作業(yè)表中
布置作業(yè)體現在班級-作業(yè)關系表中
做作業(yè)和交作業(yè)融合到學生-作業(yè)關系表中
這樣我們6個表的增刪改查就可以實現這個業(yè)務。
四、數倉模型
4.1 維度建模
到了數倉我們主要將數據用于分析,一般采用維度建模將三范式模型進行重構。劃分維度和事實,建立不同層級的數據,滿足多種分析場景。
當我們需要分析的是老師布置作業(yè)到班級這個業(yè)務過程時,作業(yè)-班級就相當于事實表,維度表有班級、作業(yè)。
4.2 粒度
業(yè)務過程會有不同的粒度,比如學生-作業(yè)的粒度就比班級-作業(yè)更細。粗粒度的班級-作業(yè)能匯總學生-作業(yè)的一些信息,比如某份作業(yè)某個班級有多少人提交。
一般我們會重點建設各個業(yè)務過程的最細粒度的事實表,方便后面的多級粒度的匯總。
4.3 歷史與現在
通常來說數倉從業(yè)務庫同步過來的數據都是當前數據的一個鏡像,業(yè)務庫的模型都是針對于當前業(yè)務的,不會保存歷史的信息。比如新的學期班級表中的年級屬性會變更,業(yè)務庫就直接進行更改。
到了數倉如果我們要計算歷史作業(yè)的提交信息,那就得保存學生提交作業(yè)的當時他所在的年級。像年級慢慢變化的維度我們稱之為緩慢變化維。
處理方式既可以建立一個班級歷史信息表,關聯的時候帶上時間,也可以將年級信息‘退化’到學生-作業(yè)的事實表中不再放維度表。
4.4 多事實融合
所謂寬表既可能是多個維度退化到事實表形成的,也可能是多個有關聯的事實融合而來。
比如 文中的例子我們可以通過信息的冗余和置空實現一個最極端的寬表:老師-作業(yè)-班級-學生
該表記錄了所以老師的信息,如果沒有創(chuàng)建過作業(yè)那其他的信息都為空
如果老師有創(chuàng)建過多個作業(yè)那老師的信息冗余存儲到每條作業(yè)信息
班級和學生信息也全都記錄到這個表上,如果沒有作業(yè)信息,那老師、作業(yè)信息都為空,如果有多條作業(yè)信息也進行冗余存儲
使用的時候就需要按需去重或者過濾空值
這樣融合了多個業(yè)務流程的明細,可以支撐各種業(yè)務的分析,但維護成本、存儲成本等都是很高的。