Desnormalizando dimensiones de forma eficiente

Como vimos en una entrada anterior, cuando diseñamos un modelo de datos analítico, el enfoque principal debe situarse en lograr un diseño que favorezca la simplicidad en la exploración y agregación de los datos, a la vez que en obtener un rendimiento óptimo en la realización de consultas.

Las estructuras altamente normalizadas, con dimensiones organizadas en esquemas de copo de nieve que principalmente nos encontraremos en los sistemas de procesamiento de transacciones, no serán adecuadas para satisfacer las necesidades analíticas de la empresa teniendo la comprensibilidad del modelo por parte de los usuarios y la velocidad de consulta como objetivos principales. El hecho de disponer de más de una tabla por cada dimensión de la tabla de hechos de un proceso de negocio implica tener que realizar código más complejo para realizar una consulta que a su vez se ejecutará en un tiempo mayor, debido en parte al mayor número de relaciones.

Por ello, uno de los primeros pasos a seguir al diseñar un modelo de datos analítico corresponde a la desnormalización de los atributos que se encuentran alojados en los niveles superiores de las jerarquías dimensionales, de manera que cada tabla de búsqueda refleje una dimensión con todos sus atributos correspondientes.

La manera simple de abordar este proceso consiste en utilizar la interfaz gráfica del editor de consultas de Power BI. Utilizando la base de datos de ejemplo Adventure Works, lo que queremos es desnormalizar los atributos de las tablas de ‘Categoría de producto’ y ‘Subcategoría de producto’, de forma que una sola tabla contenga todos los atributos correspondientes a la dimensión ‘Producto’, claramente una de las dimensiones más importantes y donde un buen conjunto de atributos descriptivos se traducirá en una gran capacidad analítica al alcance de los usuarios de negocio:

Image 3

 

Para ello, desde el editor de consultas combinamos las tablas ‘Producto’ y ‘Subcategoría’:

Image 4

 

Como mediante este proceso solo podemos combinar 2 consultas a la vez, tenemos que realizar la operación una vez más para combinar también la tabla ‘Categoría’:

Image 5

 

Posteriormente, tenemos que borrar los atributos que no nos interese mantener, como las claves primarias que relacionan las consultas combinadas. Una vez realizado este proceso tendremos el resultado deseado, es decir, una única consulta con todos los atributos correspondientes a la dimensión ‘Producto’:

Image 6.png

 

Aunque este proceso es muy sencillo y aparentemente directo, es relativamente ineficiente, ya que todas las consultas involucradas deben actualizarse cada vez que las ponemos al día, independientemente de que no tengan ningún valor analítico como consultas independientes y no las carguemos al modelo de datos.

Una mejor forma de desnormalizar las dimensiones consiste en, mediante un solo conjunto de ordenes en M, seleccionar únicamente los campos que nos interesen de cada tabla (en vez de importar todos y posteriormente eliminar los que no queremos) y combinarlos de forma que tengamos en una sola consulta todos los atributos de la dimensión ‘Producto’. El siguiente código realiza los mismos pasos que hemos elaborado de forma manual a través del interfaz gráfico de Power Query, pero de una manera más rápida y eficiente:

let
Source = Sql.Database("explocal9988", "AdventureWorksDW"),
DimProducto = Source{[Name="DimProducto"]}[Data],
DimProducto.Final = Table.SelectColumns (DimProducto,
{"CProducto",
"NProducto",
"Fabricante",
"Marca",
"Color",
"CostoUnitario",
"PrecioUnitario" } ),

DimSubcategoria = Source{[Name="DimSubcategoria"]}[Data],
DimSubcategoria.Final = Table.SelectColumns ( DimSubcategoria,
{"NSubcategoria",
"CSubcategoria",
"CCategoria"}),

DimCategoria = Source{[Name="DimCategoria"]}[Data],
DimCategoria.Final = Table.SelectColumns ( DimCategoria,
{"NCategoria",
"CCategoria"}),


ProductoYSubcategoria = Table.Join(DimProducto.Final, "CSubcategoria", DimSubcategoria.Final, "CSubcategoria" ),


Producto = Table.Join( ProductoYSubcategoria, "CCategoria", DimCategoria.Final, "CCategoria" ),


Producto.Final = Table.SelectColumns (Producto, {
"CProducto",
"NProducto",
"NCategoria",
"NSubcategoria",
"Color",
"Marca" } )

in
Producto.Final

 

 

Deja un comentario