Les dimensions lentament canviants o SCD (Slowly Changing Dimensions) són dimensions en les quals les seves dades tendeixen a modificar-se a través del temps, ja sigui de forma ocasional o constant, o impliqui a un sol registre o la taula completa. Quan es produeixen aquests canvis, es pot optar per seguir alguna d'aquestes dues grans opcions:
- Registrar l'historial de canvis.
- Reemplaçar els valors que siguin necessaris.
Inicialment Ralph Kimball va plantejar tres estratègies a seguir quan es tracten les SCD: tipus 1, tipus 2 i tipus 3, però a través dels anys la comunitat de persones que s'encarregava de modelar bases de dades va aprofundir les definicions inicials i va incloure diversos tipus SCD més, per exemple: tipus 4 i tipus 6.
A continuació es detallarà cada tipus d'estratègia SCD:
- SCD Tipus 1: Sobreescriure.
- SCD Tipus 2: Afegir fila.
- SCD Tipus 3: Afegir columna.
- SCD Tipus 4: Taula d'Història separada.
- SCD Tipus 6: Híbrid.
D'acord a la naturalesa del canvi s'ha de seleccionar quins Tipus SCD s'utilitzarà, en alguns casos resultarà convenient combinar diverses tècniques.
És important assenyalar que si bé hi ha diferents maneres d'implementar cada tècnica, és indispensable comptar amb claus subrogades en les taules de dimensions per poder aplicar aquestes tècniques.
En aplicar les diferents tècniques SCD, en molts casos s'haurà de modificar l'estructura de la taula de dimensió amb la que s'estigui treballant, per la qual cosa aquestes modificacions són recomanables fer-les al moment de modelar la taula, encara que també pot fer-se una vegada que ja s'ha modelat i conté dades, per a això en afegir ara una nova columna caldrà especificar els valors per defecte que adoptaran els registres de la taula.
NOTA: per a tots els exemples a continuació, "id_Producte" és una clau subrogada que és clau principal de la taula utilitzada.
SCD Tipus 1: Sobreescriure
Aquest tipus és el més bàsic i senzill d'implementar, ja que si bé no desa els canvis històrics, tampoc requereix cap modelat especial i no necessita que s'afegeixin nous registres a la taula.
En aquest cas quan un registre presenti un canvi en algun dels valors dels seus camps, s'ha de procedir simplement a actualitzar la dada en qüestió, sobreescrivint l'antic. Per exemplificar aquest cas, es prendrà com a referència la taula següent:
id_Producte | Nom | Tipus | Producte |
1 | Rubro 1 | Tipo 1 | Producto 1 |
Ara, es suposarà que aquest producte ha canviat de Nom, i ara a passat a ser "Nom 2", llavors s'obtindrà el següent:
id_Producte | Nom | Tipus |
Producte |
1 | Nom 2 | Tipus 1 | Producte 1 |
Normalment aquest tipus és utilitzat en casos on la informació històrica no sigui important de mantenir, tal com passa quan s'ha de modificar el valor d'un registre perquè té errors d'ortografia. L'exemple plantejat és només a fins pràctics, ja que amb aquesta tècnica, tots els moviments realitzats de "Producte 1", que abans pertanyien al "Nom 1", ara passaran a ser del "Nom 2", la qual cosa crearà una gran inconsistència al DW.
SCD Tipus 2: Afegir fila
Aquesta estratègia requereix que s'afegeixin algunes columnes addicionals a la taula de dimensió, perquè emmagatzemin el historial de canvis.
Les columnes que solen afegir són:
- DataInici: data des que va entrar en vigència el registre actual. Per defecte sol utilitzar una data molt antiga, exemple: "01/01/1000".
- DatAFi: data en la qual el registre actual va deixar d'estar en vigència. Per defecte sol utilitzar una data molt futurista, exemple: "01/01/9999".
- Versió: número seqüencial que s'incrementa cada nou canvi. Per defecte sol començar a "1".
- Versió actual: especifica si el camp actual és el vigent. Aquest valor pot ser en cas de ser veritable: "true" o "1", i en cas de ser fals: "flaixos" o "0".
Llavors, quan es produeixi algun canvi en els valors dels registres, s'afegirà una nova fila i s'haurà de completar les dades referides a l'historial de canvis.
Per exemplificar aquest cas, es prendrà com a referència la taula següent:
id_Producte | Nom | Tipus | Producte |
1 | Nom1 | Tipus 1 | Producte 1 |
A continuació s'afegiran les columnes que emmagatzema el historial:
id_Producte | Nom | Tipus | Producte | DataInici | DataFi | Versio | VersioActual |
1 | Nom1 | Tipus 1 | Producte 1 | 01/01/1000 | 01/01/9999 | 1 | true |
Ara, es suposarà que aquest producte ha canviat deNom, i ara a passat a ser "Nom 2", llavors s'obtindrà el següent:
id_Producte | Nom | Tipus | Producte | DataInici | DataFi | Versio | VersioActual |
1 | Nom1 | Tipus 1 | Producte 1 | 01/01/1000 | 06/11/2009 | 1 | false |
2 | Nom2 | Tipus 1 | Producte 1 | 07/11/2009 | 01/01/9999 | 2 | true |
Com es pot observar, es porta a terme el procés següent:
- S'afegeix una nova fila amb la seva corresponent clau subrogada ( "id_Producte").
- Es registra la modificació ( "Nom").
- S'actualitzen els valors de "DataInici" i "DataFi", tant de la fila nova, com l'antiga (la que va presentar el canvi).
- S'incrementa en un el valor del camp "Versio" que posseeix la fila antiga.
- S'actualitzen els valors de "VersioActual", tant de la fila nova, com l'antiga, deixant a la fila nova com el registre vigent (true).
Aquesta tècnica permet guardar il limitada informació de canvis.
SCD Tipus 3: Afegir columna
Aquesta estratègia requereix que es afegiu a la taula de dimensió una columna addicional per cada columna els valors es vol mantenir un historial de canvis.
Per exemplificar aquest cas, es prendrà com a referència la taula següent:
id_Producte | Nom | Tipus | Producte |
1 | Nom1 | Tipus 1 | Producte 1 |
A continuació s'afegirà una columna per mantenir l'històric de canvis sobre les dades de la columna "Nom":
id_Producte | Nom | NomAnterior | Tipus | Producte |
1 | Nom1 | - | Tipus 1 | Producte 1 |
Ara, es suposarà que aquest producte ha canviat de Nom, i ara a passat a ser "Nom 2", llavors s'obtindrà el següent:
id_Producte | Nom | NomAnterior | Tipus | Producte |
1 | Nom 2 | Nom 1 | Tipus 1 | Producte 1 |
Com es pot observar, es porta a terme el procés següent:
- A la columna "NomAnterior" es col loca el valor antic.
- A la columna "Nom" es col loca el nou valor vigent.
Aquesta tècnica permet guardar una limitada informació de canvis.
SCD Tipus 4: Taula d'Història separada
Aquesta tècnica s'utilitza en combinació amb alguna altra i la seva funció bàsica és emmagatzemar en una taula addicional els detalls de canvis històrics realitzats en una taula de dimensió.
Aquesta taula històrica d'indicar per exemple quin tipus d'operació s'ha realitzat (Insert, Update, Delete), sobre que camp i en quina data. L'objectiu de mantenir aquesta taula és el de comptar amb un detall de tots els canvis, per després analitzar-los i poder prendre decisions sobre quina tècnica SCD podria aplicar millor. Per exemple, la següent taula històrica registra els canvis de la taula de dimensió "Productes", la qual suposarem empra el SCD Tipus 2:
id_Producte | Nom_Cambi | Tipus_Cambi | Producte_Cambi | DataDeCambi |
1 | Insert | - | - | 05/06/2000 |
2 | Insert | Insert | - | 25/10/2002 |
3 | - | Insert | - | 17/01/2005 |
4 | - | - | Insert | 18/02/2009 |
Prenent com a exemple el primer registre d'aquesta taula, la informació allà guardada indica el següent:
- El dia "05/06/2000", el registre de la taula de dimensió "Productes" amb "id_Producte" igual a "1" va sofrir un canvi de "Nom", per la qual cosa devia inserir ( "Insert") una nova fila amb els valors vigents.
SCD Tipus 6: Híbrid
Aquesta tècnica combina les SCD Tipus 1, 2 i 3.
Es denomina SCD Tipus "6", simplement perquè: 6 = 1 + 2 +3.