15 de diciembre de 2013

Creacion Link Table

Cuando se tiene un modelo de datos con más de una Fact Table,  pueden presentarse relaciones circulares y “Synthetic Key”.  La primera técnica para solucionar esto es unir las Fact Tables en una sola tabla usando la función Concatenate, siempre que compartan la mayoría de las Key.


Cuando no comparten la mayoria de las Keys, entonces es conveniente usar LinkTables.


Si se tiene una Fact Table de Ventas, y otra de Compras, y se desea saber, por ejemplo, las ventas y  las compras de un producto específico al seleccionar una fecha,  esto no se obtendría con la asociación natural que hace qlikview. Si se ejecutara sólo el PASO 1 del script debajo, se crean las tablas con la asociación natural de qlikview:

Asociación Natural de Qlikview:















El siguiente script  muestra la creación de una Link Table, considerando las fechas de las tablas Ventas y Compras.


Para más información sobre Link Table, ver referencias al final.


//PASO 1: ==========  CARGA DE DATOS  =============================================
Ventas:
LOAD * INLINE [
  IdVenta, IdProducto, Venta, FechaVenta
  V1, P1, 54, 28/11/2011
  V2, P2, 29, 29/11/2011
  V3, P2, 73, 30/11/2011
  V4, P2, 66, 01/12/2011
  V5, P1, 55, 01/01/2012];
Compras:
LOAD * INLINE [
  IdCompra, IdProducto, Compra, FechaCompra
  C1, P1, 61, 28/11/2011
  C2, P1, 29, 29/11/2011
  C3, P1, 55, 30/11/2011
  C4, P2, 88, 01/12/2011
  C5, P2, 84, 15/01/2012];
Productos:
LOAD * INLINE [
  IdProducto, Producto_Desc
  P1, Silla
  P2, Mesa ];
//PASO 2: ====== CREACIÓN DE FACT TABLES CON NUEVA KEY  ===============================
// Se renombrar las foreign key existentes en las Facts, que solo irán en la Link Table 
Fact_Ventas:
LOAD IdVenta,
     IdProducto as temp_idproducto,
     Venta,
     FechaVenta
  Resident Ventas; DROP Table Ventas;
Fact_Compras:
LOAD IdCompra,
     IdProducto as temp_idproducto,
     Compra,
     FechaCompra
     Resident Compras; DROP Table Compras;
//PASO 3: ============= CREACION DE LINK TABLE =========================================
//Concatena todas las key y foreign key existentes en las Fact Tables.
//La LinkTable solo tiene campos de las Fact.
//Los Campos de las tablas de dimensiones no se incluyen en la LinkTable
LinkTable:
LOAD
IdVenta,
temp_idproducto      as IdProducto,
FechaVenta                as Fecha
Resident Fact_Ventas;
Concatenate (LinkTable)
LOAD IdCompra,
temp_idproducto      as IdProducto,
FechaCompra            as Fecha
Resident Fact_Compras;
DROP Field temp_idproducto;
//PASO 4: //==============  CREACION CALENDARIO MAESTRO   ==========================
Calendario_tmp:
LOAD
FechaCompra  as Fecha
Resident Fact_Compras;
Outer Join
LOAD
FechaCompra  as Fecha
Resident Fact_Compras;
Calendario:
LOAD
Fecha,
Year (Fecha)      as Año,
Month (Fecha)     as Mes,
day(Fecha)        as Dia
Resident Calendario_tmp;
DROP Table Calendario_tmp;



Con LinkTable el modelo de datos queda así:


     












Referencia:

4 comentarios:

Anónimo dijo...

Hola, buen día.
Respecto al código del calendario maestro.
Veo que se repite lo que está antes y depués de outer join, ¿está bien o hay error?
Gracias.

Además otra consulta, para modelos más grandes, ¿podrían haber más de un link table?

Tendrás otro ejemplo de link tables pero con tres Facts a mas y varias dimensiones, porque en todos los ejemplos que he visto, siempre lo hacen dos dos fact tables.

Gracias.

Enmanuel Santana dijo...

Hola
Sobre el script repetido, tienes razón, la lectura de fechas después del outer jonio debe ser de la tabla de ventas, y no de la de compras. Gracias por la observación, tan pronto pueda hago la corrección.

Sobre tener más de una link table, conceptualmente es posible, si son modelos separados y no comparten relación. Si comparten relación tendría mas sentido tener una única link table con todas las relaciones incluidas y así mantener el modelo estrella.

Lamentablemente ahora no tengo un ejemplo con más de dos fact que pueda compartir. Cuando tenga tiempo hago algo y lo subo.

saludos y gracias por la observación


Anónimo dijo...

Hola Enmanuel. Sabía que algo andaba mal. Gracias.
Una consulta tendrás algún correo pues necesito hacerte unas preguntas.

Enmanuel Santana dijo...

enmanuel.s@gmail.com