saiku、mondrian前奏之——立方体、维度、Schema的基本概念
以前介紹了幾個基本工具:saiku 和 Schema Workbench,算是入門級別的了解多維報表,如果要繼續深入,需要深入了解如下幾個概念:
1、OLAP
聯機分析處理,和他對應的是OLTP(聯機事務處理)。
OLTP:做為一個開發人員,OLTP是最常用的,甚至都不需要理解這個概念!比如各種門票銷售系統、付款系統等等。這些系統對相應速度要求特別高
OLAP:主要用于分析和決策,是數據倉庫的主要應用。比如:渠道A在2015-10-01給產品B帶來多少pv、uv、訂單、銷售額等數據,這就對分析的能力提出了很高的要求。開發人員開到這里可能會想,這是一個Sql能解決的,有必要搞出一個概念嗎?我理解是有兩個原因,首先需求非常非常多,不可能每一個都寫Sql,會累死的;其次從業務數據表里面寫這個Sql,往往非常復雜,如果數據量很大,運行時間也會很長。
下面是OLAP和OLTP的主要區別:
| ? | OLTP | OLAP |
| 用戶 | 操作人員,低層管理人員 | 決策人員,高級管理人員 |
| 功能 | 日常操作處理 | 分析決策 |
| DB設計 | 面向應用 | 面向主題 |
| 數據 | 當前的,最新的細節的,二維的分立的 | 歷吏的,聚集的,多維的,集成的,統一的 |
| 存取 | 讀/寫數十條記錄 | 讀上百萬條記錄 |
| 工作單位 | 簡單的事務 | 復雜的查詢 |
| DB大小 | 100MB-GB | 100GB-TB |
2、Mondrian
與其說Mondrian是OLAP的分析引擎,不如說就是(按照分析數據模式的XML)執行MDX語句,并輸出結果。
為什么需要OLAP引擎Mondrian?在工作中經常需要對數據量極大的數據表和相關聯的多個維度表進行查詢、匯總、軸變換以及上卷、下鉆等操作,查詢可以非常復雜,如果沒有 OLAP 引擎這是很難完成的。 想象一下,某個省份的uv是多少?某個省份某天的uv是多少?某個渠道給某個省份某天的uv是多少?某個渠道給某個省份某個城市某天的uv是多少?......要多少Sql
那么Mondrian可以將需求翻譯成sql,并執行。要求:MDX語言,翻譯規則:模式文件里面邏輯模型到物理模型的映射!
3、數據庫表
其實這不算是新的概念,這里主要是說明一下數據庫表和Mondian之間的關系。Mondrian使用JDBC鏈接數據庫,并運行在數據庫基礎上。數據表分為:事實表和維度表,這些概念可以參考:http://www.cnblogs.com/liqiu/p/4243437.html
4、立方體
這是核心概念,事實表和維度表共同構成了立方體。如圖所示:
這個立方體有三個維度時間(Time)、貨運方式(Route)、地區(Source),數據(度量) 就位于各軸的交叉點(Cell)。
如果關心不同的維度和層次,就會得到不同的數據粒度,在立方體中就是一個面,或者一個柱形,或一個小立方體。這也叫數據立方體的一個切片(Slicer)。
關心維度越少,層次越高,數據量就越少,這是一個聚集(Aggregate)的過程,會對度量進行聚集操作(一般是匯總)。?
5、維度
維度(Dimension)表示數據的屬性,一個維度一般會有一個維表(也可能多個),事實表會有一個字段關聯維表。
比如某個銷售數據里可能會有客戶這個維度,有一個 customers 表:包含客戶名字、性別、地區等屬性,在事實表會有一個字段叫 customer_id,關聯 customers 表。
有的維度可以沒有維度表,因為這種維度比較簡單,沒有更多屬性,沒有必要加一個維度表。這種維度叫退化維度。比如事實表里有一個支付方式字段,只有已確定的有限幾種取值:比如 cash(現金)、credit(信用卡)等。又比如事實表里已有了一個性別字段,那性別這個維度就不需要一個維表。
5.1 維度的層次
維度是可以有層次的。比如前面的數據立方體,三個維度都有層次。貨運方式分陸地和非陸地,陸地分公路和鐵路、非陸地分海路和航空。分層次的維度提供了更多的數據粒度選擇。
維度的層次(Hierarchy)包含多層/級(Level),在維表中一般每層會有一個字段,事實表關聯的是最低一級維度。比如 Time 維度表,如下:
CREATE TABLE "Time" (stattime date, -- 日期week integer, -- 周month integer, -- 月quarter integer, -- 季度year integer -- 年 )事實表關聯的是維表的日期(yyyy-MM-dd)字段,而維表還有月、季度、年字段。有些事實表會增加月、季度、年(冗余)字段,為了 在查詢時減少關聯維表。
5.2 維度的成員
維度的成員(Member)指的維表某個級別(Level)的一個取值。以時間維度為例,假設時間維度分為年份、季度、月份、日期這樣的級別,時間跨度是 2003 年至 2005 年(假設每一天都要數據),那么日期這一級別(最低的級別)的成員(Members)是維度表所有的日期(2003-1-1,2003-1-2...2005-12-31)(1 千多個成員),月份這一級別的成員是 1-12(12 個),季度的成員是 1-4(4 個),年份的成員是2003-2005(3 個)
6、聚集表
聚集表:是為了提升效率事先對事實表進行輕度的匯總。相當于預處理,不用每次都計算
7、Schema
多維數據的事實表、維表、聚集表等存儲于數據庫中,屬于物理模型;而數據立方體、維度、度量這些概念屬于邏輯模型。多維分析引擎必須要理解邏輯模型,并能夠映射到物理模型上。多維數據的模式(Schema)就是用來描述這個邏輯模型以及到物理模型的映射的。 模式(Schema)是多維數據庫的元數據。
比如咱們在使用saiku的時候,上傳的shema文件。或者使用mondrian workpench的時候,自動生成的xml文件都是這個內容,下面是一個例子:
<Schema name="qiu-schema"><Cube name="qiu-cube" visible="true" cache="true" enabled="true"><Table name="sale" schema="public" alias=""></Table><Dimension type="StandardDimension" visible="true" foreignKey="cusid" name="qiuDimension"><Hierarchy name="qiuHierarchy" visible="true" hasAll="true" allMemberName="allCustomer" allMemberCaption="所有名称"><Table name="customer" schema="public" alias=""></Table><Level name="qiuLevel" visible="true" column="gender" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"></Level></Hierarchy></Dimension><Measure name="qiuMeasure" column="num" datatype="Numeric" aggregator="sum" visible="true"></Measure></Cube> </Schema>?
參考:
http://76287.blog.51cto.com/66287/885475
http://www.cnblogs.com/liqiu/p/4243437.html
?
總結
以上是生活随笔為你收集整理的saiku、mondrian前奏之——立方体、维度、Schema的基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel中的VBA宏:每次划款前从总名
- 下一篇: 领域逻辑的组织模式