日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

寬表和窄表

 想不出一個昵稱 2019-11-20

閱讀目錄

寬表和窄表

寬表和窄表的建設該如何選擇?

這個問題相信糾結(jié)了很多從是數(shù)據(jù)庫開發(fā)、數(shù)據(jù)倉庫開發(fā)和后臺開發(fā)人員;單單考慮這個問題,難給出一個絕對的答案;本人從事數(shù)據(jù)倉庫開發(fā)工作到現(xiàn)在已經(jīng)有一年半時間了,對于這個問題,我也曾經(jīng)糾結(jié)過,但是是否有絕對的答案呢?事實上任何東西都沒有絕對的說法。

考慮這樣的一個問題,一個公司有這樣的一個需求:

設計銷售領域的訂單事實表,該事實表應該包含哪些維度和度量?事實表和維表該分別如何去設計?

好了,我們把關鍵信息拿出來,首先我們要有維度包括:銷售員、銷售員所屬部門、下訂單的時間;度量:銷售量;

那么,訂單事實表,其實就是一個商品銷售的清單;

依照這個思路,我們建立的第一個模型可能是以下這樣的:

單單看上去,貌似是符合我們的問題的需要,而且符合數(shù)據(jù)庫的范式設計:沒有冗余字段;但是情況真的就是這樣嗎?

答案是否定的,確實對于一般的OLTP系統(tǒng)而言這樣的表設計確實減少了冗余和,增刪改查等操作也很方便,但是往往對于我們的統(tǒng)計系統(tǒng)、OLAP、數(shù)據(jù)挖掘而言,情況卻并非如此,舉個例子:我們要統(tǒng)計每個部門各自的銷售量為多少?那么對于上表,sql是這樣的:

select a.*,b.sid into #dep_saleser from department a,saleser_dim b on a.dep_id = b.dep_id;

select count(1),a.dep_name from #dep_saleser a,order_fact b on a.sid=b.sid group by a.dep_name;

對于這么一個簡單的需求已經(jīng)要寫兩了sql去實現(xiàn)了,其實數(shù)據(jù)庫表模型的的設計是靈活的,我們完全可以根據(jù)我們的業(yè)務去設計我們的數(shù)據(jù)表;考慮到部門和銷售員可以是同屬于銷售者這個維度,只是他們是有上下級別關系的那么依照這個思路,我們的模型可以建立為下面這樣:

那么統(tǒng)計每個部門各自的銷售量,可以用如下sql去實現(xiàn):

select count(1),a.dep_name from saleser_dim a,order_fact b

on a.sid=b.sid group by a.dep_name;

確實對于這個模型而言,有些情況下會出現(xiàn)冗余(填寫用戶,沒有填寫部門;填寫部門沒填寫用戶);但是對于提取數(shù)統(tǒng)計的邏輯又相對來說要簡單了好多;

考慮到要實現(xiàn)取數(shù)簡單,我們還可以想出另外一種方法:

  看上去好像不錯哦~~,取數(shù)據(jù)也就一句sql就搞掂了,但是卻是最最槽糕的情況,有可能一個銷售員,前幾天登記的部門是a,但是其實他的所屬于的部門為b,那么對于上面這個模型,我們得改動銷售員和訂單表;而對于上面的其他兩個模型都僅僅需要改動一張表就行了,造成查詢數(shù)據(jù)部一致往往也就是這種數(shù)據(jù)模型所造成的。

    所謂的寬表就是字段比較多的表,包含的維度層次比較多,造成冗余也比較多,毀范式設計,但是利于取數(shù)統(tǒng)計,而窄表往往對于OLTP比較合適,符合范式設計原則;

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多