作者:蔣步星
本文長度為1320字, 建議閱讀3分鐘
本文為你講解JOIN延伸之維度的其他應用。
明確維度定義後, 還可以換一種更清晰的方式來審視資料庫的結構。
這是我們常見的E-R圖:
E-R圖是個網狀結構, 實體(表)之間的外鍵關係直接畫在圖上, 當實體較多時這個圖就會顯得非常零亂, 關聯線很隨意, 任何兩個實體之間都有可能發生關聯, 表現出來的資料結構耦合度很高。 在增加刪除實體時就要考慮與之關聯的所有其它實體,
而如果把維度抽取出來之後, 我們可以使用匯流排式的結構圖:
所有維度單獨列出來處於中心地位, 實體(表)只和維度發生關聯, 實體之間沒有直接的關聯線, 資料結構的耦合度看起來很低。
不過, 需要指出的是。 無論是E-R圖還是匯流排圖, 只要畫正確時, 其中的關聯線數量是差不多的, 這是資料本身的關係決定的。 匯流排圖並不會比E-R中的關聯線更少, 但改變了看待方法後會更清晰。
為了提供關聯查詢能力, 有些BI產品將表間關聯關係(相當於一個局部E-R圖)直接暴露給業務人員, 這不是個好辦法, 業務人員難以理解E-R圖, 這個方案的可用性很差。 如果能夠由業務人員選擇了資料項目(欄位)後就自動建立出合理的關聯, 那樣可用性就能提高很多了。
有了維度概念, 就可以一定程度地實現這一目標。
業務人員任意選擇了欄位之後,
不過, 這種辦法不能處理同表自關聯和表間有多個同維欄位的情況, 以及多次遞迴關聯的問題。 想要完善地解決問題, 還是需要基於DQL語法來實現關聯。
上面的討論中, 我們會把發現的同維欄位JOIN起來,
是的, 只要是同維欄位, JOIN起來總能想出合理業務意義。 反過來, 也只有同維欄位之間可以JOIN, 不同維欄位的JOIN是沒有業務意義的, 不過SQL並不禁止, 只要資料類型相同就可以JOIN。 欄位同維和JOIN有業務意義是等價的, DQL在這方面可以確保這一點。
DQL中GROUP BY總是要對應著ON(如果單表可以看成是省略ON), 也就是說, GROUP BY總是針對某個維度進行的。 事實上也是這樣, 針對測度的分組運算沒有業務意義, 不過SQL並沒有明確出維度和測度的概念, 也不會禁止這個運算。 DQL則確保了不會發生無業務意義的分組。
利用這個特點, 可以提高分組運算的性能。 維度可能的取值是由維表長度決定的, 而維表是事先知道的,這樣在分組時可以採用類似基數排序法的手段提速,當然,針對維度的排序運算也可以用這種辦法。不過,這個演算法細節與本篇主題相關性較低,這裡就不詳細說明了。
而維表是事先知道的,這樣在分組時可以採用類似基數排序法的手段提速,當然,針對維度的排序運算也可以用這種辦法。不過,這個演算法細節與本篇主題相關性較低,這裡就不詳細說明了。