如何设计Mondrian模式(Mondrian4.)

官网地址: https://mondrian.pentaho.com/head/documentation/schema.php 

下载地址:(更新2019年5月6日 10:51:22)

链接:https://pan.baidu.com/s/1c70KE78NjRkCi2I9pQlpiA 
提取码:fnya 
复制这段内容后打开百度网盘手机App,操作更方便哦

如果百度云失效,请联系我,或者直接CSDN下载:

https://download.csdn.net/download/mar_ljh/11117056

如何设计Mondrian模式

  1. 什么是模式?
  2. 架构文件
    1. 模式的结构
    2. 架构元素
    3. 注解
  3. 逻辑模型
    1. 立方体
    2. 措施
    3. 尺寸和属性
      1. 维度键
      2. 一个简单的属性
      3. 属性键和名称
      4. 复合键
      5. 属性顺序
    4. 层次结构和级别
      1. “全部”和默认成员
      2. 设计用于层次结构的属性
      3. 属性层次结构
      4. 属性与层次结构
    5. 架构捷径
    6. 更多关于尺寸
      1. Measures尺寸
      2. 明星和雪花尺寸
      3. 时间维度
      4. 会员属性
    7. 退化的维度
    8. 顺序和显示级别
    9. 近似级别基数
    10. 默认度量属性
    11. 功能依赖性优化
  4. 物理模式
    1. 列和计算列
    2. 内联表
    3. 询问
    4. 链接
    5. 表提示
  5. 明星和雪花模式
  6. 先进的逻辑结构
    1. 共享维度
    2. 父子层次结构
      1. 调整父子层次结构
      2. 闭包表
      3. 填充封闭表
    3. 计算的成员
    4. 命名集合
  7. 插件
    1. 用户定义的功能
    2. 单元格式化程序
    3. 成员格式化程序
    4. 属性格式化程序
    5. 动态模式处理器
    6. 数据源更改侦听器
    7. 动态数据源XMLA servlet
  8. 国际化
  9. 聚合表
  10. 访问控制
    1. 定义一个角色
    2. 汇总政策
    3. 联盟角色
    4. 设置连接的角色
  11. 附录A:XML元素

1.什么是模式? 

模式定义了一个多维数据库。它包含一个逻辑模型,由立方体,度量,维度和属性组成,并将该模型映射到物理模型上。

逻辑模型由用于以MDX语言编写查询的构造组成:多维数据集,度量,维度,属性,层次结构,级别和成员。

物理模型是通过逻辑模型呈现的数据的来源。它是一组表和其他关系表达式,使用链接进行连接。通常,这些表格存储在关系数据库中,并以星形或雪花模式排列; 之后,我们将看到其他类型映射的例子。

2.架构文件 

Mondrian模式用XML文件表示。包含几乎所有我们在这里讨论的构造的示例模式都是demo/FoodMart.mondrian.xml在Mondrian分布中提供的。用于填充此模式的数据集可以从Pentaho下载。

目前,创建模式的唯一方法是在文本编辑器中编辑模式XML文件。XML语法不是太复杂,所以这不像听起来那么困难,特别是如果您使用FoodMart架构作为指导性示例。

2.1架构的结构 

XML文档的结构如下:

(as for Table)

(shared; as for Dimension within Cube)

(as Key)

(as Key)

(as Key)

6.4单元格式化器 

单元格格式化程序修改的行为。类必须实现这个接口,并且是这样指定的: Cell.getFormattedValue() mondrian.spi.CellFormatter

(之前的语法,使用Measure元素的'formatter'属性,已被弃用,并将在mondrian-4.0中被删除。)

您可以使用脚本元素以JavaScript等脚本语言指定格式化程序:

该脚本有一个value变量,对应于 mondrian.spi.CellFormatter.formatCell(Object value) 方法的参数。代码片段可以有多个语句,但必须以return语句结束。

