# Esquemas

{% hint style="info" %}

#### Versiones de esquema

Un esquema define una base de datos multidimensional en estrella / copo de nieve. Contiene un modelo lógico, compuesto por cubos, jerarquías y miembros, y un mapeo de este modelo sobre un modelo físico.&#x20;

El modelo lógico consiste en las construcciones usadas para escribir consultas en el lenguaje MDX: cubos, dimensiones, jerarquías, niveles y miembros.

El modelo físico es la fuente de los datos que se presentan a través del modelo lógico. Típicamente es un esquema en estrella, que es un conjunto de tablas en una base de datos relacional.&#x20;
{% endhint %}

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/0YyuTRh9eS6KIiaN2Rsp/image.png" alt=""><figcaption><p>Esquema Mondrian 3</p></figcaption></figure>

{% embed url="<https://mondrian.pentaho.com/documentation/schema.php>" %}

***

Explora las construcciones del esquema:

{% tabs %}
{% tab title="Esquema" %}
{% hint style="info" %}

#### Elemento de esquema

El elemento Schema es el contenedor raíz de un archivo de esquema Mondrian. Piénsalo como la envoltura exterior que contiene todo lo demás. Cada archivo XML de esquema Mondrian tiene exactamente un elemento Schema.

Cada esquema necesita un atributo name, aunque Mondrian no lo utiliza para operaciones críticas. Se recomienda que también añadas un atributo description para explicar qué hace el esquema en términos legibles por humanos.

También deberías especificar metamodelVersion="3.14" ya que esto ayuda a rastrear qué versión del formato de esquema estás usando.

El elemento Schema contiene todos los bloques de construcción de tu modelo de datos. Siempre requiere un elemento PhysicalSchema, que define las tablas y columnas reales de la base de datos.

Típicamente, un esquema incluye uno o más elementos Cube que definen las estructuras de datos multidimensionales. También puede contener elementos Dimension para dimensiones compartidas que múltiples cubos pueden usar, y elementos Role para control de acceso y configuraciones de seguridad.

Un analista típicamente crea primero el Schema como el contenedor exterior, luego lo rellena con los componentes necesarios para responder preguntas empresariales, como dimensiones y cubos.

Piénsalo como un archivador: el Schema es el propio armario, y llenas los cajones con carpetas organizadas (cubos, dimensiones) que ayudan a responder preguntas empresariales específicas.

¿Esto ayuda a aclarar el concepto?
{% endhint %}

```xml
<Schema name="SteelWheels"
caption="Steel Wheels"
description="Optimizing the Sales process at Steel Wheels Inc"
metamodelVersion="3.14" measuresCaption="Metrics"
defaultRole="Associate" missingLink="warning">
```

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/L60uBrUM5XP13X29Bwhz/image.png" alt=""><figcaption><p>Elemento de esquema</p></figcaption></figure>

{% hint style="info" %}
En Mondrian v3 el analizador de esquemas era extremadamente sensible al orden de los elementos hijos. Si obtienes los elementos hijos en el orden incorrecto (por ejemplo, un cube después de un role..), Mondrian ignorará el cube.
{% endhint %}
{% endtab %}

{% tab title="Cubo" %}
{% hint style="info" %}

#### Elemento Cube

Un cubo, definido por un elemento XML Cube, es el contexto para un informe o sesión de análisis interactivo. Representa una colección de eventos, describiendo las ocurrencias de un proceso de negocio a lo largo de la vida del mart de datos.

Los cubos tienden a ser un conjunto completo de Dimensiones, Jerarquías, Niveles y Medidas para realizar un análisis sobre el conjunto de eventos. Por ejemplo, si te interesan las ventas por cliente, podrías querer ver importes de ventas (Medidas) por cliente (Dimensión) geografía (Nivel).

Un cubo reúne estas cosas en un solo lugar, listo para el análisis y las consultas.
{% endhint %}

```xml
<Cube name="Sales 2003 to 2005">
<Table name=”ORDERFACT” />

<Dimension>
...
</Dimension>
<Measure>
...
</Measure> 
</Cube> 
```

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/riILiFYWxhzcsxjIAA5e/image.png" alt=""><figcaption><p>Elemento Cube</p></figcaption></figure>

{% hint style="info" %}
Recuerda que un cubo es una colección de Dimensiones, Jerarquías, Niveles (atributos en Mondrian v4) y Medidas. Las Medidas describen cuantitativamente eventos o colecciones de eventos, y los Niveles representan el contexto en el que ocurrieron los eventos.

