小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

窮人的通用OLAP方案

 梅蘭竹^_^ 2010-07-27
一、序
緣起
從前到現(xiàn)在,用戶需要從IT系統(tǒng)中獲取信息的變化無常與程序員從傳統(tǒng)數(shù)據(jù)庫中制作報表的代價是一個永恒的矛盾。
這邊廂程序員為了應付客戶忽然而至的報表需求痛苦不已, 客戶只想要他想知道的東西,不會管查詢語句有多么復雜,優(yōu)化從海量數(shù)據(jù)中提取報表的速度有多么困難。
那邊廂客戶為了等程序員做一個報表,快則半天,慢則一周,事情都過去了。明明只想知道一樣很簡單的東西, 程序員卻要抱怨查詢是多么復雜,數(shù)據(jù)結構是如何制約。有時候出一個報表要呆在屏幕前等半天。
而OLAP是唯一一種真正讓用戶獲得自己所需要的報表而且不用付出巨大實現(xiàn)代價的方法。它能夠讓用戶自由的定制自己的查詢條件,觀察、累計的維度,最后從海量數(shù)據(jù)中快速生成它。

方案
經(jīng)過幾年的發(fā)展,各大數(shù)據(jù)庫供應商都有了自己的OLAP方案。不過我們一來不想把產(chǎn)品綁定在某個數(shù)據(jù)庫上,二來沒錢,所以還是要尋求窮人們自己的免費且底層數(shù)據(jù)庫通用的方案。
從AgileJava的Blog上,看到了Mondrian + JPivot:
 
Mondrian
蒙德里安,OLAP核心引擎,負責從關系數(shù)據(jù)庫中計算、緩存數(shù)據(jù),響應來自表現(xiàn)層的使用MS家 MDX語法的查詢。這個微軟家的MDX語法,學起來并不難,SQL Server的書也統(tǒng)統(tǒng)有教。
在這一層要做的事情就是定義一個schema元模型,包括 維度(Dimensions), 層次(Hierarchies),級別(Levels),和成員(Members)等。Mondrian要根據(jù)它來從關系數(shù)據(jù)庫中聚合數(shù)據(jù)響應MDX語法的查詢。
JPivot
OLAP JSP custom tag library。提供OLAP Navigator與多 維數(shù)據(jù)的顯示,并支持圖表生成和Export to Excel。Mondrian的御用表現(xiàn)層。

初遇
Mondrian用了MS家著名的FoodMart數(shù)據(jù)作例子,Access作底層數(shù)據(jù)庫,JPivot做表現(xiàn)層,讓你幾分鐘之內(nèi)就能把Example跑起來,感受一下OLAP報表是什么樣子的。跑完一遍之后,我就發(fā)現(xiàn)做個客戶自定制的OLAP報表如此簡單.....
二、Mondrian引擎
如前所說,Mondrian是OLAP的核心引擎,負責從關系數(shù)據(jù)庫中計算、緩存數(shù)據(jù),響應來自表現(xiàn)層的使用MS家 MDX語法的查詢。具體表現(xiàn)形式呢,就是一個jar,隨Tomcat啟動。
看完那個FoodMart的Sample之后, 該自己動手了。
首先第一步是設計OLAP的數(shù)據(jù)庫結構。
因為和業(yè)務數(shù)據(jù)庫相比,OLAP需要冗余一些數(shù)據(jù)達到更快的查詢。
設計前可以先參拜一下那本經(jīng)典的《完全維度設計指南》,中文版的幾下就能翻個大概。
其實說白了就是去除與報表無關的列,把訂單、訂單明細兩個表合并成一個銷售事實表,把產(chǎn)品,產(chǎn)品分類兩個表合并成一個產(chǎn)品維表這幾個動作。
設計完之后,應該會有幾個裝有統(tǒng)計數(shù)據(jù)和維表外鍵的事實表,和幾個用于分類,排序,過濾的維表。
第二步是把業(yè)務數(shù)據(jù)庫里的數(shù)據(jù)導過來。
有不少ETL的工具,弄出一大堆映射文件,轉換類來。不過我還是喜歡直接寫SQL快捷,可能我面對的不是一天一個G的數(shù)據(jù)庫吧。
第三步是把剛才設計的數(shù)據(jù)庫結構定義成Schema
schema元模型包括 維度(Dimensions)、層次(Hierarchies)、級別(Levels)、和成員(Members)等。Mondrian要根據(jù)它來從關系數(shù)據(jù)庫中聚合數(shù)據(jù)響應MDX語法的查詢。
在這一步之前記得先裝一個中文版的SQL Server2000,里面的Help文件有詳細的解釋。
另外jprovit有一個子項目,是這個schema的Eclipse Plug-in。即使不用這個Plug-in,有了它的DTD,在其他XML編輯器里也能避免拼寫錯誤引起的冤枉時間。
用Sample中的FoodMart.xml做藍本,兩下就能Copy Paste出自己的schema來。
最后,注意Oracle的列名必須全大寫。
 