对于属于多维数据集或虚拟多维数据集的计算成员,还可以使用CellFormatter 元素:

[Measures].[Unit Sales] * 2

var s = value.toString();

while (s.length() < 20) {

s = "0" + s;

}

return s;

您还可以通过将CELL_FORMATTER成员的属性设置为格式化程序类的名称来定义格式程序。

对于在WITH MEMBERMDX查询的子句中定义的计算度量,可以在MDX中设置相同的属性以实现相同的效果:

WITH MEMBER [Measures].[Foo]
  AS '[Measures].[Unit Sales] * 2',
   CELL_FORMATTER='com.example.MyCellFormatter'
SELECT {[Measures].[Unit Sales], [Measures].[Foo]} ON COLUMNS,
    {[Store].Children} ON ROWS
FROM [Sales]

要定义脚本格式程序,请使用CELL_FORMATTER_SCRIPT 和CELL_FORMATTER_SCRIPT_LANGUAGE属性:

WITH MEMBER [Measures].[Foo]
  AS '[Measures].[Unit Sales] * 2',
   CELL_FORMATTER_SCRIPT_LANGUAGE='JavaScript',
   CELL_FORMATTER_SCRIPT='var s = value.toString(); while (s.length() < 20) s = "0" + s; return s;'
SELECT {[Measures].[Unit Sales], [Measures].[Foo]} ON COLUMNS,
    {[Store].Children} ON ROWS
FROM [Sales]

如果成员不属于[Measures]维度,则单元格格式化程序属性将被忽略 。

6.5成员格式化器 

成员格式化程序修改的行为。类必须实现这个接口,并且是这样指定的: Member.getCaption() mondrian.spi.MemberFormatter

(使用Level元素的'formatter'属性的以前的语法已被弃用,并将在mondrian-4.0中被删除。)

您可以使用脚本元素以JavaScript等脚本语言指定格式化程序:

return member.getName().toUpperCase();

该脚本有一个member变量,对应于 mondrian.spi.MemberFormatter.formatMember(Member member) 方法的参数。代码片段可以有多个语句,但必须以return语句结束。

6.6属性格式化程序 

属性格式化程序修改的行为。类必须实现这个接口,并且是这样指定的: Property.getPropertyFormattedValue() mondrian.spi.PropertyFormatter

您可以使用脚本元素以JavaScript等脚本语言指定格式化程序:

return member.getName().toUpperCase();

该脚本有可用的memberpropertyName 和propertyValue变量,对应于所述的参数mondrian.spi.PropertyFormatter.formatProperty(会员构件,字符串propertyName的,对象的PropertyValue)方法。代码片段可以有多个语句,但必须以return语句结束。

6.7动态模式处理器 

动态模式处理器实现该接口。它被指定为连接字符串的一部分,如下所示: mondrian.spi.DynamicSchemaProcessor

Jdbc=jdbc:odbc:MondrianFoodMart; JdbcUser=ziggy; JdbcPassword=stardust; DynamicSchemaProcessor=com.example.MySchemaProcessor

其效果是,当从URL中读取模式的内容时,Mondrian转向模式处理器而不是Java的默认URL处理器。这使架构读者有机会通过过滤器运行架构,甚至可以即时生成整个架构。

何时DynamicSchemaProcessor被指定,模式将被处理并在每个ROLAP连接请求上重新加载。属性 UseContentChecksum应与模式处理器一起使用,以启用模式的高速缓存:

DataSource=java:/jdbc/MyWarehouse; DynamicSchemaProcessor=com.example.MySchemaProcessor; UseContentChecksum=true

