之前介紹了幾個基本工具:saiku 和 Schema Workbench,算是入門級別的瞭解多維報表,若是要繼續深刻,須要深刻了解以下幾個概念:html
聯機分析處理,和他對應的是OLTP(聯機事務處理)。sql
OLTP:作爲一個開發人員,OLTP是最經常使用的,甚至都不須要理解這個概念!好比各類門票銷售系統、付款系統等等。這些系統對相應速度要求特別高數據庫
OLAP:主要用於分析和決策,是數據倉庫的主要應用。好比:渠道A在2015-10-01給產品B帶來多少pv、uv、訂單、銷售額等數據,這就對分析的能力提出了很高的要求。開發人員開到這裏可能會想,這是一個Sql能解決的,有必要搞出一個概念嗎?我理解是有兩個緣由,首先需求很是很是多,不可能每個都寫Sql,會累死的;其次從業務數據表裏面寫這個Sql,每每很是複雜,若是數據量很大,運行時間也會很長。ide
下面是OLAP和OLTP的主要區別:工具
|
OLTP
|
OLAP
|
用戶
|
操做人員,低層管理人員
|
決策人員,高級管理人員
|
功能
|
平常操做處理
|
分析決策
|
DB設計
|
面向應用
|
面向主題
|
數據
|
當前的,最新的細節的,二維的分立的
|
歷吏的,彙集的,多維的,集成的,統一的
|
存取
|
讀
/寫數十條記錄
|
讀上百萬條記錄
|
工做單位
|
簡單的事務
|
複雜的查詢
|
DB大小
|
100MB-GB
|
100GB-TB
|
與其說Mondrian是OLAP的分析引擎,不如說就是(按照分析數據模式的XML)執行MDX語句,並輸出結果。spa
爲何須要OLAP引擎Mondrian?在工做中常常須要對數據量極大的數據表和相關聯的多個維度表進行查詢、彙總、軸變換以及上卷、下鑽等操做,查詢能夠很是複雜,若是沒有 OLAP 引擎這是很難完成的。 想象一下,某個省份的uv是多少?某個省份某天的uv是多少?某個渠道給某個省份某天的uv是多少?某個渠道給某個省份某個城市某天的uv是多少?......要多少Sql翻譯
那麼Mondrian能夠將需求翻譯成sql,並執行。要求:MDX語言,翻譯規則:模式文件裏面邏輯模型到物理模型的映射!設計
其實這不算是新的概念,這裏主要是說明一下數據庫表和Mondian之間的關係。Mondrian使用JDBC連接數據庫,並運行在數據庫基礎上。數據表分爲:事實表和維度表,這些概念能夠參考:http://www.cnblogs.com/liqiu/p/4243437.htmlcode
這是核心概念,事實表和維度表共同構成了立方體。如圖所示:xml
這個立方體有三個維度時間(Time)、貨運方式(Route)、地區(Source),數據(度量) 就位於各軸的交叉點(Cell)。
若是關心不一樣的維度和層次,就會獲得不一樣的數據粒度,在立方體中就是一個面,或者一個柱形,或一個小立方體。這也叫數據立方體的一個切片(Slicer)。
關心維度越少,層次越高,數據量就越少,這是一個彙集(Aggregate)的過程,會對度量進行彙集操做(通常是彙總)。
維度(Dimension)表示數據的屬性,一個維度通常會有一個維表(也可能多個),事實表會有一個字段關聯維表。
好比某個銷售數據裏可能會有客戶這個維度,有一個 customers 表:包含客戶名字、性別、地區等屬性,在事實表會有一個字段叫 customer_id,關聯 customers 表。
有的維度能夠沒有維度表,由於這種維度比較簡單,沒有更多屬性,沒有必要加一個維度表。這種維度叫退化維度。好比事實表裏有一個支付方式字段,只有已肯定的有限幾種取值:好比 cash(現金)、credit(信用卡)等。又好比事實表裏已有了一個性別字段,那性別這個維度就不須要一個維表。
維度是能夠有層次的。好比前面的數據立方體,三個維度都有層次。貨運方式分陸地和非陸地,陸地分公路和鐵路、非陸地分海路和航空。分層次的維度提供了更多的數據粒度選擇。
維度的層次(Hierarchy)包含多層/級(Level),在維表中通常每層會有一個字段,事實表關聯的是最低一級維度。好比 Time 維度表,以下:
CREATE TABLE "Time" ( stattime date, -- 日期 week integer, -- 周 month integer, -- 月 quarter integer, -- 季度 year integer -- 年 )
事實表關聯的是維表的日期(yyyy-MM-dd)字段,而維表還有月、季度、年字段。有些事實表會增長月、季度、年(冗餘)字段,爲了 在查詢時減小關聯維表。
維度的成員(Member)指的維表某個級別(Level)的一個取值。以時間維度爲例,假設時間維度分爲年份、季度、月份、日期這樣的級別,時間跨度是 2003 年至 2005 年(假設每一天都要數據),那麼日期這一級別(最低的級別)的成員(Members)是維度表全部的日期(2003-1-1,2003-1-2...2005-12-31)(1 千多個成員),月份這一級別的成員是 1-12(12 個),季度的成員是 1-4(4 個),年份的成員是2003-2005(3 個)
彙集表:是爲了提高效率事先對事實表進行輕度的彙總。至關於預處理,不用每次都計算
多維數據的事實表、維表、彙集表等存儲於數據庫中,屬於物理模型;而數據立方體、維度、度量這些概念屬於邏輯模型。多維分析引擎必需要理解邏輯模型,並可以映射到物理模型上。多維數據的模式(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