Cada combinación de Niveles y Medidas es efectivamente un nuevo informe que se puede crear en segundos.
{% endhint %}

<table><thead><tr><th width="125">Atributo</th><th>Descripción</th></tr></thead><tbody><tr><td>nombre</td><td>Nombre del cubo</td></tr><tr><td>descripción</td><td>Descripción de este cubo. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>caption</td><td>Una cadena que se muestra en lugar del nombre del cubo. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>cache</td><td>Si los datos de la tabla de hechos para este cubo deben ser almacenados en caché por Mondrian o no. La acción predeterminada es almacenar en caché los datos.</td></tr><tr><td>habilitado</td><td>Si el elemento está habilitado: si es true, entonces el cubo se realiza; de lo contrario se ignora.</td></tr><tr><td>visible</td><td>Si este cubo es visible en la interfaz de usuario.</td></tr></tbody></table>
{% endtab %}

{% tab title="Dimensión" %}
{% hint style="info" %}

#### Dimensión

Una Dimensión es un atributo estructural de un Cubo que es una lista de nombres relacionados —conocidos como Miembros—, todos los cuales pertenecen a una categoría similar en la percepción del usuario sobre los datos. Por ejemplo, meses y trimestres pueden formar una dimensión Meses; de igual modo, todas las ciudades, regiones y países pueden formar una dimensión Región.&#x20;

Una Dimensión actúa como un índice para identificar valores dentro de un arreglo multidimensional y ofrece una forma muy concisa e intuitiva de organizar y seleccionar datos para recuperación, exploración y análisis. Las Dimensiones son los parámetros de negocio normalmente vistos en las filas y columnas de un informe. Una Dimensión es una colección de atributos lógicamente relacionados, equivalente a una tabla.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/5hfEPQDeQcTVMBnvmZu6/image.png" alt=""><figcaption><p>Elemento Dimension</p></figcaption></figure>

<table><thead><tr><th width="152">Atributo</th><th>Descripción</th></tr></thead><tbody><tr><td>nombre</td><td>Nombre de la dimensión</td></tr><tr><td>descripción</td><td>Descripción de esta dimensión. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>clave foránea</td><td>El nombre de la columna en la tabla de hechos.</td></tr><tr><td>tipo</td><td>El tipo de la dimensión puede ser "Standard" o "Time". Una dimensión de tiempo permitirá el uso de las funciones de tiempo MDX (WTD, YTD, QTD, etc.). Usa una dimensión estándar si la dimensión no está relacionada con el tiempo. El valor predeterminado es "Standard".</td></tr><tr><td>prefijo de uso</td><td>Agrega un prefijo de texto a los nombres de columna de una dimensión en tablas agregadas para prevenir conflictos de nombres cuando múltiples dimensiones usan nombres de columna similares. Esto solo debe establecerse para dimensiones privadas.</td></tr><tr><td>caption</td><td>Una cadena que se muestra en lugar del nombre de la dimensión. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>visible</td><td>Si esta dimensión es visible en la interfaz de usuario. Predeterminado true.</td></tr></tbody></table>
{% endtab %}

{% tab title="Jerarquía" %}
{% hint style="info" %}

#### Jerarquía

Las jerarquías permiten una mejor experiencia en la interfaz de usuario. Una jerarquía es una forma de organizar datos en diferentes niveles de agregación. Al ver datos, los analistas usan jerarquías de dimensión para reconocer tendencias en un nivel, profundizar a niveles inferiores para identificar las razones de estas tendencias y consolidar a niveles superiores para ver qué efecto tienen estas tendencias en un sector más amplio del negocio.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/rqs0ogydFS2NMRyIa4un/image.png" alt=""><figcaption><p>Elemento Hierarchy</p></figcaption></figure>

{% hint style="info" %}
El Nivel en cada jerarquía debe tener una relación estricta de uno a muchos con el siguiente nivel. En la jerarquía \[Markets], cada Country pertenece a un solo Territory, y cada City pertenece a un solo State Province. El efecto neto es que cada nivel inferior tiene más miembros que el anterior.
{% endhint %}