在这种情况下,一旦加载模式将被缓存,直到它改变。如果模式内容发生更改,则会重新加载。(新加载的模式被认为是一个不同的模式,并将以空的缓存开始。

动态模式是一个非常强大的构造。我们将会看到,它们的重要应用是国际化。

6.9动态数据源XMLA servlet 

DynamicDatasourceXmlaServlet延伸DefaultXmlaServlet,加入到动态加载能力datasources.xml的文件。对于它收到的每个客户端请求,它检查内容的更新datasources.xml。它有选择地清除已更改或不再存在的目录的缓存datasources.xml。该servlet认为目录当任其属性(DataSourceInfo,在定义属性的改变作为 DataSourcesConfig.Catalog)是不同的。它通过名称来识别目录。

这个servlet补充了基于UseContentChecksum的动态目录加载功能 。它不检查目录内容的更新。功能没有重叠。两者将共同提供全面的动态数据源和目录配置功能。

要使用DynamicDatasourceXmlaServlet,请在以下位置更改MondrianXmlaServlet servlet的定义web.xml


   MondrianXmlaServlet
   mondrian.xmla.impl.DynamicDatasourceXmlaServlet
    ...

这个实现有一个限制。它要求目录名称在所有数据源中是唯一的,否则可能无法正常工作。

7.国际化 

一个国际化的蒙德里安应用程序将有一个每种语言的架构,每个对象的标题以本地语言显示。例如,[Product] 维度将会有英文的“产品”和法语的“产品”。

翻译模式对象的实际名称是不明智的,因为MDX语句也需要改变。所有你需要改变的是标题。每个模式对象(模式,多维数据集,虚拟多维数据集,维度,层次结构,级别,度量,命名集)都有一个标题属性,JPivot和Pentaho Analyzer等用户界面显示的是标题而不是真实名称。另外:

  • 每个模式对象都有一个描述属性。
  • 一个层次结构可以有一个allMemberCaption属性作为“全部”成员的显示值。
  • 对于模式,我们可以通过measuresCaption属性设置“度量”维度的显示值。
  • 如果成员是度量值(即Measures维度的成员),则计算的成员具有属性CAPTION和DESCRIPTION,这些属性显示为标题和说明。

创建国际化应用程序的一种方法是为每种语言创建模式文件的副本,但难以维护。更好的方法是使用 LocalizingDynamicSchemaProcessor类在单个模式文件上执行动态替换。

7.1本地化架构处理器

首先,使用变量将您的模式写为,, 和属性的值caption, 如下所示:descriptionallMemberCaptionmeasuresCaption

 

...

...

像往常一样,没有caption属性的任何多维数据集,度量,维度或级别的默认标题是元素的名称。层次结构的默认标题是其维度的标题; 例如,[Store]层次结构没有caption 定义,所以它继承了caption其父, [Store]维的属性。

接下来,将动态模式处理器和区域设置添加到连接字符串中。例如,

Provider=mondrian; Locale=en_US; DynamicSchemaProcessor=­mondrian.i18n.LocalizingDynamicSchemaProcessor; Jdbc=­jdbc:mysql://localhost/foodmart; JdbcUser=­foodmart; JdbcPassword=­foodmart; Catalog=­/WEB-INF/FoodMart.mondrian.xml

现在,对于您希望支持的每个语言环境,请提供一个名为的资源文件。例如, locale_{locale}.properties

# locale.properties: Default resources
foodmart.measures.caption=Measures
foodmart.dimension.store.country.caption=Store Country
foodmart.dimension.store.name.property_type.column= store_type
foodmart.dimension.store.country.member.caption= store_country
foodmart.dimension.store.name.property_type.caption =Store Type
foodmart.dimension.store.name.caption =Store Name
foodmart.dimension.store.state.caption =Store State
foodmart.dimension.store.name.property_manager.caption =Store Manager
foodmart.dimension.store.name.property_storesqft.caption =Store Sq. Ft.
foodmart.dimension.store.allmember.caption =All Stores
foodmart.dimension.store.caption =Store
foodmart.cube.sales.caption =Sales
foodmart.dimension.store.city.caption =Store City
foodmart.cube.sales.measure.unitsales =Unit Sales

# locale_hu.properties: Resources for the 'hu' locale.
foodmart.measures.caption=Hungarian Measures
foodmart.dimension.store.country.caption=Orsz\u00E1g
foodmart.dimension.store.name.property_manager.caption =\u00C1ruh\u00E1z vezet\u0151
foodmart.dimension.store.country.member.caption =store_country_caption_hu
foodmart.dimension.store.name.property_type.caption =Tipusa
foodmart.dimension.store.name.caption =Megnevez\u00E9s
foodmart.dimension.store.state.caption =\u00C1llam/Megye
foodmart.dimension.store.name.property_type.column =store_type_caption_hu
foodmart.dimension.store.name.property_storesqft.caption =M\u00E9ret n.l\u00E1b
foodmart.dimension.store.allmember.caption =Minden \u00C1ruh\u00E1z
foodmart.dimension.store.caption =\u00C1ruh\u00E1z
foodmart.cube.sales.caption =Forgalom
foodmart.dimension.store.city.caption =V\u00E1ros
foodmart.cube.sales.measure.unitsales =Eladott db

8.聚合表 

当事实表包含大量的行数:百万或更多时,聚集表是提高蒙德里安表现的一种方法。聚合表本质上是事实表中数据的预先计算的摘要。

我们来看一个简单的聚合表。

 

这个 元素,这里没有显示,允许你直接引用一个维度表,而不在聚合表中包含它的列。这在聚合表指南中有描述 。

在实践中,基于非常大的事实表的立方体可能有几个聚合表。在模式XML文件中显式声明每个聚合表是不方便的,幸运的是还有更好的办法。在以下示例中,Mondrian通过模式匹配查找聚合表。

它告诉蒙德里安把所有匹配模式的"agg_.*_sales_fact_1997" 表作为聚合表,除了"agg_c_14_sales_fact_1997" 和 "agg_lc_100_sales_fact_1997"。Mondrian使用规则来推断这些表中的列的角色,所以严格遵守严格的命名约定是很重要的。命名约定在聚合表指南中进行了描述 。

性能指南有关于选择聚合表的建议。

9.访问控制 

好吧,现在你已经掌握了所有这些优秀的数据,但是你并不是每个人都能够阅读所有的数据。为了解决这个问题,你可以定义一个称为角色的访问控制配置文件作为模式的一部分,并在建立连接时设置这个角色。

9.1定义一个角色 

角色是由 元素定义的,在 元素之后,元素是直接的子元素。这是一个角色的例子:

 定义模式中对象的默认访问权限。该access属性可以是“全部”或“无”; 这个访问可以被特定的对象覆盖。在这种情况下,因为 access="none"用户只能浏览“销售”多维数据集,因为它是明确授予的。

 定义了对特定多维数据集的访问。至于访问属性可以是“全部”,“自定义”或“无”,并可以覆盖多维数据集中的特定子对象。

 定义对维度的访问。访问属性可以是“all”,“custrom”或“none”。“全部”的访问级别意味着该维度的所有子级别将获得继承的访问权限。“自定义”的访问级别意味着角色不能获得对子层次结构的固有访问权限,除非使用元素明确授予角色 。

 定义了对层次结构的访问。访问属性可以是“全部”,意味着所有成员都可见; “无”,意味着层级的存在对用户是隐藏的; 和“定制”。使用自定义访问权限,您可以使用该topLevel 属性来定义可见的最高级别(防止用户看到太多的“大图片”,例如查看收入卷起到 Store Country级别)。或者使用该bottomLevel 属性来定义可见的底层(这里,防止用户侵入个人客户的细节); 或者通过定义嵌套 元素来控制用户可以看到的成员集合。

你只能定义一个 元素,如果它包含 了access="custom"。会员赠与给予(或删除)给定会员及其所有子女的访问权限。这是规则:

  1. 成员继承父母的访问权限。如果你拒绝进入加州,你将无法看到旧金山。
  2. 赠款与订单有关。如果您准许进入美国,那么拒绝进入俄勒冈州,那么您将无法看到俄勒冈州或波特兰。但是,如果你拒绝进入俄勒冈州,然后准许进入美国,你可以有效地看到一切。
  3. 如果其中的任何一个成员可见,则该成员是可见的。假设您拒绝访问美国,然后授予访问加州。你将能够看到美国和加利福尼亚,但没有其他国家。然而,反对美国的总数仍将反映所有国家。如果父级HierarchyGrant指定最高级别,则只有等于或低于此级别的父级将可见。同样,如果指定了最低级别,则只有高于或等于该级别的子级才可见。
  4. 成员资助不会覆盖层级资助的顶级和底层级别。如果你设置topLevel="[Store].[Store State]",并授予访问加州,你将无法看到美国。会员授予不会覆盖topLevel和bottomLevel属性。您可以授予或拒绝访问任何级别的成员,但顶部和底部约束优先于显式成员授予。

在这个例子中,用户将可以访问加利福尼亚州以及加利福尼亚州除洛杉矶以外的所有城市。他们将能够看到美国(因为它的孩子,加利福尼亚,是可见的),但没有其他国家,而不是所有商店(因为它是高于顶层Store Country)。

9.2汇总政策 

一个汇总政策决定蒙德里安如何计算成员的总如果当前角色不能看到所有成员的孩子的。在名为“完整”的默认汇总策略下,该成员的总额包括来自不可见子项的贡献。例如,假设弗雷德属于可以看到角色[USA].[CA][USA].[OR],但不会[USA].[WA]。如果Fred运行查询

SELECT {[Measures].[Unit Sales]} ON COLUMNS,
    {[[Store].[USA], Store].[USA].Children} ON ROWS
FROM [Sales]

查询返回

[Customer] [Measures].[Unit Sales]
[USA] 266773
[USA].[CA] 74748
[USA].[OR] 67659

请注意[USA].[WA],根据访问控制策略,不会返回,但总数包括Fred无法看到的华盛顿总数(124,366)。对于某些应用,这是不合适的。特别是,如果该维度的成员数量较少,则最终用户可能能够推导出他们无权访问的成员的值。

为了解决这个问题,角色可以将不同的汇总策略应用于层次结构。该政策描述了如果当前角色只能看到该成员的一些子女,那么如何计算某个成员的总和:

  • 完整。该成员的总数包括所有的孩子。如果不指定rollupPolicy属性,则这是默认策略。
  • 部分。该成员的总数只包括无障碍儿童。
  • 隐藏。如果有任何一个孩子无法进入,那么总数是隐藏的。

根据“部分”政策,[USA]总数是无障碍儿童的总和,[CA] 并且[OR]

[Customer] [Measures].[Unit Sales]
[USA] 142407
[USA].[CA] 74748
[USA].[OR] 67659

在“隐藏”政策下,[USA]总计隐藏,因为其中一个子女无法访问:

[Customer] [Measures].[Unit Sales]
[USA] -
[USA].[CA] 74748
[USA].[OR] 67659

策略是按照角色和层次来指定的。在以下示例中,角色查看[Store]层次结构的部分总计,但查看了 全部总计[Product]

rollupPolicy="partial" topLevel="[Store].[Store Country]">

rollupPolicy="full" topLevel="[Customers].[State Province]" bottomLevel="[Customers].[City]">

此示例还显示了现有的功能,例如如何使用topLevel和/或bottomLevel属性来限制层次结构授予 ,以及如何使用access =“none”来防止角色看到层次结构。

9.3联盟角色 

联合角色结合了几个角色,并具有他们的特权总和。

联合角色可以看到特定的模式对象,如果其中一个或多个组成角色可以看到它。类似地,联合角色相对于特定层次结构的汇总策略是所有角色的汇总策略中限制最小的。

这里是一个显示联合角色的语法的例子。

“加利福尼亚州经理”和“东部销售经理”的组成角色可能是常规角色,用户定义角色或联合角色,但必须在架构文件的较早版本中声明。“海岸经理”角色将能够看到任何成员或“加州经理”和“东方销售经理”。它将能够看到这些成员相交处的所有单元格,再加上它将能够看到两个角色都看不到的单元格:例如,如果只有“California manager”可以看到[USA].[CA].[Fresno],并且只有“Eastern sales manager”的[Sales Target]措施,则“滨海经理人”就能看到弗雷斯诺,既不构成角色的访问销售目标。

9.4设置连接的角色 

一个角色只有在与连接关联时才有效果。默认情况下,连接具有一个角色,使他们可以访问该连接架构中的每个多维数据集。

大多数数据库将角色(或“组”)与用户关联起来,并在用户登录时自动分配角色。但是,Mondrian不具有用户的概念,因此您必须以不同的方式来确定角色。有两种方法可以做到这一点:

  1. 在连接字符串中。如果Role 在连接字符串中指定关键字,连接将采用该角色。您可以指定用逗号分隔的多个角色名称,并创建一个联合角色; 如果角色名称包含逗号,请使用逗号将其转义。有关 连接字符串语法的示例,请参见 DriverManager类。
  2. 以编程方式。一旦你的应用程序建立了连接,调用方法 Connection.setRole(Role)。您可以以编程方式创建角色(请参阅界面角色和开发人员笔记链接以获取更多详细信息),或者使用 Schema.lookupRole(String)方法查看一个角色。

10.附录A:XML元素 

元件 描述

架构
与特定企业有关的元素的顶层集合。立方体属于架构,共享维度,命名集合,角色,用户定义函数和参数。(维度和命名集合也可以在一个特定的Cube中被私人定义。)

物理元素
表格用法的集合,通过关系链接,构建逻辑模式。
定义一个表的使用。
使用SQL查询定义一个“表”,对于不同的底层数据库可以有不同的变体。
使用内嵌数据集定义表格。
两个表之间的链接。
持有人的元素。
定义数据集中的列。
一个 or 的SQL表达式的集合,每个支持的方言的一个。
参考以SQL表达(一内一列 元件),或在一个键结构体(, ,,, )。
特定数据库方言的SQL表达式。
持有人的元素。
在数据集中行。
数据集中列的值。

逻辑元素
一个分析的主要业务视图,一个立方体是一个维度和度量的集合。
收集要素。
一组可用于细分多维数据集的s集合,其中一些组织成 结构。
收集要素。
数据项中的一个。
收集要素。
收集组织成。
收集要素。
一级。
代替的关键字的列或列。Attribute.keyColumn
代替一个名称的列。Attribute.nameColumn
代替的标题的列。Attribute.captionColumn
列或用来的成员排序列,以代替。Attribute.orderByColumn
会员属性。定义是针对层次结构或层次的,但该属性将提供给所有成员。
收集要素。
存储在同一个事实表中的s的集合。
收集要素。
测量。
A 和S 之间的链接集合。
使用事实表中的外键将a 链接到维表。
声明Dimension与MeasureGroup是平凡的链接,因为它的维度表与事实表相同。
指示由MeasureGroup表中的键列表示的维。
通过另一维将维度链接到MeasureGroup。
a 没有链接到当前的文档。
收集要素。
成员的值是使用公式派生的,定义为多维数据集的一部分。
收集要素。
一个集合,其值是使用公式导出的,定义为一个立方体的一部分。
将父子层次映射到闭包表。

访问控制
访问控制配置文件。
一组模式的权限。
一组立方体的权利。
在该层次结构中对a 和s的一组权限。
一套权利和一个孩子。
将一组权利定义为一组s 的联合。
对一个参考。

扩展
声明一个用户定义的函数。
单元格式化程序。
成员格式化程序。
属性格式化程序。

你可能感兴趣的:(mondrian,kylin,saiku,schema,mdx,后端开发)