DB2 的 DB2 Cube Views 功能通过共享关系数据库和商业智能应用程序之间的多维元数据,使商业智能应用程序与数据仓库的集成变得更加轻易。了解如何使商业智能应用程序或工具能够利用这一强大的新功能。 本文适用对象 本文的适用对象是那些希望通过使用 DB2 Cube Views 应用程序编程接口(API)以便在 IBM® DB2® Universal Database V8(UDB)上开发或集成 OLAP 应用程序的技术经理和技术人员。该信息尤其适用于那些构建组件以在 DB2 Cube Views 和其它工具或元数据资源库之间交换元数据的开发人员。为简单起见,我们将交换元数据的软件称为“元数据桥或者就是“桥。 具备关系数据库、仓库和 OLAP 概念方面的背景知识将有助于对本文的理解。 简介 公司和用户目前日益需要具有分析大型数据集以及能够深入访问和报告更具体数据的能力。象 DB2 UDB 之类高可伸缩性的数据库服务器在向企业交付 OLAP 解决方案中起着日益重要的作用。通过 DB2 Cube Views,DB2 UDB 提供了一个甚至更健壮的基础结构,这种基础结构可以在端对端仓库和商业智能部署中起到“重大支撑作用。 对于许多 OLAP 工具和应用程序而言,与 DB2 Cube Views 的集成需要构建元数据桥。这些桥可以通过使用 DB2 Cube Views 的基于 XML 的存储过程接口来读取或创建元数据。我们将在本文中讨论如何使用这个接口来构建桥。 DB2 Cube Views 的概述 IBM DB2 Cube Views 是 DB2 通用数据库的附加功能部件,它增强了 DB2 UDB,使 DB2 UDB 作为开发和部署商业智能产品和应用程序的平台。非凡地,DB2 Cube Views 有助于加速位于 DB2 UDB 上的 OLAP 解决方案和应用程序的开发和治理。 DB2 Cube Views 功能部件是如何做到这一点呢?首先,它答应 DB2 UDB 支持 OLAP。假如没有多维数据视图,关系数据库对于不熟悉数据库结构和内容的人来说似乎是一组令人生畏的带有一些列的表。DB2 Cube Views 元数据使您能够更完整地记录 DB2 数据库中的底层结构。 通常,仓库或数据集市是非凡为维分析设计的。在这种情况下,数据库通常由被组织为一个或多个星型(或雪花型)模式的表组成。简单的星型模式包含一个事实表,事实表四周有一些维表。例如,事实表可以记录公司各个产品和分店每日销售数据。维表(或许是 PRODUCTS 和 STORES 表)可能包含有关各个产品和分店的具体信息,并且与事实表相连接。 元数据对象 DB2 Cube Views 元数据尤其擅长捕捉星型或雪花型模式中固有的结构(请参阅 图 1)。该元数据通过一组元数据对象提供关系数据的“空间视图。元数据对象被划分为多层,从简单对象(如 Attribute,简单的 Attribute 对表列建模)到更复杂的对象(如 Join、Hierarchy、Dimension 和 Cube Model)。完整定义的多维数据模型对象通常符合星型(或雪花型)模式,并对一组具有公共维数的度量建模。然后,多维数据模型就封装其它 DB2 Cube Views 元数据对象(如 Dimension 和 Measure),这一点都不希奇。 图 1. 引用关系星型模式的 DB2 Cube Views 多维数据模型
简而言之,DB2 Cube Views 元数据使您能够捕捉 DB2 数据库的多维结构和设计。在 IBM DB2 Cube Views Setup and User's Guide 的第 2 章中具体描述了元数据对象。 DB2 Cube Views 元数据除了使 DB2 支持 OLAP 外,至少还有两种使用方法: DB2 Cube Views 功能部件利用元数据来优化命中 DB2 数据库的 SQL 查询。 位于 DB2 UDB 之上的产品和应用程序可以使用元数据。 让我们简要地讨论一下这两种用法。 将 DB2 Cube Views 元数据用于优化 DB2 Cube Views 通过创建合适的实例化的查询表(materialized query table,MQT)来加速 SQL 查询,这些 MQT 中保存了预先聚集的数据。MQT 也称为(自动)汇总表。假如可以,DB2 优化器会将 SQL 查询重新路由给 MQT(请参阅 图 2)。MQT 通常比底层的基本表(MQT 构建于这些基本表之上)小好几个数量级。因而,对于同一个 SQL 查询,将该查询重新路由给 MQT 这种查询方法通常比用查询基本表的方法快得多。 DB2 Cube Views 有一个基于元数据和用户输入的优化顾问程序,它推荐一组合适的 MQT。有关更多信息,请参阅 DB2 Cube Views Setup and User's Guide中有关优化的章节。 图 2. DB2 优化器在适当时将查询路由到 MQT
元数据使用者 多维数据视图元数据还有其它好处。商业智能工具可以从 DB2 UDB 读取元数据来了解 DB2 表的维结构。然后,根据元数据,这些工具提供处理 DB2 UDB 数据的查询和报告解决方案。 使用 DB2 Cube Views 元数据的工具和应用程序一般分为两类: 第一类应用程序“咬住DB2 Cube Views 。它们通常通过使用元数据来构造 SQL 查询,以读取元数据并直接用它对 DB2 数据库进行分析。大多数情况下,这些工具对 DB2 Cube Views 多维数据模型和多维数据对象进行查询和报告。 第二类工具使多维数据视图元数据从 DB2 流入自己的工具,然后根据自己的元数据查询 DB2。这些工具必须能够将 DB2 Cube Views 元数据映射到自己的元数据。这一映射的复杂程度取决于元数据的相似程度(或相异程度)。 元数据生产者 请注重:并非所有对 DB2 Cube Views 元数据感爱好的应用程序都读取元数据,这一点也很重要。还有一类工具和应用程序产生元数据并将它 推入 DB2。维元数据通常来自数据库设计、抽取-转换-装入(extract-transform-load,ETL)和其它数据库治理工具。通过使维元数据流入 DB2 UDB,这些工具可以利用先前提到的这些优化和治理好处。 显然,为了读取、创建、修改和删除元数据对象,工具和应用程序需要一种与 DB2 中多维数据视图元数据交互的方法。 DB2 Cube Views 为此提供了一个 API,我们接下来将研究它。 API — db2info.md_message() 的概述 DB2 Cube Views API 是用于访问维元数据的接口。它以名为 db2info.md_message() 的 DB2 存储过程的方式实现,该存储过程为其所有参数传入(出)XML 文档。 存储过程的优点是使该 API 变成与语言无关。任何可以与 DB2 交流的编程语言都可以调用这个存储过程。可以使用嵌入式 SQL 和通过 ODBC 或 JDBC 的动态 SQL 等。 您可以从 DB2 Cube View Setup and User's Guide 的附录中获得有关这个 API 的详尽描述。在本文中,我们将向您演示几个示例:向这个存储过程传入什么,以及期望从它那儿返回什么,通过这几个示例来设法让您更快地理解该存储过程。 输入参数 这个存储过程的语法如下:
DBINFO.MD_MESSAGE(operation IN, metadata IN/OUT, response OUT)
所有参数都属于 CLOB 类型。 该存储过程有两个输入参数。第一参数是必需的,它指定调用程序希望执行什么操作。这些操作有:
DESCRIBE
CREATE
ALTER
RENAME
DROP
IMPORT
VALIDATE
某些操作(象 CREATE 和 IMPORT)需要通过第二个参数将元数据传入这个存储过程。操作 DESCRIBE 通过第二个参数返回元数据。 输出参数 该存储过程的第三个参数是输出参数。对于对该存储过程的每个调用,都会通过第三个参数返回响应文档。然而,假如发生某些严重错误,则不会创建任何输出响应文档。 解析 XML 要使用 API,程序必须构造要传入该存储过程的 XML 文档。还需要解析该存储过程所返回的 XML。 DB2 Cube Views API 使用的 XML 的语法由随该产品一起提供的 XSD 模式文件(位于 sqllib/cfg 目录中)指定。您将使用的 XSD 模式文件如 表 1所示。 表 1. 与输入和输出参数相关联的 XSD 文件
API 参数 |
模式文件 |
操作和响应 (第一个和第三个参数) |
db2md_parameter.xsd |
元数据(第二个参数) |
db2md_metadata.xsd 和 db2md_types.xsd |
使用 API 用于调用 md_message() 存储过程的样本 C++ 代码与 DB2 Cube Views 产品一起提供,位于 sqllib/samples/olap/client/db2mdapiclient.cpp 中。 关于用 Java 编写的代码,下面是使用 JDBC 来调用该存储过程的样本代码片段:
/* Calls the DB2 stored procedure passing in the request string
* as the first parameter and the metadata string as the second
* parameter. If xmlRequestString contains a script or no output
* metadata is required the xmlMetadata parameter may be null.
* The outputMetadata boolean controls what is returned by the
* method. If it is true any output metadata is returned. If
* false the response output is returned. */
private String callDB2StoredProc(String xmlRequestString,
String xmlMetadataString,
boolean outputMetadata)
throws OCException,
OCApiException
{
/* Create an SQL command to call the Stored procedure in DB2
* to get the XML */
String sql = "CALL db2info.MD_MESSAGE (?, ?, ?)";
String response = null;
String xmlMetadataResponse = null;
CallableStatement callStmt = null;
try
{
callStmt = auroraCatalogConnection.prepareCall(sql);
/* Set input parameter to request and metadata strings. */
callStmt.setString (1, xmlRequestString);
callStmt.setString (2, xmlMetadataString);
/* Register the output parameters. */
callStmt.registerOutParameter (2, Types.VARCHAR);
callStmt.registerOutParameter (3, Types.VARCHAR);
/* Call the stored procedure */
callStmt.execute();
/* Retrieve output parameters. If the procedure was called with
* a request that returns metadata in the middle parameter then
* xmlMetadataResponse will store the output XML. */
if (outputMetadata == true)
xmlMetadataResponse = callStmt.getString(2);
response = callStmt.getString(3);
/* See if there are any warnings. */
SQLWarning warning = callStmt.getWarnings();
/* If execute returns a warning with a non-zero SQL state
* then the API has had an error and returned some response
* info in the output XML document. */
if (warning != null)
{
OCLog.trace("Stored procedure execute returned a warning.");
OCLog.trace("SQL state: " + warning.getSQLState());
OCLog.trace("SQL state: " + warning.getErrorCode());
/* readResponseFromXML will throw an OCApiException containing
* the error info (which will then be thrown to our caller) or
* it will throw an OCException if a parsing error occurred. If
* for some strange reason the file does not contain error
* info it will just return and then we'll throw an OCException
* to notify the user. */
try { readResponseFromXML(response); }
/* If an API exception was thrown add the SQL state etc to
* it and then throw it again. */
catch (OCApiException apie)
{
apie.setSqlException(warning);
throw apie;
}
/* If we have had a warning we always want to rollback any changes.
* If we have a problem rolling back the exception will be caught
* below. */
finally
{
auroraCatalogConnection.rollback();
}
/* If we got here there must have been a warning with nothing
* in the output XML so throw an exception explaining this. */
throw new OCException("OC_ERR_API_DB2_STORED_PROC_FAIL_NO_INFO");
}
}
/* If we had an error executing the SQL, log the information and
* throw an exception. We also rollback any changes and catch
* the exception if the rollback has a problem. */
catch (SQLException e)
{
OCApiException newe = new OCApiException(e);
OCLog.trace( newe.getMessage() );
logExceptionInfo(e);
try { auroraCatalogConnection.rollback(); }
catch (SQLException e2)
{
OCLog.trace("An exception also occurred rolling back.");
logExceptionInfo(e2);
}
throw newe;
}
读取元数据 在获得成功调用该 API 的一些代码之后,将需要把注重力放在将正确的 XML 传递给该 API,以及能够解析输出 XML。 大多数程序将需要通过使用 DESCRIBE 操作来从 DB2 Cube Views 读取元数据。下面是一些示例: 示例 1. 读取所有元数据 下面是您要使用的操作 XML:
<
olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<describe objectType="all" recurse="no">
</describe>
</olap:request>
注: 调用程序和服务器上的 DB2 存储过程之间的版本号(如 8.1.2.1.0)必须一致。 请注重,应该将请求标记限定为 <olap:request> 。 输出时,第二个参数将返回包含元数据的 CLOB。通常会返回许多对象。假如 DB2 只有一个 Attribute 对象,那么输出元数据 XML 将类似于:
<olap:metadata xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<attribute name="FAMILY" schema="MDSAMPLE" businessName="FAMILY"
createTime="2003-04-11T21:28:22" creator="db2admin">
<datatype schema="SYSIBM" name="VARCHAR" length="15" scale="0"/>
<sqlExpression template="{$$1}">
<column name="FAMILY" tableSchema="MDSAMPLE" tableName="FAMILY"/>
</sqlExpression>
</attribute>
</olap:metadata>
假如成功,响应文档将类似于:
<olap:response xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<describe>
<status id="0" text="Operation completed successfully. No errors were encountered."
type="informational"/>
</describe>
</olap:response>
示例 2. 获取特定的多维数据模型及相关对象 下面是您将用来获取 db2admin.MyCubeModel 的多维数据模型及其相关对象的操作 XML:
<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<describe objectType="cubeModel"
recurse="yes">
<restriction>
<predicate property="name" operator="=" value="MyCubeModel"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</describe>
</olap:request>
注: Recurse="yes" 告诉 API 返回多维数据模型以及该多维数据模型递归引用的所有对象。 请注重,谓词的运用,谓词指定我们感爱好的多维数据模型。 创建元数据 有两个用于创建新元数据的操作:CREATE 和 IMPORT。在创建新的元数据时,使用 CREATE。假如您想要创建的对象碰巧与现有对象冲突(因为名称相同),则使用 IMPORT。 示例. 在 DB2 Cube Views 中创建一些元数据对象 下面是您要使用的操作 XML:
<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<create/>
</olap:request>
通过第二个参数以 XML 格式将一个或多个元数据对象传递给存储过程。 改变元数据 有两个用于修改元数据对象的操作:ALTER 和 RENAME。 示例 1. 改变连接对象 ALTER 操作类似于 CREATE,但被传入的元数据对象必须已经存在。由新定义的对象替代原有对象。下面是您要使用的操作 XML:
<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<alter/>
</olap:request>
对于元数据 XML,传入我们想让它成为的 Join 对象:
<join name="ProductFamily" schema="db2admin" businessName="ProductFamily"
type="inner" cardinality="n:1">
<attributeJoin operator="=">
<leftAttributeRef name="FAMILYID" schema="db2admin"/>
<rightAttributeRef name="FAMILYID (FAMILY)" schema="db2admin"/>
</attributeJoin>
</join>
示例 2. 重命名多维数据模型对象 假设我们想要将多维数据模型对象 db2admin.SalesModel 重命名为 db2admin.SalesModel (2003) 。下面是做到这一点的操作 XML:
<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<rename objectType="cubeModel">
<currentRef name="SalesModel" schema="db2admin"/>
<newRef name="SalesModel (2003)" schema="db2admin"/>
</rename>
</olap:request>
对于重命名,不需要元数据 XML。 删除元数据 用 DROP 操作删除元数据对象。 示例 1:删除 所有元数据对象 执行该操作时必须小心!下面是要使用的操作 XML:
<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<drop objectType="all"/>
</olap:request>
示例 2. 删除多维数据对象及其相关对象 下面是删除 db2admin.MyCube 及其相关对象的操作 XML。请注重,非凡的 <script> 标记,它可以在一次 API 调用中执行多次删除:
<olap:request xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<script>
<drop objectType="cube">
<restriction>
<predicate property="name" operator="=" value="My Cube"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</drop>
<drop objectType="cubeFacts">
<restriction>
<predicate property="name" operator="=" value="Cube Facts (My Cube)"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</drop>
<drop objectType="cubeDimension"><restriction>
<predicate property="name" operator="=" value="Market (My Cube)"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction></drop>
<drop objectType="cubeHierarchy">
<restriction><predicate property="name" operator="=" value="Region (My Cube)"/>
<predicate property="schema" operator="=" value="db2admin"/>
</restriction>
</drop>
</script>
</olap:request>
无需传入任何元数据 XML。 调试错误 尽管您必须习惯于消息中如何引用对象的命名约定,但是存储过程中的大多数错误都相当清楚,无需解释。正因如此,您经常不得不相当仔细地阅读消息。 下面是报告错误的 API 响应示例。当我们试图删除已不存在的 Cube 对象( db2admin.My Cube )时,会返回下面的响应。( 请注重:由于空间有限,状态消息被分成两行。)
<olap:response xmlns:olap="http://www.ibm.com/olap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="8.1.2.1.0">
<drop>
<status id="6006" text="No objects were found matching search criteria:
"objectType=CUBE & name=My Cube & schema=db2admin"." type="warning">
<tokens>
<text value="objectType=CUBE & name=My Cube & schema=db2admin"/>
</tokens>
</status>
</drop>
</olap:response>
跟踪 当发生错误而您又无法断定 API 失败的原因时,通常有必要打开 API 跟踪。从高级别跟踪(信息量最少)开始,仅当绝对需要时才打开中级或低级跟踪(这些级别的信息要具体得多)。 要打开跟踪,请修改配置文件 db2md_config.xml ,如下所示。每个 DB2 实例都有一个这样的文件,可以在实例目录中找到它。在 Windows 上,缺省的 DB2 实例名为“DB2,可以在 sqllib/DB2/db2md_config.xml 中找到这个配置文件。在下面的 XML 中,已经将跟踪级别设置为 high。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- <copyright> -->
<!-- Licensed Materials - Property of IBM -->
<!-- 5724-E15 -->
<!-- (c) Copyright IBM Corp. 2002, 2003 All Rights Reserved. -->
<!-- US Government Users Restricted Rights - Use, duplication or disclosure -->
<!-- restricted by GSA ADP Schedule Contract with IBM Corp. -->
<!-- </copyright> -->
<olap:config xmlns:olap="http://www.ibm.com/olap">
<log>
<trace level="
high" logFile="db2mdtrace.log" bufferSize="0"/>
<error level="medium" logFile="db2mderror.log" bufferSize="0"/>
</log>
</olap:config>
请注重:不要尝试重命名跟踪文件。其名称必须是 db2mdtrace.log 。可以在实例目录中找到跟踪文件 db2mdtrace.log 。 创建元数据桥 元数据桥是将元数据从一种格式映射成另一种格式的软件组件或实用程序。开发桥是为了在第三方商业智能或 OLAP 工具与 DB2 Cube Views 之间交换元数据。 图 3. 元数据桥
例如,IBM 在 DB2 Cube Views 和 IBM DB2 OLAP Server 产品之间提供了桥。更准确地讲,桥在 DB2 Cube Views 和 DB2 OLAP Server 的 OLAP 集成服务器附加功能部件之间交换元数据。 在规划元数据桥时,有许多初始考虑事项。我们将更具体地讨论其中一些问题。 DB2 Cube Views 元数据对象模型与其它格式的对象模型相比,兼容性/相似程度如何? 桥应该是单向的还是双向的? 同时可以映射什么高级别的元数据分组?通常,多维数据模型或多维数据对象(以及所有引用对象)是桥的源或目标。 桥将支持并治理增量元数据更改吗? 将使用何种编程语言? 该编程语言可以使用哪些 XML 解析器? 当使用 DB2 Cube Views 元数据时,桥将调用 API 来读取元数据还是读取导出的元数据 XML 文件? 当产生 DB2 Cube Views 元数据时,桥将调用 API 来创建元数据还是将元数据写入 XML 文件? 映射练习 做映射练习是设计桥的首要步骤。做这个练习的架构设计师或开发人员必须通晓 DB2 Cube Views 元数据对象模型和其它元数据对象模型方面的应用知识。我们建议在原型设计和实现工作开始之前,仔细地记录并复查映射。 如 表 2所示,每个 DB2 Cube Views 对象在进行映射时都有一些需要考虑的公共特性。 表 2. DB2 Cube Views 对象的公共特性
特性 |
说明 |
模式 |
当映射到 DB2 Cube Views 时,所有新对象通常都被放入单个模式中。但答应多维数据视图对象引用其它不同模式中的多维数据视图对象。DB2 Cube Views 中每个对象的完整名称由它的模式和名称构成,如 MYSCHEMA.MYATTRIBUTE 。 模式的长度不超过 30 个字节。 |
名称 |
每个 DB2 Cube Views 对象类型都有自己的名称空间,除了 Attribute 和 Measure 共享同一个名称空间。因此,例如,Attribute 和 Join 可以具有同一个完整名称。 至 DB2 Cube Views 的桥通常必须生成一些目标对象的名称。 名称的长度不超过 128 个字节。 |
商业名称 |
最多 128 个字节。 |
注释 |
最多 254 个字节。 |
创建者 |
当映射到 DB2 Cube Views 时不需要。 |
创建时间 |
当映射到 DB2 Cube Views 时不需要。 |
修改者 |
当映射到 DB2 Cube Views 时不需要。 |
修改时间 |
当映射到 DB2 Cube Views 时不需要。 |
必须对 DB2 Cube Views 对象模型进行研究,并将它与作为映射目标或源的元数据进行比较。请仔细地注重元数据间的差异,在映射元数据时,这些差异会导致元数据丢失。假如桥是双向的,那么在元数据往返时确定将如何改变元数据。对于大多数桥,不推荐使用元数据往返,因为您最终会得到一个与开始时明显不同的元数据。 表 3 包括一些按对象类型分需要牢记的说明。当映射至 DB2 Cube Views 时,输出元数据 XML 必须有效。XML 在语法上必须是正确的。桥应该通过依据模式文件 db2md_metadata.xsd 验证它们输出的 DB2 Cube Views 元数据 XML 来检查是否格式良好。此外,输出元数据必须遵守 DB2 Cube Views 指定的所有元数据验证规则。在 DB2 Cube Views 中,有三种验证级别。当映射到 DB2 Cube Views 时,遵守“基本规则就足够了。从 DB2 Cube Views 进行读取的桥或许想要坚持:元数据要遵守“多维数据模型完整性元数据规则。请参阅 Setup and User's Guide,以获取有关 DB2 Cube Views 中元数据验证级别的具体信息。 表 3. 不同对象类型的映射说明
对象类型 |
映射说明 |
Attribute |
SQL 表达式模板是映射过程中最难的特性,因为它通常需要对表达式进行解析。另外,始于 DB2 Cube Views 的桥需要处理引用其它 Attribute 的 Attribute,并以递归方式遍历所有 Attribute 来确定给定 Attribute 的最终 SQL 表达式。 当映射为 Attribute 时,不需要数据类型特性;当创建该 Attribute 时,由 DB2 多维数据视图确定它。 |
Join |
当映射到 DB2 Cube Views 时创建 Join 很重要,因为它们捕捉构建 Dimension 和 Cube Model 所需的结构信息。 |
Attribute Relationship |
属于 Hierarchy 的一部分。可在较复杂的 Cube Model 中找到它。 |
Measure |
与 Attribute 的问题一样(即 SQL 表达式模板的映射很难)。通常,桥对支持十分复杂的量方面有一些限制。 |
Facts |
一组具有相同维数的 Measure。请注重,需要映射可选的 Attribute 和 Join。 |
Dimension |
当创建 Dimension 时,请确保包括了所有的 Attribute。请注重,Hierarchy 和 Join 是可选的。 |
层次结构 |
请注重,Attribute 列表是经过排序的。还要注重,并不答应所有的类型和部署的组合。有时候,桥在可以映射的层次结构类型方面有一些限制。 |
Cube Model |
它是桥在通常的映射过程中的最高一层对象。假如完全可能的话,至 DB2 Cube Views 的桥应该创建 Cube Model 对象。 |
Cube(和 Cube Facts、Cube Dimension、Cube Hierarchy) |
被映射为 Cube Model 的一部分(假如它有意义的话)。 |
使用者或生产者 桥可以产生或使用 DB2 Cube Views 元数据。人们经常期望桥是双向的,而且通常先实现一个方向,然后再实现另一个方向。在这个实例中,我们建议先针对 两个方向理解和记录映射,即使只马上实现了一个方向,也是如此。通过定义两个方向的映射,将有助于确保映射是合理而完整的。 映射什么 Cube Model 是 DB2 Cube Views 中丰富的元数据对象,它通常是桥进行映射过程中的对象。有时候,桥还会与 Cube Model 一起产生或使用 Cube 对象。 将元数据推入 DB2 UDB 的桥并不总是具有足够的信息来创建 Cube Model。要创建 Cube Model,桥通常需要知道哪些表是事实表,哪些表是维表。假如桥没有这些信息,那么它仍可以创建象 Attribute 和 Join 之类比较简单的对象,这些对象仍然要增加值。 增量更改 支持增量元数据更改是桥在企业仓库环境中运用的一个重要特性。 所有多维数据视图元数据对象都有一个“修改时间,如在对象的 XML 表示中有 modifyTime="2003-03-25T09:54:51" 。使用这来确定已经更改了哪些元数据对象。API 没有提供一种方法来查询自某一时间戳记以来更改的所有对象,所以您必须读取一组对象,然后检查每个对象的修改时间。 使用这个 API 的 altER 或 IMPORT 操作,将元数据更改推入 DB2。通过使用 IMPORT 操作,可以决定是否要覆盖已经更改的对象。还可以在实际执行导入之前发现哪些对象有冲突。请参阅 Setup and User's Guide中具体描述的 IMPORT“方式。 编程语言 假如映射是从 XML 到 XML 的映射,则经常考虑使用 XSLT。但要知道,有时候,映射所需的复杂逻辑难以用 XSLT 实现。我们所知道的大多数桥都是用 Java 或 C/C++ 实现的。 XML 解析器 可以选择使用 Xerces 解析器。有关信息,请参阅 http://xml.apache.org/xerces-c/index.html。 API 还是 XML 文件 不管是产生还是使用 DB2 Cube Views XML,桥都需要决定是调用 API 还是处理 XML 文件。这两种方法各有优缺点。 使用 XML 文件的优缺点 使用 XML 文件的优点是桥可以独立于 DB2 Cube Views 运行,如在另一个客户机或服务器机器上运行。 使用 XML 文件的缺点是: 当使用多维数据视图 XML 时,您不能确保元数据是有效的并与 DB2 中的关系模式同步。 当产生 DB2 多维数据视图 XML 时,您不能确保稍后可以成功地导入元数据。 使用 API 的优缺点 使用 API 的优点是: 桥可以使用 VALIDATE 操作来确保它从 DB2 读取的任何元数据都是有效的。 桥可以通过查询 DB2 系统目录表来读取有关引用表和列的附加信息。 桥可以查看 DB2 中的所有元数据。 API 的缺点是实现桥所花的时间会较长,因为您需要添加代码来调用 DB2 Cube Views API。程序将需要产生操作 XML 并解析响应 XML。 实现步骤 下面是如何成功地设计并实现桥的基本概述: 产生一个设计文档,该文档包括具体的映射。 针对实际的测试案例设计原型并测试映射。根据需要,修订设计。 实现桥(产品级代码)。 对桥执行严格的 QA。 经验告诉我们,典型的桥项目需要三个以上的人月来完成。一个月左右的时间用于设计,至少有一个月的时间用于实现,测试大致需要一个月。建议用户进行 Beta 版测试。 结束语 IBM 鼓励商业智能工具和解决方案的开发人员能够使他们的产品与 DB2 UDB 的 DB2 Cube Views 功能部件相互操作。对于许多 OLAP 工具和应用程序,与 DB2 Cube Views 的集成需要通过使用基于 XML 的存储过程接口来读取或创建元数据。正如我们所看到的,在我们熟悉了存储过程在输入和输出中所使用的 XML 语法之后,该接口就很简单了。 在我们对 API 感到满足之后,就可以从事将 DB2 Cube Views 元数据映射到其它格式的工作。有关为 DB2 Cube Views 构建元数据桥方面,我们已经分享了许多应牢记的考虑事项。对元数据进行合理映射的桥将受到解决方案构建者的高度赞扬,因为一个好的桥将为他们节省构建和部署解决方案的时间。