Slowly Changing Dimensions – Tipos 3. 4 y 6.

22 Oct, 2015

Rut Almoguera Poggi

                                              


En el post anterior hablamos de los SCD 0,1 y 2, en esto post veremos algunos otros que en varios casos son más complicados de implementar.
 
Además de los SCD 0, 1 y 2 que vimos en el post anterior, que son las más comunes y fáciles de implementar, existen otras alternativas interesantes sobre cómo se puede manejar el cambio en las dimensiones cuando se desea registrar en el DWH dichos cambios.  En esta ocasión nos encargaremos de definir los tipos 3, 4 y 6, los cuales guardan los cambios de las dimensiones, pero cada uno lo hace de una manera diferente. 
 
Tipo 3(SCD3): En este caso, se desea guardar la historia de los cambios, pero a diferencia del tipo 2, se guarda solamente un número finito y predeterminado de cambios, y no se agrega un registro nuevo en la tabla, sino que se tienen campos extra en la misma fila para guardar los valores anteriores.
 
Usualmente se implementa el tipo 3 si tenemos la necesidad de guardar unos pocos cambios, como por ejemplo, las direcciones de residencia de una persona, en donde podríamos tener tres campos dentro de la tabla para guardar los últimos tres sitios en donde la persona ha vivido.  En este caso, si la persona se vuelve a mudar, la dirección más antigua se pierde y se guardan solamente las tres últimas.
 
Sin embargo, es importante advertir que este método sube la complejidad del desarrollo del ETL, pero tiene la ventaja de no aumentar el tamaño de la tabla de la dimensión, pues en ocasiones ciertas tablas de dimensiones pueden ser demasiado grandes, como suelen ser,  por ejemplo, las tablas de clientes en un banco internacional, y si se desea guardar la historia de los cambios de algún atributo de la dimensión, se prefiere la complejidad antes que incrementar el tamaño de la tabla, pues esto podría degradar el performance de consulta al DWH.
 
Para ilustrar esto, , si tenemos la dimensión producto, y queremos guardar el histórico de 2 cambios de  precio, la tabla que tendríamos para dicha dimensión seria como se muestra a continuación:
 
SK_Producto
Codigo_Producto
Descripcion
Precio_actual
Precio_anterior
1
SANDDAMLUJ0012
Sandalia de Dama de Fiesta
20.000,00
2
ZAPCABACUER0018
Zapato Caballero Cuero Cerrados
35.000,00
3
ZAPDAMTAC0039
Zapato Dama Tacón Corrido
25.000,00
15.000,00
 
En dicha tabla podemos notar que el producto ZAPDAMTAC0039 tiene un precio actual de 25.000,00 y que anteriormente su precio era de 15.000,00.  Si ese mismo producto cambiara ahora su precio a 30.000,00, la tabla se mostraría como sigue:
 
SK_Producto
Codigo_Producto
Descripcion
Precio_actual
Precio_anterior
1
SANDDAMLUJ0012
Sandalia de Dama de Fiesta
20.000,00
2
ZAPCABACUER0018
Zapato Caballero Cuero Cerrados
35.000,00
3
ZAPDAMTAC0039
Zapato Dama Tacón Corrido
30.000,00
25.000,00
 
Nótese como en este caso, ya no tenemos manera de saber que dicho producto en algún momento tuvo un precio de 15.000,00, pero seguimos viendo los últimos dos cambios de precio sin agregar ninguna fila estra a la tabla.
 
Tipo 4 (SCD 4):  En este tipo, se guarda en la tabla original el último valor, pero se tiene una mini tabla de dimensión que guarda la historia de los cambios.  Y en este caso, la tabla Fact guarda referencia a las dos dimensiones, es decir a la que tiene el valor actual y a la que tiene la historia de los cambios.
 
En la dimensión que contiene el último valor se encuentran todos los campos de la dimensión, pero en la que tiene el histórico de cambios solo están el SK de ese registro, la clave natural y el campo que cambio, con otros dos campos de fecha que indican el inicio y el fin de la vigencia de dicho valor.  Con esto, se preserva la historia de cambios y no se afecta el performance de consulta, sin embargo sube la complejidad de los queries cuando se desea consultar la historia de los cambios de dicho campo.  Esto se suele usar cuando se tiene un campo que es extremadamente volátil y que sufre cambios con una frecuencia alta.
 
Siguiendo con nuestro ejemplo de la tabla de productos, en donde el producto ZAPDAMTAC0039, ha tenido tres precios distintos, que son 15.000, 25.000 y finalmente 30.000, tendríamos dos tablas, una con los productos con su precio actual:
SK_Producto
Codigo_Producto
Descripcion
Precio
1
SANDDAMLUJ0012
Sandalia de Dama de Fiesta
20.000,00
2
ZAPCABACUER0018
Zapato Caballero Cuero Cerrados
35.000,00
5
ZAPDAMTAC0039
Zapato Dama Tacón Corrido
30.000,00
Y otra tabla con el histórico de los cambios:
SK_Producto
Codigo_Producto
Precio
Fecha_Inicio_Vigencia
Fecha_Fin_Vigencia
3
ZAPDAMTAC0039
15.000,00
2015-08-02
2015-08-17
4
ZAPDAMTAC0039
25.000,00
2015-08-17
2015-09-20
Nótese como en la tabla del histórico de cambios solo están los campos pertinentes al cambio de precios, y los otros campos de la dimensión, como la descripción del producto no se encuentran en dicha tabla de históricos de precios.
Tipo 6 (SCD 6): Este tipo es una combinación del tipo 1 el tipo 2.  Se implementa igual que el tipo 2, agregando una fila nueva por cada cambio en el campo al que se le desea guardar el histórico de cambios, pero además de esto, se tiene una columna extra en donde se guarda cual es el valor actual.
 
Siguiendo con nuestro ejemplo de la dimensión producto, en donde el productoZAPDAMTAC0039  ha tenido tres precios que son 15.000, 25.000 y 30.000, tendríamos la tabla de productos como sigue:
 
                                                                                 
SK_Producto
Codigo_Producto
Descripcion
Precio
Fecha_Inicio_Vigencia
Fecha_Fin_Vigencia
Precio_actual
1
SANDDAMLUJ0012
Sandalia de Dama de Fiesta
20.000,00
2015-08-02
20.000,00
2
ZAPCABACUER0018
Zapato Caballero Cuero Cerrados
35.000,00
2015-08-02
35.000,00
3
ZAPDAMTAC0039
Zapato Dama Tacón Corrido
15.000,00
2015-08-02
2015-08-17
30.000,00
4
ZAPDAMTAC0039
Zapato Dama Tacón Corrido
25.000,00
2015-08-17
2015-09-20
30.000,00
5
ZAPDAMTAC0039
Zapato Dama Tacón Corrido
30.000,00
2015-09-20
30.000,00
Como podemos observar en nuestro ejemplo, todas las filas del producto ZAPDAMTAC0039, tienen un campo que indica cual es el valor vigente para el precio, que en este caso es 30.000,00.
 
Como podemos ver existen muchas propuestas para manejar el cambio en las dimensiones, cual elijamos implementar, dependerá del caso particular que estemos modelando.