Grupo de Concepción de
Sistemas de Información,
InCo, Facultad de Ingeniería,
Universidad de la República
Montevideo, Uruguay
(http://www.fing.edu.uy/~csi/)
Ignacio Larrañaga (http://www.isoft.com.uy/~il/)
En este articulo se trata el problema de expresar las primitivas expuestas en la tesis de maestría “Data Warehouse Design and Maintenance through Schema Transformations” en SQL estándar. Esto quiere decir que las transformaciones que dicha primitiva aplica a las instancias son expresables utilizando solamente sentencias SQL exclusivamente.
El objetivo de esta investigación se centra en expresar las operaciones necesarias para la transformación de las instancias al aplicar las primitivas presentadas en el trabajo de tesis [Am2000].
El interés principal de esta investigación es que el resultado va a ser utilizado para plantear estrategias de carga y actualización de la información del DW (“Data Warehouse”) que se plantea en dicha tesis.
En el resto del articulo procederemos de la siguiente forma; en la sección 2 a dar contexto recordando las primitivas a utilizar y otros aspectos útiles. En la sección 3 haremos el análisis de las primitivas, dividiendo en AR (“Álgebra Relacional”) primeramente y posteriormente SQL. Continuaremos mencionando los trabajos futuros en la sección 4. En la sección 5 daremos las conclusiones del análisis y concluiremos mencionando la bibliografía utilizada.
Nos referiremos aquí a las primitivas de diseño que se tratan en la tesis citada anteriormente, por lo cual las recordaremos a continuación([1]).
· P1 Identity. Dada una relación esta genera otra que es exactamente la misma que la relación origen.
· P2 Data Filter. Dada una relación origen, esta genera otra donde solo se preservan algunos atributos. El objetivo es eliminar los atributos puramente operacionales.
· P3 Temporalization. Esta agrega un elemento de tiempo al conjunto de atributos de la relación.
· P4 Key Generalization. (*) Estas primitivas generalizan la clave de una relación de dimensión, entonces mas de una tupla por cada elemento de la relación puede ser almacenado.
· P5 Foreign Key Update. A través de esta primitiva una clave foránea y sus referencias pude ser cambiada en una relación. Esto es muy usado cuando las claves primarias son modificadas.
· P6 DD-Adding. (*) Las primitivas de este grupo agregan a una relación un atributo que es derivado de otros.
· P7 Attribute Adding. Esta primitiva agrega atributos a la relación de dimensión. Esto puede ser muy útil para mantener en la misma tupla mas de una versión de un atributo.
· P8 Hierarchy Roll Up. Esta primitiva realiza el “roll up” por un atributo de una relación siguiente la jerarquía. Además esta puede generar otra relación de jerarquía con el nivel de detalle correspondiente.
· P9 Aggregate Generation. Dada una relación de medida, esta primitiva genera otra relación de medida, donde la información es resumida (o agrupada) por un conjunto dado de atributos.
· P10 Data Array Creation. Dada una relación que contiene un atributo de medida y un atributo que representa un conjunto predeterminado de valores, esta primitiva genera una relación con la información estructurada como array.
· P11 Partition by Stability. (*) Estas primitivas particionan una relación, con el objetivo de organizar el almacenamiento histórico de la información. Particiones Horizontales o Verticales pueden ser aplicadas dependiendo del criterio de diseño utilizado.
· P12 Hierarchy Generation. (*) Esta es una familia de primitivas que genera relaciones de jerarquía tomando como entrada relaciones que incluyen una jerarquía o parte de una.
· P13 Minidimension Break off. Esta primitiva elimina un conjunto de atributos de una relación de dimensión, construyendo una nueva relación con ellos.
· P14 New Dimension Crossing. Esta primitiva permite materializar un cruzamiento de dimensiones en una nueva relación.
Tomaremos las mismas definiciones básicas que en [Am2000] sobre conjuntos de relaciones y conjuntos de relaciones, las citaremos en el “Apéndice 1”.
Introduciremos los siguientes conceptos:
· Expresión de Agregación: Esta es una expresión formada por alguno de los operadores de agregación definidos en [ElNa1997] (SUM, COUNT, etc.).
Introduciremos los siguientes dominios:
· Time: Dominio de los valores de tiempo, contiene valores que nos permiten registrar un instante de tiempo, p.e.: “23/4/2001” Î Time.
Tomaremos cada una de las primitivas definidas y haremos una propuesta para la sentencia SQL. Y para las que sea necesario modificar la definición de alguna relación, daremos los cambios necesarios.
· P1 Identity.
Entrada:
Esquema origen: R Î Rel
Procesamiento:
P1 = select * from R
·
P2 Data Filter.
Entrada:
Esquema origen: R(A1, ..., An) Î Rel
Conjunto de atributos a filtrar: X Ì {A1, ..., An}
Pre-procesamiento:
A’ = {A’1, ..., A’m} = {A1,
..., An} - X
Procesamiento:
P2 = select A’1, ..., A’m
from R
· P3 Temporalization.
Entrada:
Esquema origen: R Î Rel
Valor de tiempo: t Î Time
Procesamiento:
P2
= select *, t from R
·
P4 Key Generalization.
· P4.1 Version Digits.
Entrada:
Esquema origen: R(A1, ..., An) Î Rel / A1 Î X Î Attk(R)
Numero de versión: n Î String.
Procesamiento([2]):
P4.1 = select n || A1, ..., An from R
·
P4.2 Key Extension.
Entrada:
Esquema origen: R Î Rel
Procesamiento:
P1 = select * from R
·
P5 Foreign Key Update.
Entrada:
Esquema origen: R(A1, ..., An) Î Rel
Esquema de la clave foránea: T(B1, ..., Bm) Î Rel
Antigua clave foránea: X Í {A1, ..., An}
Nueva clave
foránea: Y Í {B1, ..., Bm}
Esquema de correspondencias: S(C1, ..., Ci) Ï Rel, {C1, ..., Ci} = (X U Y)
Pre-procesamiento:
V = {V1, …, Vj} / V = Y U ({A1, ..., An}
– X)
Procesamiento:
P5 = select V1, …, Vj
from R, S where R.X = S.X
·
P6 DD-Adding.
·
P6.1 DD-Adding 1-1.
Entrada:
Esquema origen: R(A1, ..., An) Î Rel
Función de calculo: f(X) / X Í {A1, ..., An}
Procesamiento:
P6.1 = select *, f(X) from R
·
P6.2 DD-Adding N-1.
Entrada:
Función de calculo: f(X) / X Í ({A1, ..., An} U {A’1, ..., A’n’} U ... U {An1, ..., Annn})
Atributos
de Join: Y Í {A1, ..., An} Ù Y’ Í {A’1,
..., A’n’} Ù … Ù Yn
Í {An1, ...,
Annn}
Procesamiento:
P6.2 = select A1, ..., An,
f(X)
from R, R1, R2, …, Rn
where R.Y = R1.Y’ and R1.Y’ = R2.Y2
and … and R(n-1).Y(n-1)
= Rn.Yn
·
P6.3 DD-Adding N-N.
Entrada:
Expresión de agregación: e(X) / X Î ({A’1, ..., A’n’} U ... U {An1, ..., Annn})
Atributos
de Join: Y Í {A1, ..., An} Ù Y’ Í {A’1,
..., A’n’} Ù … Ù Yn
Í {An1, ...,
Annn}
Atributos
de agregación: Z Í ({A’1, ..., A’n’} U ... U {Am1,
..., Amnn})
Procesamiento:
P6.3 = select A1, ..., An,
e(X)
from R, R1, R2, …, Rn
where R.Y = R1.Y’ and R1.Y’ = R2.Y2
and … and R(n-1).Y(n-1)
= Rn.Yn
group by A1, ..., An, Z
·
P7 Attribute Adding.
Entrada:
Esquema origen: R Î Rel
Valores de los atributos a agregar: {b1, ..., bn}
Procesamiento:
P7 = select *, b1, ..., bn
from R
·
P8 Hierarchy Roll Up.
Entrada:
Esquemas origen:
R1(A1, ..., An)
ÎRelM / $ A Ì {A1, ..., An}
Ù A Ì AttFK(R1, R2)
R2(B1, ..., Bn’)
ÎRelJ / A Ì {B1, ..., Bn’} Ù A Ì AttK(R2)
Atributos de medida: Z = {Z1, …, Zk} = AttM(R1), Z Ì {A1, ..., An}
Agregaciones de los atributos: {e1(Z1), …, ek(Zk)}
Nivel de la jerarquía: B / B Ì {B1, ..., Bn’} Ù B Ì AttD(R2)
Atributos que por su granularidad salen de R1: X / X Ì {A1, ..., An} Ù X Ì (AttD(R1) U AttM(R1))
Atributos que por su granularidad salen de R2: Y / Y Ì {B1, ..., Bn’}
Indica si genera nueva jerarquía: agg_h Î Bolean
Pre-procesamiento:
V= {V1, …, Vm} / V = ((({A1, ..., An} – A) U B) – X) – Z
V’= {V’1, …, V’m’}
/ V’ = {B1, ..., Bn’}
– Y
Procesamiento:
P8 = select V1, …, Vm, e1(Z1), …, ek(Zk)
from R1, R2
where R1.A = R2.A
group by V1, …, Vm
Si se indica agg_h:
P8b = select distinct V’1,
…, V’m’
from R2
·
P9 Aggregate Generation.
Entrada:
Esquemas origen: R(A1, ..., An) ÎRelM
Atributos de medida: Z = {Z1, …, Zk} = AttM(R), Z Ì {A1, ..., An}
Agregaciones de los atributos: {e1(Z1), …, ek(Zk)}
Atributos que salen de R: X / X Ì {A1, ..., An} Ù X Ì (AttD(R) U AttM(R))
Pre-procesamiento:
V = {V1, …, Vm}
/ V = ({A1, ..., An} – X) – Z
Procesamiento:
P9 = select V1, …, Vm,
e1(Z1), …, ek(Zk)
from R
group by V1, …, Vm
·
P10 Data Array Creation.
Entrada:
Esquema origen: R(A1, ..., An)
Atributo de valores predefinidos: A Î {A1, ..., An}
Expresión agregación: e(A)
Pre-procesamiento:
V = {V1, …, Vm} /
V = select distinct A
from R
B = {B1, …, Bp} = AttM(R)
N = { Nij / Nij
= “Vi” || “_” || “Bj”, i=1..m, j=1..p}
K = {K1, …, Kn-1} = {A1,
..., An} – B – {A}
Procesamiento:
T1 = select K1, …, Kn-1,
e(B1) as N11, …, e(Bp) as Np1 from
R where A = V1 group by K1, …, Kn-1
…
Tm = select K1, …, Kn-1,
e(B1) as N1m, …, e(Bp) as Npm from
R where A = Vm group by K1, …, Kn-1
P10 = select K1, …, Kn-1,
N11, …, Npm
from T1, …, Tm
where T1.K=T2.K and…and Tm-1.K=Tm.K
·
P11 Partition by Stability.
·
P11.1 Vertical Partition.
Entrada:
Esquema origen: R Î Rel
Atributos que nunca cambian: Y Ì Att(R)
Atributos que algunas veces cambian: Z Ì Att(R), Z Ç Y = Æ
Atributos que cambian muchas veces: W Ì Att(R), W Ç Y = Æ Ù W Ç Z = Æ
Pre-procesamiento:
Y’ = {Y’1, …, Y’n’} / Y’ = AttK(R)
È Y
Z’ = {Z’1, …, Z’n’} / Z’ = AttK(R)
È Z
W’ = {W’1,
…, W’n’} / W’ = AttK(R) È W
Procesamiento:
P11.1.1 = select Y’1, …,
Y’n’ from R
P11.1.2 = select Z’1, …, Z’n’’
from R
P11.1.3 = select W’1, …, W’n’’’
from R
·
P11.2 Horizontal Partition.
Entrada:
Esquema origen: R Î Rel
Condición
de Historizacion: c(X) / X Ì Att(R)
Procesamiento:
P11.2.1 = select * from R where c(X)
P11.2.2 = select * from R where not(c(X))
·
P12 Hierarchy Generation.
·
P12.1 De-Normalized Hierarchy
Generation.
Entrada:
Esquemas origen: R1, ..., Rn Î Rel
Atributos
de la Jerarquía: J = {J1,
…, Jm}
Clave de la
Jerarquía: k Í {J1, …, Jm}
Pre-procesamiento:
S’ = {S’1, …, S’n’} =
(Att(R1) – J) È k
…
Sn = {S’1, …, S’nn} = (Att(Rn)
– J) È k
si(i+1) = Att(Ri) Ç J Ç Att(Ri+1), i=1..(n-1)
Procesamiento:
P13.0 = select distinct J1, …, Jm
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
P13.1 = select S’1, …, S’n’
from R1, P13.0
where R1.k = P13.0.k
…
P13.n = select S’1, …, S’nn
from Rn, P13.0
where R1.k = P13.0.k
·
P12.2
Snowflake Hierarchy Generation.
Entrada:
Esquemas origen: R1, ..., Rn Î Rel
Conjunto
ordenado de atributos de la Jerarquía: J = {J1, …, Jm}
Clave de la
Jerarquía: k Í {J1, …, Jm}
Pre-procesamiento:
S’ = {S’1, …, S’n’} = (Att(R1) – J) È k
…
Sn = {S’1, …, S’nn} = (Att(Rn) – J) È k
si(i+1) = Att(Ri) Ç J Ç Att(Ri+1), i=1..(n-1)
Procesamiento:
T1 = select distinct J1, …, Jm
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
P13.J1 = select distinct J1, J2
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
…
P13.J(m-1) = select distinct J(m-1),
Jm
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
P13.1 = select S’1, …, S’n’
from R1, T1
where R1.k = T1.k
…
P13.n = select S’1, …, S’nn
from Rn, T1
where R1.k = T1.k
·
P12.3
Free Decomposition – Hierarchy Generation
Entrada:
Esquemas origen: R1, ..., Rn Î Rel
Conjunto
ordenado de atributos de la Jerarquía: J = {J1, …, Jm}
Descomposición
de la Jerarquía: D = {Di / Di
= {Ji1, ..., Jiqi} Ì J, i=1..p}
Clave de la
Jerarquía: k Í {J1, …, Jm}
Pre-procesamiento:
S’ = {S’1, …, S’n’} = (Att(R1) – J) È k
…
Sn = {S’1, …, S’nn} = (Att(Rn) – J) È k
si(i+1) = Att(Ri) Ç J Ç Att(Ri+1), i=1..(n-1)
Procesamiento:
T1 = select distinct J1, …, Jm
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
P13.J1 = select distinct J’1, ..., J’q’
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
…
P13.Jp = select distinct Jp1, ..., Jpqp
from R1, …, Rn
where R1.s12 = R2.s12
and … and R(n-1).s(n-1)n = Rn.s(n-1)n
P13.1 = select S’1, …, S’n’
from R1, T1
where R1.k = T1.k
…
P13.n = select S’1, …, S’nn
from Rn, T1
where R1.k = T1.k
·
P13 Minidimension Break off.
Entrada:
Esquema origen: R Î Rel
Función de clave: f
Atributos de la mini dimensión: X = {X1, ..., Xn} Ì Att(R)
Pre-procesamiento:
{R’1,
..., R’m} = Att(R) - X
Procesamiento:
T1 = select f as
F, * from R
P13.1 = select F,
X1, ..., Xn from T1
P13.2 = select F,
R’1, ..., R’m from T1
·
P14 New Dimension Crossing.
Entrada:
Esquema origen: R1, R2 Î Rel
Atributos de Join: A, A Ì Att(R1), A Ì Att(R2)
Atributos que se excluyen de R1:Y1 Ì Att(R1)
Atributos que se excluyen de R2:Y2 Ì Att(R2)
Pre-procesamiento:
Y’1
= {y’1, ..., y’n} = Att(R1) – Y1
Y’2
= {y’’1, ..., y’’m} = Att(R2) – Y2
Procesamiento:
P14 = select distinct y’1, ..., y’n, y’’1, ..., y’’m from R1, R2 where R1.A = R2.A
Dada la línea de trabajo de tratar de definir completamente las primitivas citadas en el documento, aparece como una posible línea de trabajo atacar el problema de definir formalmente su semántica.
Otro aspecto que resulta interesante estudiar tiene que ver con la completitud de estas primitivas. Obviamente ya es un problema definir completitud, tanto así lo será entonces demostrar que son completas.
También aparece a la luz la existencia de ciertas propiedades entre las primitivas que deberían ser estudiadas, p.e. al existir la identidad existe la propiedad de reflexión: P? . P1 = P? = P1 . P?.
Como conclusión podemos decir ..
Apéndice 1: Conjuntos de Relaciones y Atributos de [Am2000]
Conjuntos de Relaciones(1, [3]):
· Rel Conjunto de todas las relaciones (cualquier tipo de relaciones).
· RelD Conjunto de relaciones de “dimensión”. Estas son relaciones que representan información descriptiva acerca de los sujetos del mundo real.
· RelC Conjunto de relaciones de “cruzamiento”. Estas son relaciones que representan relaciones o combinaciones entre elementos de un grupo de dimensiones. Usualmente, estas contienen atributos que representan medidas para las combinaciones.
· RelM Conjunto de relaciones de “medida”. Estas son las relaciones de cruzamiento que tienen al menos un atributo de medida.
· RelJ Conjunto de relaciones de “jerarquía”. Estas son las relaciones de dimensión que contienen un conjunto de atributos que constituyen una jerarquía. El hecho de que exista una jerarquía entre un conjunto de atributos, solo puede ser determinado tomando en cuenta la semántica de estos.
· RelH Conjunto de relaciones “históricas”. Estas son relaciones que tienen información histórica que se corresponde con información en otra relación. Nosotros definimos la función ¦H : RelH ® Rel , la cual dada una relación histórica, retorna la relación correspondiente actual.
Conjuntos de Atributos([4]):
· [Am2000] Adriana Marotta, Data Warehouse Design and Maintenance through Schema Transformations., Grupo de Concepción de sistemas de información, (http://www.fing.edu.uy/~csi/publicaciones/lista_pub_csi2000.html, marzo 2001)
· [ElNa1997] R. Elmasri, S. B. Navathe, Sistemas de Bases de Datos, Conceptos Fundamentales (Segunda Edición). ISBN: 0-201-65370-2.
[1] La información siguiente simplemente fue traducida para ser extraída del documento. Los asteriscos en la definición denotan que se esta hablando acerca de un grupo de primitivas.
[2] El símbolo “||” hace referencia al operador de concatenación, tal y como se define en [ElNa1997].
[3] En este trabajo igual que en [Am2000] utilizaremos la palabra relación como sinónimo de esquema de relación.
[4] En algunos
conjuntos se registraron cambios dado que se extendió su expresividad.