<table><thead><tr><th width="183">Atributo</th><th>Descripción</th></tr></thead><tbody><tr><td>nombre</td><td>Nombre de la jerarquía. Si no se especifica, la jerarquía tiene el mismo nombre que su dimensión.</td></tr><tr><td>descripción</td><td>Descripción de esta jerarquía. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>hasAll</td><td>Si esta jerarquía tiene un miembro 'all'.</td></tr><tr><td>allMemberName</td><td>Nombre del miembro 'all'. Si este atributo no se especifica, el miembro all se nombra 'All hierarchyName', por ejemplo, 'All Store'.</td></tr><tr><td>allMemberCaption</td><td>Una cadena que se muestra en lugar del nombre del miembro all. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>allLevelName</td><td>Nombre del nivel 'all'. Si este atributo no se especifica, el miembro all se nombra '(All)'. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>defaultMember</td><td>Valor del miembro por defecto</td></tr><tr><td>memberReaderClass</td><td>Nombre de la clase personalizada lector de miembros. Debe implementar la interfaz mondrian.rolap.MemberReader.</td></tr><tr><td>primaryKeyTable</td><td>El nombre de la tabla que contiene la clave primaria. Si la jerarquía tiene una sola tabla, por defecto es esa; es obligatorio.</td></tr><tr><td>primaryKey</td><td>El nombre de la columna que identifica a los miembros y que es referenciada por filas en la tabla de hechos. Si no se especifica, se usa la clave del nivel más bajo. Véase también CubeDimension.foreignKey.</td></tr><tr><td>caption</td><td>Una cadena para mostrar en la interfaz de usuario. Si no se especifica, se usa el nombre de la jerarquía. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>visible</td><td>Si esta jerarquía es visible en la interfaz de usuario. Predeterminado true.</td></tr></tbody></table>

{% hint style="info" %}
Por defecto, cada jerarquía contiene un nivel superior llamado '(All)', que contiene un único miembro llamado '(All {hierarchyName})'. Este miembro es padre de todos los demás miembros de la jerarquía y, por tanto, representa un gran total.

El miembro all también es el miembro predeterminado de la jerarquía; es decir, el miembro que se utiliza para calcular valores de celda cuando la jerarquía no está incluida en un eje o en el slicer. Varios atributos permiten controlar el nivel y miembro all. Los atributos allMemberName y allLevelName del elemento anulan los nombres predeterminados del nivel all y del miembro all.

Si el elemento tiene hasAll="false", el nivel 'all' se suprime. El miembro predeterminado de esa dimensión ahora será el primer miembro del primer nivel; por ejemplo, en una jerarquía de Tiempo, será el primer año de la jerarquía. Cambiar el miembro predeterminado puede ser confuso, por lo que generalmente deberías usar hasAll="true".

También puedes establecer explícitamente el miembro predeterminado de una jerarquía. El atributo defaultMember debe ser el nombre completamente calificado del miembro predeterminado.
{% endhint %}

```xml
<Hierarchy name="Yearly" hasAll="false"  defaultMember="[Time].[1997].[Q1].[1]">
    ...
    </Hierarchy> 
```

{% hint style="info" %}
Cuando se especifica de esta manera, el miembro predeterminado incluso puede ser un miembro calculado.
{% endhint %}
{% endtab %}

{% tab title="Nivel" %}
{% hint style="info" %}

#### Nivel

El elemento Level puede considerarse como la representación de una columna en una tabla. Es una colección de Miembros que están a la misma distancia de la raíz de la jerarquía.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/9w9HpPaCMvIN9gbsipVX/image.png" alt=""><figcaption><p>Elemento Level</p></figcaption></figure>

