第36期:JOIN延伸:維度概念
談到數(shù)據(jù)分析時(shí)常常會(huì)用到維度這個(gè)詞,針對(duì)數(shù)據(jù)立方體的鉆取、旋轉(zhuǎn)、切片等操作都是圍繞維度進(jìn)行的,幾乎所有的數(shù)據(jù)分析人員都知道并會(huì)運(yùn)用這個(gè)術(shù)語(yǔ),但要問(wèn)及它的定義,卻幾乎沒(méi)有人能給出來(lái)。
通俗來(lái)講,我們把用來(lái)分類的屬性(字段)稱為維度,比如地區(qū)、年度、產(chǎn)品類型等;而另外一些用于聚合運(yùn)算的屬性則稱為測(cè)度,比如銷售額、產(chǎn)量、考試成績(jī)等。維度不能做聚合運(yùn)算,比如計(jì)算地區(qū)合計(jì)是沒(méi)有意義的;測(cè)度則不能用于分類,比如按銷售額分類也沒(méi)什么業(yè)務(wù)意義。我們通常就是用是否”可用于分類“來(lái)判定一個(gè)屬性是不是維度,但這其實(shí)只是對(duì)于維度性質(zhì)的描述,并不能作為定義。
一
我們基于關(guān)系數(shù)據(jù)庫(kù)來(lái)討論這個(gè)問(wèn)題,先簡(jiǎn)單回顧一下基本概念。
設(shè)有一個(gè)關(guān)系數(shù)據(jù)庫(kù),其中有若干數(shù)據(jù)表,表的數(shù)據(jù)結(jié)構(gòu)由字段構(gòu)成,表的數(shù)據(jù)由記錄構(gòu)成。
數(shù)據(jù)表的某些字段被指定為主鍵,需要滿足這樣的條件:表中所有記錄在這些字段上的取值是互不相同的。也就是說(shuō),可以用主鍵值來(lái)***確定相應(yīng)的記錄。數(shù)據(jù)表可以沒(méi)有主鍵,但有只能有一套。構(gòu)成主鍵的字段稱為主鍵字段。
每個(gè)數(shù)據(jù)表可以有多套外鍵,外鍵也是該數(shù)據(jù)表的某些字段,其取值總是在另一個(gè)表(可能是本表)的主鍵取值范圍內(nèi)。這里的另一個(gè)表被稱為外鍵指向表,簡(jiǎn)稱外鍵表,構(gòu)成外鍵的字段被稱為外鍵字段。
現(xiàn)在,我們定義:在關(guān)系數(shù)據(jù)庫(kù)中,不是外鍵字段的主鍵字段被稱為維度,維度所在的表稱為維表,維度可以用維表的主鍵字段來(lái)標(biāo)識(shí)。順便地,我們定義即不是主鍵字段也不是外鍵字段的字段為測(cè)度。從這個(gè)定義上看,顯然不可能某個(gè)字段即是維度又是測(cè)度。
需要說(shuō)明的是,我們這里所說(shuō)的主鍵外鍵是指邏輯意義上的概念,也就是在數(shù)據(jù)的E-R結(jié)構(gòu)設(shè)計(jì)中的主外鍵。有時(shí)為了性能而在物理數(shù)據(jù)結(jié)構(gòu)中并不真地建立主鍵和外鍵,這種情況不在我們的考慮范圍內(nèi)。
二
先從一些例子來(lái)理解維度的定義。
看這兩個(gè)同維表:
我們會(huì)在manager表建立外鍵,字段為id,指向employee表的主鍵id。這時(shí),manage.id就即是主鍵字段也是外鍵字段,那么它不是維度。而employee.id是主鍵字段而不是外鍵字段,那么它就是維度。
再看主子表的情況:
OrderDetail.id是主鍵字段,但也是指向Orders表的外鍵字段,所以它不是維度。而Orders.id是主鍵字段但不是外鍵字段,那么它是維度,OrderDetail.no是主鍵字段且不是外鍵字段,它也是維度。
OrderDetail.no這個(gè)維度有些特殊,一般來(lái)說(shuō),不會(huì)有另外一個(gè)外鍵字段和它關(guān)聯(lián)了,我們把這種未被指向的維度稱為孤維。在查詢界面中做維度對(duì)齊運(yùn)算時(shí)一般不用列出來(lái)孤維。
三
再來(lái)檢驗(yàn)這個(gè)定義是否和常規(guī)的維度觀念相符,并且對(duì)于不相符的情況要給出合理的解決方案。
對(duì)于地區(qū)、產(chǎn)品這些常規(guī)維度,數(shù)據(jù)庫(kù)中都會(huì)有對(duì)應(yīng)的地區(qū)表、產(chǎn)品表,那么這些維度就對(duì)應(yīng)了這些表的主鍵字段,符合我們定義。而銷售額、產(chǎn)量等屬性則不可能對(duì)應(yīng)到某個(gè)表的主鍵,所以確實(shí)也不是維度。
但日期(或年度)呢?它顯然是個(gè)維度,但數(shù)據(jù)庫(kù)中并沒(méi)有一個(gè)表以它為主鍵,似乎不符合我們的維度定義。
事實(shí)上,所有用到日期數(shù)據(jù)類型的數(shù)據(jù)庫(kù)在邏輯上都應(yīng)當(dāng)有一個(gè)日期表,其它數(shù)據(jù)表的日期型字段均可以視為指向這個(gè)日期表的外鍵。但由于日期的相關(guān)信息都可以由日期本身計(jì)算出來(lái)(年度、月份等),而沒(méi)有需要單獨(dú)存儲(chǔ)的屬性,因此我們通常不會(huì)在物理數(shù)據(jù)庫(kù)中建立這個(gè)日期表。那么,只要在邏輯上恢復(fù)這個(gè)日期表,日期就符合前面的維度定義了。我們把這種邏輯上應(yīng)該有但物理上并未建立的表稱為假表,假表可以看成是一個(gè)單字段無(wú)記錄的表,這個(gè)單字段也就是該表的主鍵,這樣就可以承載沒(méi)有物理表的維度了。類似地,年度、月份也都可以用假表定義。
四
再觀察年齡這種屬性,它有可能用于分類(每個(gè)年齡的人數(shù)),又可能用于聚合(某部門人員的平均年齡),從性質(zhì)上看,它似乎即是維度又是測(cè)度?這就與我們的定義相悖了。
其實(shí),我們?cè)谟媚挲g分類統(tǒng)計(jì)時(shí)并不是用年齡值本身,而是年齡段,年齡本身應(yīng)該是個(gè)實(shí)數(shù)值,這是不能用于分類的。也就是說(shuō),年齡是測(cè)度,而通過(guò)年齡計(jì)算出來(lái)的年齡段才是個(gè)維度。這時(shí)候,我們要引入維函數(shù)概念,維函數(shù)以某個(gè)字段值為參數(shù),返回某個(gè)維度的取值。通過(guò)維函數(shù)可以把測(cè)度轉(zhuǎn)換成維度,在它的幫助下,我們就可以保持維度的嚴(yán)格定義,同時(shí)又不和常規(guī)觀念矛盾。
五
這里的維度定義是基于外鍵概念的,而我們知道,外鍵實(shí)際上定義了表之間的JOIN關(guān)系。從這個(gè)意義上講,維度是被JOIN定義的!































