基于ADO MD的OLAP扩展应用实现.docx
《基于ADO MD的OLAP扩展应用实现.docx》由会员分享,可在线阅读,更多相关《基于ADO MD的OLAP扩展应用实现.docx(6页珍藏版)》请在冰豆网上搜索。
![基于ADO MD的OLAP扩展应用实现.docx](https://file1.bdocx.com/fileroot1/2022-11/25/729fc802-1f11-4186-8f1a-a597676bee20/729fc802-1f11-4186-8f1a-a597676bee201.gif)
基于ADOMD的OLAP扩展应用实现
基于ADO/MD的OLAP扩展应用实现
摘要:
简要叙述了OLAP技术,分析了ADO/MD运行机理,并通过一个实例给出了基于ADO/MD实现OLAP扩展应用的方法步骤,为丰富OLAP应用提供了新的思路。
关键词:
联机分析处理;多维数据查询;多维数据对象模型
0引言
数据仓库技术的迅猛发展,使得数据支持决策成为可能。
众多的数据库厂商,比如Microsoft、Oracle、IBM、Sysbase等都提出了自己的数据仓库解决方案。
其中Microsoft公司的AnalysisServices凭借其稳定的性能、相对低廉的价格和操作的简便性占据了一定的市场份额。
OLAP(OnLineAnalysisProcess,联机分析处理)是AnalysisServices提供的重要功能之一,它可以帮助用户从不同侧面分析数据,为决策提供支持。
然而,AnalysisServices的客户端工具虽然能够对分析结果进行简单的表格展现,但无论是数据展现的功能,还是展现的界面难以与各企业自身的业务信息系统实现集成,难以满足用户个性的需求。
庆幸的是Microsoft提供了操作多维数据集的接口ADO/MD(ActiveXDataObjects/Multi-dimensional,ActiveX数据对象/多维对象),通过这个接口可以实现客户端与OLAP服务器的无缝连接,实现多维分析功能与业务信息系统其它功能的集成。
本文基于ADO/MD技术,实现了OLAP客户端扩展应用的开发。
1OLAP技术
OLAP是联机分析处理,也有人称为在线分析处理,它通常基于数据仓库,通过建立面向主题的多维数据集,最终提供给用户一个直观数据展现工具,达到方便用户从多个角度分析数据的目的。
OLAP通过引入维、维分层、维属性、度量等概念,将数据在概念上视为一个数据立方体(也可称为多维数据集)。
通常,多维数据模型围绕中心主题组织,以“维表-事实表”结构形式体现,主题用事实表表示,而每个维都有一个表与之相关联,称为维表,它进一步描述维。
事实表是用于记录度量信息的关系表,维表是用于记录维度的关系表,多维数据立方体中每个坐标轴上的值,各记录在一个维表中,这样,一个n维的数据立方体,就有n张维表。
进行多维数据模型构建时,通常将数据组织成多维,每维包含由概念分层定义的多个抽象层,这种组织结构为人们从不同角度观察分析数据提供了灵活性。
多维数据分析通常包括切片、切块、上卷、下钻和旋转等操作。
(1)切片:
切片操作对给定立方体的一个维进行选择,得到一个子立方体。
(2)切块:
切块操作通过对两个或多个维进行选择,得到一个子立方体。
(3)上卷:
上卷(上钻)操作通过沿一个维的概念分层向上攀升或者通过维归约,对数据立方体进行聚集。
(4)下钻:
下钻是上卷的逆操作,它由不太详细的数据到更详细的数据。
下钻可以通过沿维的概念分层向下或引入附加的维来实现。
2ADO/MD运行机理
ADO/MD是微软AnalysisServices提供给第三方访问服务端多维数据集的接口,通过ADO/MD接口可以方便快捷地编写OLAP应用程序。
ADO/MD是传统ADO对象模型的扩展,能够更好地支持多维数据模型,它不仅功能强大,而且应用简单。
它主要提供了两方面的功能,一是能够对OLAP数据库中多维数据集层次结构信息进行访问;二是支持通过MDX(Multi-dimensionalExpressions,多维表达式)语句获取结果数据集。
为了能够描述多维数据集,ADO/MD的模型结构如图1所示。
它包括两个分支,一个分支用来存储数据立方体元数据;第二个分支用来获取由OLAP立方查询产生的存储在数据集中的数据。
ADO/MD的Catalog(目录)对象用来获得元数据,它可以包含一个或多个CubeDef(立方体定义),任何在这个集合中的元素都是一个CubeDef对象。
每个CubeDef对象拥有一个Dimensions(维)集合,里面包含了所有的Dimension,维的数据是有分级结构的。
相应地,Dimension对象包括Hierarchies(层次)集合,这个集合里面包含了全部的Hierarchy对象;维的分级结构可以包括一个或多个级别,因此Hierarchy对象还包括Levels(级别)集合,每个Level对象还可以包括一个或多个Members(成员)对象。
ADO/MD对象模型的另一个分支就是CellSet(单元集)对象可以用来获得数据立方体的数据透视表。
它通过多维表达式(MDX)来查询相关数据。
MDX在语法上与SQL十分相似,只不过MDX可能更简单一些,它基本上只支持几个操作,比如SELECT等。
每个MDX查询都可以简化成类似的结构:
SELECT[,]FROMWHERE
3OLAP扩展应用
3.1服务端多维数据集的创建
要进行多维分析处理,首先需要在服务端建立多维数据集。
建立多维数据集就是要根据业务需要建立以主题为中心的事实表,并围绕主题建立以数据分类为基础的维度,维度能反映数据组织的分类和层次结构,用户将基于维度中的分类和层次进行分析。
在建立多维数据集时,还需要确定度量值,度量值通常是事实表中数值类型的列,它是数据聚合和分析的数值。
维度和度量值就组成了一个多维数据集。
确定好维度和度量值后,还需要创建数据的物理存储结构。
在考虑多维数据集存储问题时会涉及到数据聚合的问题,理想情况下,事先将各维度层次上的度量值计算好,以便分析服务可以随时接受分析客户端的请求响应,而不是在收到请求后才进行数据聚合计算,这样可以提高服务效率和用户体验。
但这种方式也存在缺点:
一是要占用大量的存储空间来存储聚合的数据;二是聚合的数据源是聚合以前的数据,数据的时效性相对要差一些。
因此,实际方案要根据需要进行取舍。
AnalysisServices提供了3种OLAP存储方式,分别是MOLAP:
“M”代表多维(Multidimensional),即以多维方式进行存储,也就是聚合数据与源数据是独立存储的,这种存储方式响应速度最快,存储空间要求也最大;ROLAP:
“R”代表关系(Relational),即关系OLAP,将聚合数据存储于源数据库中,这种存储方式响应速度最慢,无论是否聚合,都需要访问源数据库;还有一种是HOLAP:
“H”代表混合(Hybrid),即混合OLAP,它结合了前两种方式的优点,HOLAP数据库存储了聚合的数据,而把单元级别的数据保留在源数据库中,这样当检索聚合数据时,响应速度与MOLAP一样,当检索单元级别的数据则需要访问源数据库,响应速度与ROLAP一样。
3.2客户端数据展现功能开发
客户端的数据展现是在AnalysisServices服务引擎的支持下,以表格和图表的方式展现数据分析的结果,并提供与用户交互的功能。
OLAP客户端程序的开发过程与传统数据库应用系统的开发过程是一致的,总的步骤包括三步:
①连接数据库;②获取数据;③处理展现数据。
所不同的是这些步骤都是在ADO/MD接口模型的支持下完成。
下面简要介绍客户端的开发过程:
(1)连接OLAP服务器。
利用ADO/MD接口模型中的TCatalog类可以实现与OLAP服务器的连接,连接字符串必须包括OLEDBProvider名字、计算机名和数据库名,示意代码如下:
ProcedureSetConnection();
varDS:
string;
begin
DS:
='Provider=MSOLAP.2;DataSource=localhost;InitialCatalog=FoodMart2000';
Catalog1:
=CoCatalog.Create;
Catalog1._Set_ActiveConnection(OleVariant(DS));
end;
(2)获取多维数据集信息。
正确连接到OLAP服务器后,就可以获取服务器上的所有多维数据集(数据立方体)、每一个数据集的维度、级别、成员等信息。
①遍历多维数据集并获得对应的名字:
procedureGetCubes();
vari:
integer;
CubeDef1,defs:
Variant;
begin
Defs:
=Catalog1.CubeDefs;
fori:
=0toDefs.Count-1do
begin
CubeDef1:
=Defs.item[i];
CubeCombox.Items.Add(CubeDef1.Name);//数据集的名称
end;
end;
②遍历多维数据集的维并获得它们的名字:
procedureGetDimens(CubeDef:
varaint);
varDimensions,Dimension,Levels,Level1,Members,Member1:
Variant;
i,j:
integer;
begin
Dimensions:
=CubeDef.Dimensions;//数据集的维度集合
fori:
=0toDimensions.count-1do
begin
Dimension:
=Dimensions.item[i];
ifDimension.Name=’Measures’then//是度量值的情况
begin
Levels:
=Dimension.Hierarchies[0].Levels;
Level1:
=Levels.item[0];
Members:
=Level1.Members;
forj:
=0toLevel1.Members.Count-1do
begin
Member1:
=Members.item[J];
MeasureCheckListBox.Items.Add(Member1.Name);
end;
endelse//是维度的情况
DimensionList.Items.add(Dimension.Name);
end;
end;
③遍历维度的级别并获得它们的成员:
procedureGetDimensionMember(Dimension:
varaint);
varLevels,Level1,Members,Member1:
Variant;
i,j:
integer;
pnode:
TTreeNode;
begin
Levels:
=Dimension1.Hierarchies[0].Levels;//维度的级别集合
Level1:
=Levels.item[0];
Members:
=Level1.Members;//级别的成员集合
fori:
=0toMembers.Count-1do
begin
Member1:
=Members.item[i];
displayMember(MemberTreeView,nil,Member1);//显示下级成员
end;
end;
proceduredisplayMember(tv:
TTreeView;Node:
TTreeNode;member:
Variant);//显示下级成员
vari,j:
integer;
pnode:
TTreeNode;
member1:
Variant;
begin
pnode:
=tv.Items.AddChild(Node,Member.Name);
fori:
=0tomember.Children.count-1do
begin
member1:
=member.Children.item[i];
displayMember(tv,pnode,member1);
end;
end;
(3)展现分析结果。
多维数据集结构信息获取以后,就要根据用户的操作,利用MDX查询语句获取聚合数据。
比如,从多维数据集Sales中查询Store维度,以及UnitSales和StoreCost两个度量值的数据,其MDX语句如下:
Select{[UnitSales],[StoreCost]}ONCOLUMNS,{[Store].[AllStores].children}ONROWSfromSales
获取聚合数据以后,就可以根据用户需要以表格、图形等多种方式进行展现,这里不再赘述。
示例代码的界面如图2所示。
4结语
通过ADO/MX接口,可以实现OLAP应用的扩展,这种扩展不仅可以丰富OLAP的应用,更为OLAP与其它应用系统的集成提供了方便。
本文从理论与实践的角度给出了OLAP扩展应用的方法步骤,为其工程化应用奠定了基础。
参考文献参考文献:
[1]叶得学,韩如冰.浅谈数据仓库与OLAP技术[J].甘肃科技纵横,2009
(2).
[2]叶德谦,孙泽林.使用ADOMD开发OLAP应用程序[J].电脑与信息技术,2001(5).