<table><thead><tr><th width="182">Atributo</th><th>Descripción</th></tr></thead><tbody><tr><td>nombre</td><td>Nombre del Nivel.</td></tr><tr><td>descripción</td><td>Descripción de este Nivel. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>tabla</td><td>El nombre de la tabla de la que proviene la columna. Si esta jerarquía se basa en una sola tabla, por defecto es el nombre de esa tabla; de lo contrario, es obligatorio. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>columna</td><td>El nombre de la columna que contiene el identificador único de este nivel.</td></tr><tr><td>nameColumn</td><td>El nombre de la columna que contiene el identificador visible (nombre) de este nivel.</td></tr><tr><td>parentColumn</td><td>El nombre de la columna que referencia al miembro padre en una jerarquía padre-hijo.</td></tr><tr><td>nullParentValue</td><td>Valor que identifica padres nulos en una jerarquía padre-hijo. Valores típicos son 'NULL' y '0'.</td></tr><tr><td>ordinalColumn</td><td>El nombre de la columna que contiene los ordinales de los miembros. Si no se especifica esta columna, se usa la columna de clave para el ordenamiento.</td></tr><tr><td>tipo</td><td>Indica el tipo de la columna de clave de este nivel: String, Numeric, Integer, Boolean, Date, Time o Timestamp. Al generar sentencias SQL, Mondrian encierra los valores de columnas String entre comillas, pero deja sin comillas los valores de columnas Integer y Numeric. Los valores Date, Time y Timestamp se citan según el dialecto SQL. Para un dialecto compatible con SQL, los valores aparecen prefijados por su tipo, por ejemplo, "DATE '2006-06-01'".</td></tr><tr><td>internalType</td><td>Indica el tipo Java que Mondrian usa para almacenar la columna de clave de este nivel. También determina el método JDBC que Mondrian llamará para recuperar la columna; por ejemplo, si el tipo Java es 'int', Mondrian llamará a 'ResultSet.getInt(int)'. Normalmente este atributo no es necesario, porque Mondrian puede elegir un tipo sensato basado en el tipo de la columna de la base de datos. Valores permitidos: 'int', 'long', 'Object', 'String'.</td></tr><tr><td>uniqueMembers</td><td>Si los miembros son únicos entre todos los padres. Por ejemplo, los códigos postales son únicos entre todos los estados. Los miembros del primer nivel siempre son únicos.</td></tr><tr><td>levelType</td><td>Si este es un nivel regular o relacionado con el tiempo. El valor marca la diferencia para funciones relacionadas con el tiempo como YTD (año hasta la fecha). El valor "TimeHalfYear" está obsoleto y se eliminará en mondrian-4.0; usa "TimeHalfYears" en su lugar.</td></tr><tr><td>hideMemberif</td><td>Condición que determina si un miembro de este nivel está oculto. Si una jerarquía tiene uno o más niveles con miembros ocultos, entonces es posible que no todos los miembros hoja estén a la misma distancia de la raíz, y se denomina jerarquía irregular. Valores permitidos: Never (un miembro siempre aparece; valor predeterminado); IfBlankName (un miembro no aparece si su nombre es nulo, vacío o solo espacios en blanco); e IfParentsName (un miembro aparece a menos que su nombre coincida con el del padre).</td></tr><tr><td>approxRowCount</td><td>El número estimado de filas en esta tabla de agregación. Establecer esta propiedad mejora el rendimiento del optimizador de agregaciones y evita que emita una consulta 'select count(*)' sobre la tabla de agregación.</td></tr><tr><td>caption</td><td>Una cadena que se muestra en lugar del nombre del nivel. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>captionColumn</td><td>El nombre de la columna que contiene el título (caption) para los miembros.</td></tr><tr><td>formateador</td><td><p>Nombre de una clase formateadora para las etiquetas de los miembros que se muestran. La clase debe implementar la interfaz mondrian.spi.MemberFormatter. Este atributo está obsoleto. </p><p>Por favor usa un elemento anidado MemberFormatter.</p></td></tr></tbody></table>
{% endtab %}

{% tab title="Propiedades" %}
{% hint style="info" %}

#### Propiedades

Muchas dimensiones, como Customer, son grandes, y es útil subconfigurarlas para propósitos de visualización incluso antes de crear una consulta. Puede que desees subconfigurar información por nombre / apellido del cliente, dirección, nivel de ingresos, formación educativa o estado civil antes de empezar a profundizar en un conjunto de datos, estratificando la población.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/m5EcuGzysayW6zqVs1es/image.png" alt=""><figcaption><p>Propiedades</p></figcaption></figure>

<table><thead><tr><th width="203">Atributo</th><th>Valor</th></tr></thead><tbody><tr><td>nombre</td><td>El nombre de la Propiedad.</td></tr><tr><td>descripción</td><td>Descripción de esta propiedad de miembro. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>columna</td><td>La columna de datos que determinará el contenido de esta subcategoría</td></tr><tr><td>tipo</td><td>Tipo de datos de esta propiedad: String, Numeric, Integer, Boolean, Date, Time o Timestamp.</td></tr><tr><td>formateador</td><td>Nombre de una clase formateadora para el valor apropiado de la propiedad que se muestra. La clase debe implementar la interfaz mondrian.spi.PropertyFormatter. Este atributo está obsoleto. Por favor usa un elemento anidado PropertyFormatter.</td></tr><tr><td>caption</td><td>Una cadena que se muestra en lugar del nombre. Puede localizarse desde un archivo de propiedades usando #{propertyname}.</td></tr><tr><td>dependsOnLevelValue</td><td>Debe establecerse a true si el valor de la propiedad depende funcionalmente del valor del nivel. Esto permite que la columna de propiedad asociada se omita de la cláusula GROUP BY (si la base de datos permite columnas en el SELECT que no están en el GROUP BY). Esto puede suponer una mejora de rendimiento significativa en algunas bases de datos, como MySQL.</td></tr></tbody></table>
{% endtab %}

