Mondrian模式1.什么是什么是mondrian模式模式? •一个mondriann模式文件定义了一个多维数据库. 它包含一个逻辑模型(logical model)、一组数据立方(consisting of cubes)、层次(hierarchies)、和成员(members), 并映射到物理模型上.•逻辑模型(logical model)是为了编写MDX查询语言而创建的,有如下概念: 数据立方(cubes);维(dimensions);层次(hierarchies);级别(levels);成员(members).•物理模型是所有数据的源,它们通过逻辑模型表现出来典型的是星型模式,它们是由关系型数据库中的一组表组成下面我们还将看到一些其他映射的例子2.模式文件•Mondrian 模式是定义在一个XML文件中的.demo/FoodMart.xml这个文件里包含大多数我们这里讨论的结构•目前, 生成模式文件的方法是使用XML编辑器手动编写,XML语法并不复杂,因此这个任务并不像听上去那么难•注意注意: XML元素必须按照一定的先后顺序出现.3.逻辑模型逻辑模型•模式的重要组成部分为:数据立方(cubes), 度量(measures), 和维(dimensions):•数据立方数据立方 ::维和度量在一个特定主题范围内的集合. •度量度量 ::一个你感兴趣的一个测量值,例如, 某种产品的销量. •维:维:一个属性, 属性的集合, 用于度量的分类. 例如, 你希望通过产品的颜色、客户的性别来区分它们的销量。
在这里,颜色和性别被称之为维 一个简单模式的例子•该模式包含一个名为“sales”的简单数据立方(cube), 它有两个维(dimension):"Time", 和 "Gender", 和两个度量: "Unit Sales" 和 "Store Sales".•我们可以根据以上模式来书写一个如下的MDX查询语言:•SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} ON COLUMNS, {descendants([Time].[1997].[Q1])} ON ROWSFROM [Sales]WHERE [Gender].[F]•这个查询引用了这个数据立方([Sales]),结果如下:•下面我们将详细的说明:3.1数据立方数据立方(cube)•一个数据立方是一些度量的维的集合. 通常定义在一个事实表中, 如我们在事实表 "sales_fact_1997"中看到的, 它保存了度量值和对维表的引用.•... 3.2度量度量(measures)•这个销售数据立方定义了两个度量:"Unit Sales" and "Store Sales".•每个度量包含一个名字对应事实表中的一个列、采用一个聚合函数. 聚合函数通常为 “sum”, 但 “count”, “min”, “max”, “avg”, 和 “distinct-count” 也是经常使用的。
•上面的度量”Unit Sales”对应事实表 “sales_fact_1997”中一个名为”unit_sales”的列,使用”sum”函数聚合•可选属性 datatype 指定了单元值在 Mondrian‘s缓存中的格式, 和它们经XML返回的格式. 属性 datatype 可以是 "String", "Integer", "Numeric", "Boolean", "Date", "Time", and "Timestamp"中的一个. 默认为 "Numeric"•一个可选的formatString属性指定了值如何被打印这里我们选择销售数量不带小数的输出(因为销售数量是整数) ,销售总额带2位小数 . 符号',' 和 '.' 是对地区敏感的, 因此如果是在意大利运行, 销售总额可能会出现 "48.123,45". •度量值不仅可以从事实表中的列中得出,它还可以使用 cell reader, 或一个 SQL 表达式来计算它的值. 以下度量 "Promotion Sales"使用了SQL表达式来计算其值.•注意:底层数据库必须支持 SQL 表达式.(casewhensales_fact_1997.promotion_id=0then0elsesales_fact_1997.store_salesend)3.3 维维, 层次层次, 级别级别(Dimensions, Hierarchies, Levels)成员成员(member)•一个成员(member)是指维上的一个点,是该维值集合中的一个值. 如名为gender的层次结构有两个member:‘M’ and ‘F’.名为store 的层级结构有三个成员'San Francisco', 'California' 和 'USA' . 层次结构层次结构(hierarchy)•层次结构(hierarchy)是为了方便分析问题而将一组member组织成的结构. 例如,store层次结构由store name, city, state, 和nation组成。
级别级别(level)•一个level是members的集合,它们到根层次(hierarchy)的距离(distance)是相同的维维(dimension)•一个维(dimension)是一个层次(hierarchy)的集合,根据事实表中的列来区别维定义的例子•让我们看如下一个维定义 •该维由一个单一的层次(hierarchy)组成, 而这个层次则由一个名为Gender的级别(level)组成 .•该维的值是从表customer中的gender列提取出来的. 列 “gender” 有两个值: ‘F’ and ‘M’, 因此Gender 维包含两个成员: [Gender].[F] 和 [Gender].[M]。
3.3.1 维和层次到表的映射维和层次到表的映射•一个维依靠一对列和数据立方进行连接, 一个在事件表中, 另一个在维表中元素有一个外键(foreignKey)属性,对应事实表中的一个列,它通过元素中的主键属性连接起来.3.3.2 ‘all’ 成员•默认情况下, 每个层次都包含一个称之为 ‘(All)’的顶级别, 它包含一话个名为 '(All {hierarchyName})'的成员(member). 该成员是该维中所有其他成员的父成员,它也是该层次的默认成员3.3.3 时间维(Time dimension)•时间维有一个“TimeDimension”类型.时间维中级别(level)的类型由 levelType属性指定, 有如下可选值:TimeYearsTimeQuartersTimeMonthsTimeDays下面是一个关于时间维的例子:3.3.4 计算成员(Calculated members)•假设你想要创建一个度量,但事实表中并没有这个列,一种方法是使用WITH MEMBER子句,如下:WITH MEMBER [Measures].[Profit] AS '[Measures].[Store Sales]-[Measures].[Store Cost]',FORMAT_STRING = '$#,###'SELECT {[Measures].[Store Sales], [Measures].[Profit]} ON COLUMNS,{[Product].Children} ON ROWSFROM [Sales]WHERE [Time].[1997] 但更好的办法是在模式中定义这个成员,下面在是cube中的定义•在这里,我们对mondrian模式的基本内容进行了简单介绍。