99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀漫談數(shù)據(jù)倉(cāng)庫(kù)之維度建模
漫談數(shù)據(jù)倉(cāng)庫(kù)之維度建模
2017-06-11
收藏

漫談數(shù)據(jù)倉(cāng)庫(kù)之維度建模

下面的內(nèi)容,是筆者在學(xué)習(xí)和工作中的一些總結(jié),其中概念性的內(nèi)容大多來自書中,實(shí)踐性的內(nèi)容大多來自自己的工作和個(gè)人理解。由于資歷尚淺,難免會(huì)有很多錯(cuò)誤,望批評(píng)指正!

概述
數(shù)據(jù)倉(cāng)庫(kù)包含的內(nèi)容很多,它可以包括架構(gòu)、建模和方法論。對(duì)應(yīng)到具體工作中的話,它可以包含下面的這些內(nèi)容:
以hadoop、Spark、Hive等組建為中心的數(shù)據(jù)架構(gòu)體系。
各種數(shù)據(jù)建模方法,如維度建模。
調(diào)度系統(tǒng)、元數(shù)據(jù)系統(tǒng)、ETL系統(tǒng)、可視化系統(tǒng)這類輔助系統(tǒng)。
我們暫且不管數(shù)據(jù)倉(cāng)庫(kù)的范圍到底有多大,在數(shù)據(jù)倉(cāng)庫(kù)體系中,數(shù)據(jù)模型的核心地位是不可替代的。
因此,下面的將詳細(xì)地闡述數(shù)據(jù)建模中的典型代表:維度建模,對(duì)它的的相關(guān)理論以及實(shí)際使用做深入的分析。
文章結(jié)構(gòu)
本文將按照下面的順序進(jìn)行闡述:
先介紹比較經(jīng)典和常用的數(shù)據(jù)倉(cāng)庫(kù)模型,并分析其優(yōu)缺點(diǎn)。
詳細(xì)介紹維度建模的基本概念以及相關(guān)理論。
為了能更真切地理解什么是維度建模,我將模擬一個(gè)大家都十分熟悉的電商場(chǎng)景,運(yùn)用前面講到的理論進(jìn)行建模。
理論和現(xiàn)實(shí)的工作場(chǎng)景畢竟會(huì)有所差距,這一塊,我會(huì)分享一下企業(yè)在實(shí)際的應(yīng)用中所做出的取舍。
0x01 經(jīng)典數(shù)據(jù)倉(cāng)庫(kù)模型
下面將分別介紹四種數(shù)據(jù)倉(cāng)庫(kù)模型,其中前三種模型分別對(duì)應(yīng)了三本書:《數(shù)據(jù)倉(cāng)庫(kù)》、《數(shù)據(jù)倉(cāng)庫(kù)工具箱》和《數(shù)據(jù)架構(gòu) 大數(shù)據(jù) 數(shù)據(jù)倉(cāng)庫(kù)以及Data Vault》,這三本書都有中文版,非常巧的是,我只有三本數(shù)據(jù)倉(cāng)庫(kù)的書,正好對(duì)應(yīng)了這三種理論。
Anchor模型我并不是特別熟悉,放在這里以供參考。
一、實(shí)體關(guān)系(ER)模型
數(shù)據(jù)倉(cāng)庫(kù)之父Immon的方法從全企業(yè)的高度設(shè)計(jì)一個(gè)3NF模型,用實(shí)體加關(guān)系描述的數(shù)據(jù)模型描述企業(yè)業(yè)務(wù)架構(gòu),在范式理論上符合3NF,它與OLTP系統(tǒng)中的3NF的區(qū)別,在于數(shù)據(jù)倉(cāng)庫(kù)中的3NF上站在企業(yè)角度面向主題的抽象,而不是針對(duì)某個(gè)具體業(yè)務(wù)流程的實(shí)體對(duì)象關(guān)系抽象,它更多的是面向數(shù)據(jù)的整合和一致性治理,正如Immon所希望達(dá)到的:“single version of the truth”。
但是要采用此方法進(jìn)行構(gòu)建,也有其挑戰(zhàn):

需要全面了解企業(yè)業(yè)務(wù)和數(shù)據(jù)
實(shí)施周期非常長(zhǎng)
對(duì)建模人員的能力要求也非常高

