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"<Schema name="Sales Example" metamodelVersion="4.0">
<PhysicalSchema> <Table schema="demo" name="sales_fact"> <Key><Column name="sale_id"/></Key> </Table> <Table schema="demo" name="dim_customer"/> </PhysicalSchema>
<Dimension name="Customer" table="dim_customer" key="Customer"> <Attributes> <Attribute name="Customer"> <Key><Column name="customer_id"/></Key> <Name><Column name="customer_name"/></Name> </Attribute> <Attribute name="Gender" hasHierarchy="false"> <Key><Column name="gender"/></Key> </Attribute> </Attributes> <Hierarchies> <Hierarchy name="Customers"> <Level attribute="Gender"/> <Level attribute="Customer"/> </Hierarchy> </Hierarchies> </Dimension>
<Cube name="Sales"> <Dimensions> <Dimension source="Customer"/> </Dimensions> <MeasureGroups> <MeasureGroup name="Sales" table="sales_fact"> <Measures> <Measure name="Unit Sales" column="units" aggregator="sum" formatString="#,###"/> <Measure name="Revenue" column="revenue" aggregator="sum" formatString="#,##0.00"/> </Measures> <DimensionLinks> <ForeignKeyLink dimension="Customer" foreignKeyColumn="customer_id"/> </DimensionLinks> </MeasureGroup> </MeasureGroups> </Cube></Schema>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"<Schema name="Rock Sales" metamodelVersion="4.0"></Schema>Atributos requeridos y comunes
| Atributo | Requerido | Por defecto | Descripción |
|---|---|---|---|
name | sí | — | Nombre para mostrar de este schema |
metamodelVersion | no | autodetectado | Versión del formato del schema. Use "4.0" para todos los schemas nuevos |
caption | no | — | Sobrescribir el nombre visto por las herramientas cliente |
description | no | — | Descripción legible por humanos |
measuresCaption | no | — | Leyenda para la dimensión virtual [Measures] |
defaultRole | no | — | Rol aplicado cuando la conexión no especifica un rol |
quoteSql | no | true | Si Mondrian entrecomilla identificadores SQL |
missingLink | no | warning | Comportamiento cuando falta un enlace de dimensión — warning, error o ignore |
locales | no | — | Lista 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: ...<Schema name="Rock Sales" metamodelVersion="4.0"> <Annotations> <Annotation name="Author">Fred Flintstone</Annotation> <Annotation name="Date">10,000 BC</Annotation> </Annotations> <Cube name="Sales"> ... </Cube></Schema>Nombres de anotación convencionales
Algunos nombres de anotación se usan por convención entre herramientas:
| Anotación | Elemento(s) | Descripción |
|---|---|---|
AnalyzerBusinessGroup | Level | Crea carpetas en la UI |
AnalyzerBusinessGroupDescription | Level | Descripción para esas carpetas |
AnalyzerDateFormat | Level | Usado para filtros de fecha relativos |
AnalyzerHideInUI | Measure, CalculatedMember | Oculta el campo de la UI |
AnalyzerDisableDrillLinks | Cube | Deshabilita 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"<Annotations> <Annotation name="caption.de_DE">Verkaufen</Annotation> <Annotation name="caption.fr_FR">Ventes</Annotation> <Annotation name="description.fr_FR">Cube des ventes</Annotation></Annotations>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"<Schema name="Sales" metamodelVersion="4.0"> <PhysicalSchema> <Table name="sales_fact_1997"/> <Table name="customer"/> <Table name="time_by_day"/> </PhysicalSchema>
<Cube name="Sales"> <Dimensions> <Dimension name="Customer" table="customer" key="Id"> <Attributes> <Attribute name="Gender" column="gender"/> <Attribute name="Id" column="customer_id"/> </Attributes> </Dimension>
<Dimension name="Time" table="time_by_day" key="Day"> <Attributes> <Attribute name="Year" column="the_year"/> <Attribute name="Quarter" column="quarter"> <Key> <Column name="the_year"/> <Column name="quarter"/> </Key> </Attribute> <Attribute name="Month" column="month_of_year"> <Key> <Column name="the_year"/> <Column name="month_of_year"/> </Key> </Attribute> <Attribute name="Day" column="time_id"/> </Attributes> <Hierarchies> <Hierarchy name="Yearly" hasAll="false"> <Level attribute="Year"/> <Level attribute="Quarter"/> <Level attribute="Month"/> </Hierarchy> </Hierarchies> </Dimension> </Dimensions>
<MeasureGroups> <MeasureGroup name="Sales" table="sales_fact_1997"> <Measures> <Measure name="Unit Sales" column="unit_sales" aggregator="sum" formatString="#,###"/> <Measure name="Store Sales" column="store_sales" aggregator="sum" formatString="#,###.##"/> <Measure name="Store Cost" column="store_cost" aggregator="sum" formatString="#,###.00"/> </Measures> <DimensionLinks> <ForeignKeyLink dimension="Customer" foreignKeyColumn="customer_id"/> <ForeignKeyLink dimension="Time" foreignKeyColumn="time_id"/> </DimensionLinks> </MeasureGroup> </MeasureGroups>
<CalculatedMembers> <CalculatedMember name="Profit" dimension="Measures" formula="[Measures].[Store Sales] - [Measures].[Store Cost]"> <CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/> </CalculatedMember> </CalculatedMembers> </Cube></Schema>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 ROWSFROM [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).