三、JPivot表現(xiàn)層
JPivot 是Mondrian的表現(xiàn)層TagLib,一直保持著良好的開發(fā)進度。
   已經(jīng)好久沒有用了,趁徹底忘記以前,把小小的心得記下來。
  1.漢化
   1.1 查找所有resources.properties文件,漢化為resources_zh.properties文件
   1.2 native2ascii resources_zh.properties resources_zh.properties
   1.3 查找WEB-INF/jpivot下的所有xml文件,漢化為xxx_zh.xml
   2.架構
   JPivot的架構看似另類,但其實都是精明的選擇。
   2.1 使用XML/ XSLT渲染OLAP報表
      JPivot 使用 WCF (Web Component Framework)  ,基于XML/XSLT來渲染W(wǎng)eb UI組件。這使它顯得十分另類。不過,OLAP報表這種非常復雜但又有規(guī)律可循的東西,最適合使用XSLT來渲染。雖然程序員和編輯器都很不喜歡這種Martin Flower口中有點LISP形式的語言,但Transform Engine這時候的確能比Template Engine(Velocity,Freemarker)更高效的處理OLAP報表及其導航系統(tǒng)的顯示。 
   2.2 完全基于JSP+TagLib
     JPivot另外一個可能使人不慣的地方是它完全基于taglib而不是大家熟悉的MVC模式。但如果不基于tabLib,基于任何MVC框架都會使其失去通用性,擔不起Mondrain唯一表現(xiàn)層的重任,而且,MVC其實不一定需要那些框架(后述)
   2.3 典型的流程及模式:
       打開JPivot自帶的sample,查看index.jsp文件,典型的流程如下:
     1,用戶發(fā)出 testPage.jsp?query=modrain的請求
     2,testPage.jsp上的<wcf:include>根據(jù)query參數(shù),匹配/WEB-INF/query/下的modrain.jsp來獲取數(shù)據(jù)       
     3,modrain.jsp上的<jp:mondrianQuery id="query01">查詢數(shù)據(jù),放入到query01變量中
     4,testPage.jsp上的<jp:table id="table01" query="#{query01}"/>根據(jù)query01的結果(領域數(shù)據(jù)) 準備顯示OLAP表格所需的數(shù)據(jù)(顯示數(shù)據(jù))
     5,testPage.jsp上的<wcf:render ref="table01" xslUri="/WEB-INF/jpivot/table/mdxtable.xsl"/>根據(jù)table01的結果,使用xsl,渲染出OLAP表格。
     6,循環(huán)第4,5步,使用<jp:navigator>等tag準備navigator,chart的數(shù)據(jù)然后用<wcf>渲染出圖表和導航系統(tǒng).
     整個流程,第2步的testPage充當Controller調(diào)用第3步的Model層,然后第4,5步 執(zhí)行Martin Flower講的Transform Engine兩步渲染模式----先從領域數(shù)據(jù)(比如一些java bean)中轉換出格式整齊的,需要顯示的數(shù)據(jù)(比如一段xml),再用xsl將其渲染為最終的表現(xiàn)形式。
 
 

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多