二、維度模型
維度模型是數(shù)據(jù)倉(cāng)庫(kù)領(lǐng)域另一位大師Ralph Kimall所倡導(dǎo),他的《The DataWarehouse Toolkit-The Complete Guide to Dimensona Modeling,中文名《數(shù)據(jù)倉(cāng)庫(kù)工具箱》,是數(shù)據(jù)倉(cāng)庫(kù)工程領(lǐng)域最流行的數(shù)倉(cāng)建模經(jīng)典。維度建模以分析決策的需求出發(fā)構(gòu)建模型,構(gòu)建的數(shù)據(jù)模型為分析需求服務(wù),因此它重點(diǎn)解決用戶如何更快速完成分析需求,同時(shí)還有較好的大規(guī)模復(fù)雜查詢的響應(yīng)性能。
典型的代表是我們比較熟知的星形模型,以及在一些特殊場(chǎng)景下適用的雪花模型。
三、DataVault
DataVault是Dan Linstedt發(fā)起創(chuàng)建的一種模型方法論,它是在ER關(guān)系模型上的衍生,同時(shí)設(shè)計(jì)的出發(fā)點(diǎn)也是為了實(shí)現(xiàn)數(shù)據(jù)的整合,并非為數(shù)據(jù)決策分析直接使用。它強(qiáng)調(diào)建立一個(gè)可審計(jì)的基礎(chǔ)數(shù)據(jù)層,也就是強(qiáng)調(diào)數(shù)據(jù)的歷史性可追溯性和原子性,而不要求對(duì)數(shù)據(jù)進(jìn)行過度的一致性處理和整合;同時(shí)也基于主題概念將企業(yè)數(shù)據(jù)進(jìn)行結(jié)構(gòu)化組織,并引入了更進(jìn)一步的范式處理來優(yōu)化模型應(yīng)對(duì)源系統(tǒng)變更的擴(kuò)展性。
它主要由:Hub(關(guān)鍵核心業(yè)務(wù)實(shí)體)、Link(關(guān)系)、Satellite(實(shí)體屬性) 三部分組成 。
四、Anchor模型
Anchor模型是由Lars. R?nnb?ck設(shè)計(jì)的,初衷是設(shè)計(jì)一個(gè)高度可擴(kuò)展的模型,核心思想:所有的擴(kuò)展只是添加而不是修改,因此它將模型規(guī)范到6NF,基本變成了K-V結(jié)構(gòu)模型。
Anchor模型由:Anchors 、Attributes 、Ties 、Knots 組成,相關(guān)細(xì)節(jié)可以參考《AnchorModeling-Agile Information Modeling in Evolving Data Environments》
0x02 維度建模一、什么是維度建模
維度模型是數(shù)據(jù)倉(cāng)庫(kù)領(lǐng)域大師Ralph Kimall所倡導(dǎo),他的《數(shù)據(jù)倉(cāng)庫(kù)工具箱》,是數(shù)據(jù)倉(cāng)庫(kù)工程領(lǐng)域最流行的數(shù)倉(cāng)建模經(jīng)典。維度建模以分析決策的需求出發(fā)構(gòu)建模型,構(gòu)建的數(shù)據(jù)模型為分析需求服務(wù),因此它重點(diǎn)解決用戶如何更快速完成分析需求,同時(shí)還有較好的大規(guī)模復(fù)雜查詢的響應(yīng)性能。
我們換一種方式來解釋什么是維度建模。學(xué)過數(shù)據(jù)庫(kù)的童鞋應(yīng)該都知道星型模型,星型模型就是我們一種典型的維度模型。我們?cè)谶M(jìn)行維度建模的時(shí)候會(huì)建一張事實(shí)表,這個(gè)事實(shí)表就是星型模型的中心,然后會(huì)有一堆維度表,這些維度表就是向外發(fā)散的星星。那么什么是事實(shí)表、什么又是維度表嗎,下面會(huì)專門來解釋。
二、維度建模的基本要素
維度建模中有一些比較重要的概念,理解了這些概念,基本也就理解了什么是維度建模。
1. 事實(shí)表
發(fā)生在現(xiàn)實(shí)世界中的操作型事件,其所產(chǎn)生的可度量數(shù)值,存儲(chǔ)在事實(shí)表中。從最低的粒度級(jí)別來看,事實(shí)表行對(duì)應(yīng)一個(gè)度量事件,反之亦然。
額,看了這一句,其實(shí)是不太容易理解到底什么是事實(shí)表的。

比如一次購(gòu)買行為我們就可以理解為是一個(gè)事實(shí),下面我們上示例。