{% tab title="Medidas" %}
{% hint style="info" %}

#### Medidas

El elemento XML Measure define una medida. Una medida es un valor, casi siempre numérico, que aparece en una celda. Estrictamente hablando, el elemento XML Measure define una medida almacenada. Mondrian también soporta medidas calculadas, que se calculan a partir de otras medidas usando una fórmula MDX. Aunque las medidas almacenadas y calculadas se definen y evalúan de forma diferente, para un usuario de negocio que ejecuta un informe aparecen igual.
{% endhint %}

```xml
<Measure name='Unit Sales' aggregator='sum' column='unit_sales' />
<Measure name='Store Sales' aggregator='sum' column='store_sales' />
<Measure name='Sales Count' aggregator='count' />
```

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/dwAtAqfTJtlVQtt86qCM/image.png" alt=""><figcaption><p>Medidas</p></figcaption></figure>

<table><thead><tr><th width="135">Agregador</th><th>Descripción</th></tr></thead><tbody><tr><td>sum</td><td>Suma valores numéricos. El agregador más común.</td></tr><tr><td>count</td><td>Cuenta el número de filas para las cuales una columna no es nula; si no se especifica columna, cuenta el número de filas.</td></tr><tr><td>distinct-count</td><td>Calcula el número de valores distintos de la columna. Los nulos no se cuentan.</td></tr><tr><td>max</td><td>Encuentra el valor máximo de una columna.</td></tr><tr><td>min</td><td>Encuentra el valor mínimo de una columna.</td></tr><tr><td>avg</td><td>Calcula el valor promedio de una columna numérica.</td></tr></tbody></table>
{% endtab %}

{% tab title="Anotaciones" %}
{% hint style="info" %}

#### Anotaciones

Los principales tipos de elementos (schema, cube, virtual cube, shared dimension, dimension, hierarchy, level, measure, calculated member) soportan anotaciones. Una anotación es una forma de asociar una propiedad definida por el usuario con un elemento de metadatos y permite que las herramientas añadan metadatos sin extender el esquema oficial de Mondrian.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/VLCJbSi5xQoetAvNtGiu/blobs/yHsm2O55SKJqZUBsLWqe/image.png" alt=""><figcaption><p>Anotaciones</p></figcaption></figure>

{% hint style="info" %}
Crea un elemento como hijo del elemento que deseas anotar (generalmente es el primer elemento hijo, pero verifica la definición del esquema para detalles), luego incluye varios elementos. Los nombres de los elementos deben ser únicos dentro de su elemento. Si estás añadiendo anotaciones para soportar una herramienta que mantienes, elige los nombres de anotaciones con cuidado para asegurar que no choquen con las anotaciones usadas por otras herramientas.

El siguiente ejemplo muestra la anotación "AnalyzerDateFormat":
{% endhint %}

```xml
<Schema name="SteelWheels">
<Cube name="Sales 2003 to 2005">
... 
<Annotations>
<Annotation name=" AnalyzerDateFormat">[yyyy]
</Annotation>
```

<table data-full-width="false"><thead><tr><th width="284">Anotación</th><th width="168">Elemento</th><th width="269">Descripción</th></tr></thead><tbody><tr><td>AnalyzerBusinessGroup</td><td>Nivel</td><td>Usado para crear carpetas en la IU</td></tr><tr><td>AnalyzerBusinessGroupDescription</td><td>Nivel</td><td>Descripción para las carpetas</td></tr><tr><td>AnalyzerDateFormat</td><td>Nivel</td><td>Usado para filtros de fecha relativos</td></tr><tr><td>AnalyzerHideInUI</td><td>Measure, CalculatedMember</td><td>Oculta el campo en la IU</td></tr><tr><td>AnalyzerDisableDrillLinks</td><td>Cubo</td><td>Desactiva los enlaces de drillthrough en el cubo</td></tr></tbody></table>
{% endtab %}
{% endtabs %}
