6.14 Dimensiones lentamente cambiantes
6.14 Dimensiones lentamente cambiantes bernabeu_dario Wed, 08/25/2010 - 02:59Las dimensiones lentamente cambiantes o SCD (Slowly Changing Dimensions) son dimensiones en las cuales sus datos tienden a modificarse a través del tiempo, ya sea de forma ocasional o constante, o implique a un solo registro o la tabla completa. Cuando ocurren estos cambios, se puede optar por seguir alguna de estas dos grandes opciones:
- Registrar el historial de cambios.
- Reemplazar los valores que sean necesarios.
Inicialmente Ralph Kimball planteó tres estrategias a seguir cuando se tratan las SCD: tipo 1, tipo 2 y tipo 3; pero a través de los años la comunidad de personas que se encargaba de modelar bases de datos profundizó las definiciones iniciales e incluyó varios tipos SCD más, por ejemplo: tipo 4 y tipo 6.
A continuación se detallará cada tipo de estrategia SCD:
- SCD Tipo 1: Sobreescribir.
- SCD Tipo 2: Añadir fila.
- SCD Tipo 3: Añadir columna.
- SCD Tipo 4: Tabla de Historia separada.
- SCD Tipo 6: Híbrido.
De acuerdo a la naturaleza del cambio se debe seleccionar qué Tipo SCD se utilizará, en algunos casos resultará conveniente combinar varias técnicas.
Es importante señalar que si bien hay diferentes maneras de implementar cada técnica, es indispensable contar con claves subrogadas en las tablas de dimensiones para aplicar poder aplicar dichas técnicas.
Al aplicar las diferentes técnicas SCD, en muchos casos se deberá modificar la estructura de la tabla de dimensión con la que se este trabajando, por lo cual estas modificaciones son recomendables hacerlas al momento de modelar la tabla; aunque también puede hacerse una vez que ya se ha modelado y contiene datos, para lo cual al añadir por ejemplo una nueva columna se deberá especificar los valores por defecto que adoptarán los registros de la tabla.
NOTA: para todos los ejemplos a continuación, "id_Producto" es una clave subrogada que es clave principal de la tabla utilizada.
SCD Tipo 1: Sobreescribir
Este tipo es el más básico y sencillo de implementar, ya que si bien no guarda los cambios históricos, tampoco requiere ningún modelado especial y no necesita que se añadan nuevos registros a la tabla.
En este caso cuando un registro presente un cambio en alguno de los valores de sus campos, se debe proceder simplemente a actualizar el dato en cuestión, sobreescribiendo el antiguo. Para ejemplificar este caso, se tomará como referencia la siguiente tabla:
id_Producto | Rubro | Tipo | Producto |
1 | Rubro 1 | Tipo 1 | Producto 1 |
Ahora, se supondrá que este producto ha cambiado de Rubro, y ahora a pasado a ser "Rubro 2", entonces se obtendrá lo siguiente:
id_Producto | Rubro | Tipo | Producto |
1 | Rubro 2 | Tipo 1 | Producto 1 |
Usualmente este tipo es utilizado en casos en donde la información histórica no sea importante de mantener, tal como sucede cuando se debe modificar el valor de un registro porque tiene errores de ortografía. El ejemplo planteado es solo a fines prácticos, ya que con esta técnica, todos los movimientos realizados de "Producto 1", que antes pertenecían al "Rubro 1", ahora pasarán a ser del "Rubro 2", lo cual creará una gran inconsistencia en el DW.
SCD Tipo 2: Añadir fila
Esta estrategia requiere que se agreguen algunas columnas adicionales a la tabla de dimensión, para que almacenen el historial de cambios.
Las columnas que suelen agregarse son:
- FechaInicio: fecha desde que entró en vigencia el registro actual. Por defecto suele utilizarse una fecha muy antigua, ejemplo: "01/01/1000".
- FechaFin: fecha en la cual el registro actual dejó de estar en vigencia. Por defecto suele utilizarse una fecha muy futurista, ejemplo: "01/01/9999".
- Versión: número secuencial que se incrementa cada nuevo cambio. Por defecto suele comenzar en "1".
- Versión actual: especifica si el campo actual es el vigente. Este valor puede ser en caso de ser verdadero: "true" o "1"; y en caso de ser falso: "flase" o "0".
Entonces, cuando ocurra algún cambio en los valores de los registros, se añadirá una nueva fila y se deberá completar los datos referidos al historial de cambios.
Para ejemplificar este caso, se tomará como referencia la siguiente tabla:
id_Producto | Rubro | Tipo | Producto |
1 | Rubro 1 | Tipo 1 | Producto 1 |
A continuación se añadirán las columnas que almacenarán el historial:
id_Producto | Rubro | Tipo | Producto | FechaInicio | FechaFin | Version | VersionActual |
1 | Rubro 1 | Tipo 1 | Producto 1 | 01/01/1000 | 01/01/9999 | 1 | true |
Ahora, se supondrá que este producto ha cambiado de Rubro, y ahora a pasado a ser "Rubro 2", entonces se obtendrá lo siguiente:
id_Producto | Rubro | Tipo | Producto | FechaInicio | FechaFin | Version | VersionActual |
1 | Rubro 1 | Tipo 1 | Producto 1 | 01/01/1000 | 06/11/2009 | 1 | false |
2 | Rubro 2 | Tipo 1 | Producto 1 | 07/11/2009 | 01/01/9999 | 2 | true |
Como puede observarse, se lleva a cabo el siguiente proceso:
- Se añade una nueva fila con su correspondiente clave subrogada ("id_Producto").
- Se registra la modificación ("Rubro").
- Se actualizan los valores de "FechaInicio" y "FechaFin", tanto de la fila nueva, como la antigua (la que presentó el cambio).
- Se incrementa en uno el valor del campo "Version" que posee la fila antigua.
- Se actualizan los valores de "VersionActual", tanto de la fila nueva, como la antigua; dejando a la fila nueva como el registro vigente (true).
Esta técnica permite guardar ilimitada información de cambios.
SCD Tipo 3: Añadir columna
Esta estrategia requiere que se agregue a la tabla de dimensión una columna adicional por cada columna cuyos valores se desea mantener un historial de cambios.
Para ejemplificar este caso, se tomará como referencia la siguiente tabla:
id_Producto | Rubro | Tipo | Producto |
1 | Rubro 1 | Tipo 1 | Producto 1 |
A continuación se añadirá una columna para mantener el histórico de cambios sobre los datos de la columna "Rubro":
id_Producto | Rubro | RubroAnterior | Tipo | Producto |
1 | Rubro 1 | - | Tipo 1 | Producto 1 |
Ahora, se supondrá que este producto ha cambiado de Rubro, y ahora a pasado a ser "Rubro 2", entonces se obtendrá lo siguiente:
id_Producto | Rubro | RubroAnterior | Tipo | Producto |
1 | Rubro 2 | Rubro 1 | Tipo 1 | Producto 1 |
Como puede observarse, se lleva a cabo el siguiente proceso:
- En la columna "RubroAnterior" se coloca el valor antiguo.
- En la columna "Rubro" se coloca el nuevo valor vigente.
Esta técnica permite guardar una limitada información de cambios.
SCD Tipo 4: Tabla de Historia separada
Esta técnica se utiliza en combinación con alguna otra y su función básica es almacenar en una tabla adicional los detalles de cambios históricos realizados en una tabla de dimensión.
Esta tabla histórica indicará por ejemplo que tipo de operación se ha realizado (Insert, Update, Delete), sobre que campo y en que fecha. El objetivo de mantener esta tabla es el de contar con un detalle de todos los cambios, para luego analizarlos y poder tomar decisiones acerca de cuál técnica SCD podría aplicarse mejor. Por ejemplo, la siguiente tabla histórica registra los cambios de la tabla de dimensión "Productos", la cual supondremos emplea el SCD Tipo 2:
id_Producto | Rubro_Cambio | Tipo_Cambio | Producto_Cambio | FechaDeCambio |
1 | Insert | - | - | 05/06/2000 |
2 | Insert | Insert | - | 25/10/2002 |
3 | - | Insert | - | 17/01/2005 |
4 | - | - | Insert | 18/02/2009 |
Tomando como ejemplo el primer registro de esta tabla, la información allí guardada indica lo siguiente:
- El día "05/06/2000", el registro de la tabla de dimensión "Productos" con "id_Producto" igual a "1" sufrió un cambio de "Rubro", por lo cual se debío insertar ("Insert") una nueva fila con los valores vigentes.
SCD Tipo 6: Híbrido
Esta técnica combina las SCD Tipo 1, 2 y 3.
Se denomina SCD Tipo "6", simplemente porque: 6 = 1 + 2 +3.