圖中的訂單表就是一個(gè)事實(shí)表,你可以理解他就是在現(xiàn)實(shí)中發(fā)生的一次操作型事件,我們每完成一個(gè)訂單,就會(huì)在訂單中增加一條記錄。
我們可以回過頭再看一下事實(shí)表特征,在維度表里沒有存放實(shí)際的內(nèi)容,他是一堆主鍵的集合,這些ID分別能對(duì)應(yīng)到維度表中的一條記錄。
2. 維度表
每個(gè)維度表都包含單一的主鍵列。維度表的主鍵可以作為與之關(guān)聯(lián)的任何事實(shí)表的外鍵,當(dāng)然,維度表行的描述環(huán)境應(yīng)與事實(shí)表行完全對(duì)應(yīng)。 維度表通常比較寬,是扁平型非規(guī)范表,包含大量的低粒度的文本屬性。
我們的圖中的用戶表、商家表、時(shí)間表這些都屬于維度表,這些表都有一個(gè)唯一的主鍵,然后在表中存放了詳細(xì)的數(shù)據(jù)信息。
0x03 實(shí)踐
下面我們將以電商為例,詳細(xì)講一下維度建模的建模方式,并舉例如果使用這個(gè)模型(這點(diǎn)還是很重要的)。
一、業(yè)務(wù)場(chǎng)景
假設(shè)我們?cè)谝患译娚叹W(wǎng)站工作,比如某寶、某東。我們需要對(duì)這里業(yè)務(wù)進(jìn)行建模。下面我們分析幾點(diǎn)業(yè)務(wù)場(chǎng)景:
電商網(wǎng)站中最典型的場(chǎng)景就是用戶的購(gòu)買行為。
一次購(gòu)買行為的發(fā)起需要有這幾個(gè)個(gè)體的參與:購(gòu)買者、商家、商品、購(gòu)買時(shí)間、訂單金額。
一個(gè)用戶可以發(fā)起很多次購(gòu)買的動(dòng)作。
好,基于這幾點(diǎn),我們來設(shè)計(jì)我們的模型。
二、模型設(shè)計(jì)

下面就是我們?cè)O(shè)計(jì)出來的數(shù)據(jù)模型,和之前的基本一樣,只不過是換成了英文,主要是為了后面寫sql的時(shí)候來用。

我就不再解釋每個(gè)表的作用了,現(xiàn)在只說一下為什么要這樣設(shè)計(jì)。

首先,我們想一下,如果我們不這樣設(shè)計(jì)的話,我們一般會(huì)怎么做?

如果是我,我會(huì)設(shè)計(jì)下面這張表。你信不信,我能列出來50個(gè)字段!其實(shí)我個(gè)人認(rèn)為怎么設(shè)計(jì)這種表都有其合理性,我們不論對(duì)錯(cuò),單說一下兩者的優(yōu)缺點(diǎn)。

先說我們的維度模型:
數(shù)據(jù)冗余?。ㄒ?yàn)楹芏嗑唧w的信息都存在相應(yīng)的維度表中了,比如用戶信息就只有一份)
結(jié)構(gòu)清晰(表結(jié)構(gòu)一目了然)
便于做OLAP分析(數(shù)據(jù)分析用起來會(huì)很開心)
增加使用成本,比如查詢時(shí)要關(guān)聯(lián)多張表
數(shù)據(jù)不一致,比如用戶發(fā)起購(gòu)買行為的時(shí)候的數(shù)據(jù),和我們維度表里面存放的數(shù)據(jù)不一致
再說我們這張大款表的優(yōu)缺點(diǎn):
業(yè)務(wù)直觀,在做業(yè)務(wù)的時(shí)候,這種表特別方便,直接能對(duì)到業(yè)務(wù)中。
使用方便,寫sql的時(shí)候很方便。
數(shù)據(jù)冗余巨大,真的很大,在幾億的用戶規(guī)模下,他的訂單行為會(huì)很恐怖
粒度僵硬,什么都寫死了,這張表的可復(fù)用性太低。
三、使用示例
數(shù)據(jù)模型的建立必須要為更好的應(yīng)用來服務(wù),下面我先舉一個(gè)例子,來切實(shí)地感受一下來怎么用我們的模型。
需求:求出2016年在帝都的男性用戶購(gòu)買的LV品牌商品的總價(jià)格。
實(shí)現(xiàn):
[AppleScript]
SELECT
SUM(order.money)
FROM
order,
product,
date,
address,
user,
WHERE
date.year = '2016'
AND user.sex = 'male'
AND address.province = '帝都'
AND product.name [/color][/size][/font][/size][size=16px][font=微軟雅黑][size=3][color=black]= 'LV'
0xFF 總結(jié)
維度建模是一種十分優(yōu)秀的建模方式,他有很多的優(yōu)點(diǎn),但是我們?cè)趯?shí)際工作中也很難完全按照它的方式來實(shí)現(xiàn),都會(huì)有所取舍,比如說為了業(yè)務(wù)我們還是會(huì)需要一些寬表,有時(shí)候還會(huì)有很多的數(shù)據(jù)冗余。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }