Saltearse al contenido

Estructura del schema

Un ejemplo completo

Aquí hay un schema Mondrian-4 pequeño pero completo — un cubo, una dimensión, dos medidas. Saiku acepta schemas en YAML (por defecto) o XML; elija un formato debajo y cada ejemplo del sitio cambia para coincidir.

schema:
name: "Sales Example"
metamodel_version: "4.0"
physical_schema:
tables:
- name: "sales_fact"
schema: "demo"
key:
- "sale_id"
- name: "dim_customer"
schema: "demo"
shared_dimensions:
Customer:
table: "dim_customer"
key: "Customer"
attributes:
- name: "Customer"
key:
- "customer_id"
name_column: "customer_name"
- name: "Gender"
key:
- "gender"
has_hierarchy: false
hierarchies:
- name: "Customers"
levels:
- "Gender"
- "Customer"
cubes:
Sales:
dimensions:
- source: "Customer"
measure_groups:
- name: "Sales"
table: "sales_fact"
measures:
- name: "Unit Sales"
column: "units"
aggregator: "sum"
format_string: "#,###"
- name: "Revenue"
column: "revenue"
aggregator: "sum"
format_string: "#,##0.00"
dimension_links:
- type: "foreign_key"
dimension: "Customer"
foreign_key_column: "customer_id"

Estructura de un schema

La estructura global de un documento XML de schema Mondrian-4 tiene este aspecto:

<Schema>
<PhysicalSchema>
<Table>
<Key>
<Column/>
</Key>
</Table>
<Query>
<SQL/>
</Query>
<InlineTable>
<ColumnDefs>
<ColumnDef/>
</ColumnDefs>
<Key/> <!-- same structure as Table/Key -->
<Rows>
<Row>
<Value/>
</Row>
</Rows>
</InlineTable>
<Link/>
</PhysicalSchema>
<Dimension/> <!-- shared; same structure as Dimension within a Cube -->
<Cube>
<Dimensions>
<Dimension>
<Attributes>
<Attribute>
<Key>
<Column/>
</Key>
<Name/> <!-- same structure as Key -->
<Caption/> <!-- same structure as Key -->
<OrderBy/> <!-- same structure as Key -->
<Closure/>
<MemberFormatter>
<Script/>
</MemberFormatter>
<Property>
<PropertyFormatter>
<Script/>
</PropertyFormatter>
</Property>
</Attribute>
</Attributes>
<Hierarchies>
<Hierarchy>
<Levels>
<Level/>
</Levels>
</Hierarchy>
</Hierarchies>
</Dimension>
</Dimensions>
<MeasureGroups>
<MeasureGroup>
<Measures>
<Measure/>
<MeasureRef/>
</Measures>
<DimensionLinks>
<ForeignKeyLink/>
<FactLink/>
<ReferenceLink/>
<CopyLink/>
<NoLink/>
</DimensionLinks>
</MeasureGroup>
</MeasureGroups>
<CalculatedMembers>
<CalculatedMember>
<Formula/>
<CalculatedMemberProperty/>
<CellFormatter>
<Script/>
</CellFormatter>
</CalculatedMember>
</CalculatedMembers>
<NamedSets>
<NamedSet>
<Formula/>
</NamedSet>
</NamedSets>
</Cube>
<Role>
<SchemaGrant>
<CubeGrant>
<DimensionGrant/>
<HierarchyGrant>
<MemberGrant/>
</HierarchyGrant>
</CubeGrant>
</SchemaGrant>
<Union>
<RoleUsage/>
</Union>
</Role>
<UserDefinedFunction>
<Script/>
</UserDefinedFunction>
<Parameter/>
</Schema>

El orden de los elementos no es significativo. Por ejemplo, un elemento <UserDefinedFunction> puede aparecer antes de un <Cube> y después de otro — Mondrian-4 parsea el documento posicionalmente pero trata el orden de los elementos como orientativo. Este es un cambio significativo respecto a Mondrian 3.x, donde el orden de los elementos era estrictamente requerido.

El contenido de cada elemento se describe en las siguientes páginas de esta sección y en la referencia de schema YAML.

El elemento Schema

<Schema> es el elemento raíz de cada schema Mondrian. Un ejemplo mínimo:

schema:
name: "Rock Sales"
metamodel_version: "4.0"

Atributos requeridos y comunes

AtributoRequeridoPor defectoDescripción
nameNombre para mostrar de este schema
metamodelVersionnoautodetectadoVersión del formato del schema. Use "4.0" para todos los schemas nuevos
captionnoSobrescribir el nombre visto por las herramientas cliente
descriptionnoDescripción legible por humanos
measuresCaptionnoLeyenda para la dimensión virtual [Measures]
defaultRolenoRol aplicado cuando la conexión no especifica un rol
quoteSqlnotrueSi Mondrian entrecomilla identificadores SQL
missingLinknowarningComportamiento cuando falta un enlace de dimensión — warning, error o ignore
localesnoLista separada por comas de códigos de locale para leyendas localizadas

El atributo metamodelVersion le dice a Mondrian para qué versión se escribió el schema. Si lo omite, Mondrian infiere la versión de los contenidos del schema. Para todos los schemas nuevos defínalo a "4.0".

Anotaciones

Los principales tipos de elementos — schema, cube, shared dimension, dimension, attribute, hierarchy, level, measure group, measure, calculated member — todos admiten anotaciones. Una anotación le permite adjuntar metadatos clave/valor arbitrarios a cualquier elemento del schema, lo que es particularmente útil para herramientas que necesitan almacenar información sin modificar la definición oficial del schema de Mondrian.

Añada un elemento <Annotations> como hijo del elemento que quiere anotar, luego incluya uno o más elementos <Annotation> dentro. Los valores de name de la anotación deben ser únicos dentro de su elemento padre. Si está creando anotaciones para una herramienta específica, elija los nombres cuidadosamente para evitar colisiones con otras herramientas.

schema:
name: "Rock Sales"
metamodel_version: "4.0"
annotations:
Author: "Fred Flintstone"
Date: "10,000 BC"
cubes:
Sales:
...

Nombres de anotación convencionales

Algunos nombres de anotación se usan por convención entre herramientas:

AnotaciónElemento(s)Descripción
AnalyzerBusinessGroupLevelCrea carpetas en la UI
AnalyzerBusinessGroupDescriptionLevelDescripción para esas carpetas
AnalyzerDateFormatLevelUsado para filtros de fecha relativos
AnalyzerHideInUIMeasure, CalculatedMemberOculta el campo de la UI
AnalyzerDisableDrillLinksCubeDeshabilita los enlaces de drillthrough en el cubo

Las herramientas con conciencia de locale usan nombres cualificados con puntos por convención — por ejemplo caption.de_DE para una leyenda en alemán, description.fr_FR para una descripción en francés. El schema de demo FoodMart muestra este patrón en el cubo Sales:

annotations:
caption.de_DE: "Verkaufen"
caption.fr_FR: "Ventes"
description.fr_FR: "Cube des ventes"

El modelo lógico

Los componentes más importantes de un schema son cubos, medidas, atributos y dimensiones:

  • Un cubo es un conjunto de datos que describe uno o más procesos de negocio durante un período de tiempo particular.
  • Un hecho es el dato que representa una ocurrencia de un proceso — por ejemplo, una línea de pedido que describe la venta de un producto a un cliente, o un período de pago para un empleado.
  • Una medida es una cantidad que quiere agregar dentro de un cubo — por ejemplo, ventas unitarias de un producto, o el salario de un empleado.
  • Un atributo es un valor, poseído por cada hecho, por el que puede dividir los hechos en subconjuntos. Podría segmentar las ventas de productos por color, género del cliente y la tienda donde se vendió el producto; color, género y tienda son todos atributos.
  • Una dimensión es una agrupación de atributos relacionados. Por ejemplo, nombre, género, código postal y color de ojos son atributos de una dimensión Customer; color, peso y fabricante son atributos de una dimensión Product.

Aquí hay un ejemplo completo y funcional de un schema simple que une estos conceptos:

schema:
name: "Sales"
metamodel_version: "4.0"
physical_schema:
tables:
- name: "sales_fact_1997"
- name: "customer"
- name: "time_by_day"
cubes:
Sales:
dimensions:
- name: "Customer"
table: "customer"
key: "Id"
attributes:
- name: "Gender"
- name: "Id"
- name: "Time"
table: "time_by_day"
key: "Day"
attributes:
- name: "Year"
- name: "Quarter"
key:
- "the_year"
- "quarter"
- name: "Month"
key:
- "the_year"
- "month_of_year"
- name: "Day"
hierarchies:
- name: "Yearly"
has_all: false
levels:
- "Year"
- "Quarter"
- "Month"
measure_groups:
- name: "Sales"
table: "sales_fact_1997"
measures:
- name: "Unit Sales"
column: "unit_sales"
aggregator: "sum"
format_string: "#,###"
- name: "Store Sales"
column: "store_sales"
aggregator: "sum"
format_string: "#,###.##"
- name: "Store Cost"
column: "store_cost"
aggregator: "sum"
format_string: "#,###.00"
dimension_links:
- type: "foreign_key"
dimension: "Customer"
foreign_key_column: "customer_id"
- type: "foreign_key"
dimension: "Time"
foreign_key_column: "time_id"
calculated_members:
- name: "Profit"
dimension: "Measures"
formula: "[Measures].[Store Sales] - [Measures].[Store Cost]"
properties:
- name: "FORMAT_STRING"
value: "$#,##0.00"

Este schema contiene un único cubo llamado “Sales” con dos dimensiones (“Customer” y “Time”), tres medidas base y un miembro calculado (“Profit”). Puede escribir una consulta MDX contra él inmediatamente:

SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} ON COLUMNS,
{Descendants([Time].[Yearly].[1997].[Q1])} ON ROWS
FROM [Sales]
WHERE [Customer].[Gender].[F]

Que produce resultados como:

[Time][Measures].[Unit Sales][Measures].[Store Sales]
[1997].[Q1]32,910$69,798.23
[1997].[Q1].[Jan]10,932$23,309.04
[1997].[Q1].[Feb]10,266$21,773.93
[1997].[Q1].[Mar]11,712$24,715.26

Las secciones siguientes explican cada parte de este schema en detalle.


Contenido adaptado de la guía del schema del proyecto Mondrian, disponible bajo la Eclipse Public License v1.0 (http://www.eclipse.org/legal/epl-v10.html).