PowerBI中的模型關(guān)系相信小伙伴們都不會感覺到陌生,因為一份優(yōu)秀的報表無法離開數(shù)據(jù)模型的支撐呕臂。
對比其它BI類工具而言,白茶認為其建模功能才是最為突出的功能點。
模型關(guān)系類型
PowerBI中我們常用的模型關(guān)系一共包含5類:
一對一關(guān)系
(1:1)
一對多關(guān)系
(1:*)
多對多關(guān)系
(*:*)
虛線關(guān)系
(1:N)
無關(guān)系
多對一
關(guān)系在白茶看來與一對多其實沒有太大區(qū)別无午,這里就不單獨羅列了。
一對一
一對一關(guān)系通常表示維度表中的所有維度與事實表中都是一一對應(yīng)的祝谚。
假設(shè)Dim表中只有3行數(shù)據(jù)宪迟,那么與之對應(yīng)的Fact表也是只有3行數(shù)據(jù),這種場景在實際應(yīng)用中并不多見交惯。
一對一關(guān)系可以設(shè)置篩選器方向為交叉篩選次泽,即除了利用Dim表來篩選Fact表以外,用Fact表也可以反向來篩選Dim表席爽。
如果想避免一對一情況下Fact表對Dim進行篩選意荤,可以將模型關(guān)系更改為一對多
,再將模型篩選器方向改為單向
即可只锻。
一對多
一對多關(guān)系可以說是模型關(guān)系中最常見的一種玖像,也是使用頻率最高的一種了,通常表示Fact表中的多行記錄屬性在Dim表中均可以找到對應(yīng)項齐饮,也是主流模型的設(shè)計思路捐寥。
也因此派生出了兩種模型設(shè)計思路:星型模型
和雪花模型
。
多對多
多對多的關(guān)系通常發(fā)生在數(shù)據(jù)顆粒度不統(tǒng)一
的場景祖驱,例如Fact表中最細的顆粒度包含產(chǎn)品握恳、門店、銷售羹膳、地區(qū)睡互,而Target目標只針對門店或者地區(qū)。
那么這種情況下陵像,將Fact和Target在同一個上下文中展示就珠,且包含銷售顆粒度的時候,則相同門店或相同地區(qū)的銷售其Target值是一致的醒颖。
類似于這種場景妻怎,也有可能是兩張Fact表相關(guān)聯(lián),需要注意交叉篩選器方向
泞歉。
虛線關(guān)系
我們在創(chuàng)建模型關(guān)系時逼侦,一旦勾選了使此關(guān)系可用
,那么創(chuàng)建的模型關(guān)系都屬于實線關(guān)系
腰耙,通常也叫激活的關(guān)系
榛丢。
與之對應(yīng)的,取消使此關(guān)系可用
的模型關(guān)系則為虛線關(guān)系
挺庞,也叫未激活的關(guān)系
晰赞。
這種情況通常發(fā)生在Fact表中存在雙屬性列與同一Dim表建立關(guān)系時。
例如:
Fact表中既有訂單日期,也有發(fā)貨日期和送達日期掖鱼,都需要與日期表建立關(guān)聯(lián)然走,模型之間只能有1條激活關(guān)系,那么剩下的2條關(guān)系則處于未激活的狀態(tài)戏挡。
這個場景在實際應(yīng)用中并不多見芍瑞,面對未激活的關(guān)系,我們可以在構(gòu)建DAX函數(shù)時褐墅,通過USERELATIONSHIP
函數(shù)來激活其他關(guān)系拆檬。
無關(guān)系
無關(guān)系其實比較好理解,就是表與表之間掌栅,并不存在任何關(guān)系
秩仆。
對比上面的其他類型關(guān)系的使用率,無關(guān)系僅次于一對多猾封。
是的澄耍,你沒看錯,無關(guān)系使用頻率非常的高晌缘。
無關(guān)系適用場景非常的多齐莲,在字段參數(shù)功能發(fā)布之前,我們需要創(chuàng)建動態(tài)軸磷箕,需要創(chuàng)建多屬性維度表時选酗,需要無關(guān)系。
服裝場景下岳枷,需要篩選某一顏色的產(chǎn)品銷量芒填,且單個SKU是包含多顏色時,需要無關(guān)系空繁。
RLS權(quán)限設(shè)計時殿衰,權(quán)限表與維度表之間也是無關(guān)系。
而在DAX函數(shù)中盛泡,可以用來處理無關(guān)系的函數(shù)闷祥,也非常的多,比如IN傲诵、TREATAS凯砍、INTERSECT、FIND拴竹、SEARCH悟衩、VAR
等,這些其實都可以用來處理無關(guān)系栓拜。
當然座泳,從性能的角度出發(fā)斑响,雖然TREATAS
函數(shù)某些場合下表現(xiàn)接近于實線關(guān)系,但還是推薦使用實線關(guān)系钳榨。
星型模型與雪花模型
星型模型
星型模型表示Fact表位于中心,Dim表直接與事實表建立模型關(guān)系纽门。
對于DAX計算來說薛耻,星型模型其實適用大部分場景,而且很大程度上可以避免模型設(shè)計上帶來的性能損耗
赏陵。
雪花模型
雪花模型表示Dim表經(jīng)過規(guī)范化處理饼齿,多個Dim表通過串聯(lián)的方式,與Fact表關(guān)聯(lián)到一塊蝙搔,單表沒有冗余缕溉,可以避免數(shù)據(jù)冗余的存儲問題
。
缺點也很明顯吃型,在DAX計算的時候证鸥,會因為雪花模型導致上下文轉(zhuǎn)化過程中產(chǎn)生性能損耗
。
模型關(guān)系注意事項
參照完整性
從概念上來說勤晚,參照完整性并不是很好理解枉层,說的通俗一點就是Fact中的維度,Dim表中不存在
赐写。
如上圖所示鸟蜡,F(xiàn)act表存在的類別在Dim表是不存在的,因此這些行值所對應(yīng)的數(shù)據(jù)都會被匯總歸類到空白
挺邀。
如果Dim表中的類別本身就包含空白選項揉忘,那么因為參照完整性的空白數(shù)據(jù)會與空白選項的數(shù)據(jù)合并
。
這其實是不利于后期運維的端铛,因此要盡量保證Dim表與Fact表的維度都是完整的泣矛。
有趣的是,VALUES參照完整性
沦补,DISTINCT不考慮參照完整性
乳蓄,感興趣的小伙伴可以自己動手測試。
注意夕膀,因為模型關(guān)系產(chǎn)生的擴展表相關(guān)問題這里就不贅述了虚倒。
日期表
日期表單獨拿出來講的原因就是因為它太重要了,日常開發(fā)中用戶需要的指標基本上都無法脫離同環(huán)比产舞,因此日期表是重中之重魂奥。
日期列需要注意日期和日期/時間不是一回事
能使用自己創(chuàng)建的日期表,就不要使用內(nèi)部自動生成的
能使用DAX函數(shù)自己計算時間指標易猫,就不要使用時間智能函數(shù)
能標記日期表就進行標記耻煤,可以避免模型中出現(xiàn)隱藏的自動日期表
文件設(shè)置中的
新文件的自動日期/時間
和自動關(guān)系
一定要關(guān)閉
以下是利用DAX創(chuàng)建日期表的通用代碼,可以根據(jù)Fact日期創(chuàng)建對應(yīng)的日期表:
Dim_Date =
GENERATE (
CALENDAR ( MIN ( 'Fact'[DATE] ), MAX ( 'Fact'[DATE] ) ),
//'Fact'[DATE]需要根據(jù)自身情況調(diào)整
VAR DA = [Date]
VAR YEAR =
YEAR ( DA )
VAR QUARTER =
"Q" & FORMAT ( DA, "Q" )
VAR MONTE =
FORMAT ( DA, "MM" )
VAR DAY =
DAY ( DA )
RETURN
ROW (
"Year", YEAR,
"Quarter", QUARTER,
"Month", MONTE,
"DayOfMonth", DAY,
"YearQuarter", YEAR & QUARTER,
"YearMonth", YEAR & MONTE,
"YearMonthCount",
YEAR * 12 + MONTE
)
)
安全篩選器
當模型關(guān)系為一對一或者多對多時,此時交叉篩選器方向
選擇雙向哈蝇,則可以選擇是否在兩個方向上應(yīng)用安全篩選器
棺妓。
如圖,我們現(xiàn)在添加了RLS
權(quán)限炮赦,設(shè)定Fact_Sales
表的Key等于A怜跑。
模型未應(yīng)用安全篩選器,其結(jié)果如下:
模型應(yīng)用了安全篩選器吠勘,其結(jié)果如下:
不開安全篩選器性芬,則RLS僅對
單表生效
,打開安全篩選器剧防,則RLS會對雙端表生效
植锉。
題外話
某些場景下,F(xiàn)act表中可能缺少某些Dim表屬性峭拘,需要創(chuàng)建列將Dim與Fact表關(guān)聯(lián)俊庇,這種場景下切忌將列設(shè)置為Blank
或Null
,一定要將列設(shè)置一個默認值
鸡挠,否則有可能造成云端數(shù)據(jù)刷新問題
暇赤。