Propuesta de DW para XML

Hola buenas,

 

tengo que buscar una solución para poder almacenar la información de los documentos XML que se corresponden con un esquema determinado sobre la temática de las ventas.

 

El gráfico del XML Schema es éste:

 

http://img404.imageshack.us/i/xmlschema.jpg/

 

Como explicación, mencionar que en el esquema hay 3 elementos que parten del raíz (Starpackage), que son FACTS, DIMENSIONS y BASES.

 

- Dentro de FACTS únicamente está Ventas (con atributo ID de tipo ID) y que contiene, además de un subelemento Unidades_Vendidas, 4 referencias de tipo IDREF a cada una de las dimensiones.

 

- Dentro de BASES, existen 4 subelementos que representan las tablas base de cada dimensión, cada una con un atributo ID de tipo ID. Cada uno de estos elementos contendrán en su interior un subelemento de tipo IDREF como referencia a la dimensión correspondiente.

 

- Dentro de DIMENSIONS, estarán las 4 dimensiones (Dependiente, Producto, Fecha y Lugar), cada una de su tipo complejo correspondiente que fue creado previamente. Además cada una de ellas tendrá un atributo ID de tipo ID.

 

Entonces, he diseñado una posible solución, de momento he hecho sólo la parte para las fechas, por si estuviese mal, pero tengo una duda, en realidad,lo que interesa que se quede almacenado en el DW son los datos del documento XML, no toda su estructura, por lo que ahora creo que está mal.

 

La solución propuesta es la siguiente:

 

http://img255.imageshack.us/i/psmxmlfechas.jpg/

 

Y lo que a mi no me convence mucho tal cual está ahora mismo es que, no sé si sería necesario almacenar la estructura del documento, es decir, no sé si habría que poner en el esquema de almacenamiento del DW que debe contener un elemento raíz llamado "Starpackage", después 3 subelementos "Facts", "Dimensions" y "Bases" etc.

 

Puesto que la comprobación de si el documento que se va a insertar cumple con la estructura fijada por el XML Schema (tiene todos los elementos requeridos y en el orden indicado) se debería hacer en la fase de "Extracción" o "Transformación", pero no en carga no? Y en el DW sólo deberían quedar almacenados los datos.

 

No sé si me habré explicado con claridad, espero que se entienda. Si alguien me puede dar su opinión se lo agradecería.

 

Muchas gracias.

 

 En el diseño que adjuntas has pasado una estructura de XML a un modelo relacional, que podría ser uno de los primeros pasos del proceso de ETL hacia un estructura de Data Warehouse.

En mi opinión puedes pasarlo a tablas o, si la misma definición del documento XML ya te garantiza una estructura válida, liberarte ya de arrastrar la estructura de un XML.

Pero lo que está claro es que aún te queda alguna etapa más de el proceso de ETL para que el modelo tenga una estructura de DWH, has de eliminar todo lo que sea específico de la estructura del fichero, y después desnormalizar y llegar a obtener una estructura de estrella o copo de nieve, según el modelo de diseño que sigas.

Adjunto las imágenes de tus diseños, para que se vea cómo va quedando, ahora sólo falta irlo completando hasta llegar al diseño final ;)

 

1. Estructura del fichero XML

Modelo del XML de Ventas


2. Estructura del modelo relacional de volcado del fichero XML

Modelo relacional del XML de Ventas

En respuesta a por Carlos

Gracias Carlos,

 

bueno, en primer lugar, sobre lo que dices de que me falta un paso más hasta llegar a un diseño final propio de DWh, estoy de acuerdo, pero la historia es que veo que, si hago eso al final me va a quedar un esquema igual al tradicional de ventas sencillote en estrella, es decir, algo así:

Modelo en estrella a partir de un XML

 

¿Crees que si quiero diseñar un DW para almacenar documentos XML debo tener esta estructura (u otra parecida) en mi almacén? Posiblemente sí, pero no estoy seguro...

 

Por cierto, eso que dices tú de "pasarlo a tablas" no sé a qué te refieres, ¿a algo como lo que aparece en la imagen?

 

Otra cosilla, no he usado mucho OWB, pero siempre que he querido importar datos he hecho el proceso de:

Archivo + Nuevo + Selección del fichero excel .csv + Seguir con las acciones de importación...

 

Y en estos ficheros venían los datos separados por comas simplemente.

Bien, pero ahora lo que no veo es, cómo habría que importar ficheros .xml y, una vez importados, cómo extraer el valor de cada campo. Ese primer paso no lo veo, no sé cómo se podría hacer en OWB.

Si me pudieses comentar cómo se te ocurre que se podría hacer te lo agradecería.

 

 

 

En respuesta a por EmilinDaSilva

Si quieres tener un Data Warehouse, el modelo tradicional de ventas que muestras es el indicado. Una estructura de XML no pinta nada en un DWH, es sólo un origen de datos, pero nunca un destino.

Si tu objetivo es almacenar documentos XML entonces no quieres un DWH, el Data Warehouse es para analizar datos, y la estructura indicada para ello es la estrella que adjuntas, complicar este modelo no te aportaría nada y las herramientas de análisis no te funcionarían bien.

Esto no quiere decir que no se pueda almacenar la estructura del XML en un paso previo si crees que ello te aporta algún beneficio, es a lo que me refería con lo de pasarlo a tablas.

 

Para recoger datos a partir de un XML con OWB tienes varias opciones.

Te comento, por si lo desconoces, que Oracle soporta el almacenamiento y tratamiento de documentos XML. Se puede cargar un XML directamente en una tabla de tipo XMLType, y después puedes lanzar sentencias de SQL sobre esta tabla para trabajar directamente sobre el contenido.

Te enlazo el artículo de Oracle Administrar Datos XML Complejos en Oracle XML DB 11g, que explica muy bien cómo funciona este sistema.

  • Si además tienes una versión de OWB a partir de la 11.2 puedes utilizar directamente el tipo de dato XMLTYPE en los flujos de procesos, ya que lo acaban de incorporar en esta versión. Yo no he llegado a probarlo, pero te enlazo el post Complex type support in process flow - XMLTYPE, donde explican cómo utilizarlo.
  • Si no tienes esta versión, o quieres independizarte del formato XML, una aproximación más clásica sería utilizar el procedimiento almacenado WB_XML_LOAD para volcar el contenido del XML en tablas relacionales. Busca en la documentación de OWB más detalles sobre la sintaxis del procedure, en la versión 9i ya explicaban cómo utilizarlo.
  • Por último, otra opción que tienes es crearte, por ejemplo, un procedimiento almacenado que utilice el mismo procedure WB_XML_LOAD para cargar directamente el XML en una tabla de tipo XMLType. Después puedes atacar esta tabla son SQL para recuperar los datos y crear una vista 'relacional', por ejemplo. En el post Designing an XML View in OWB explican cómo hacer esto último.

Bueno, espero haberte sido de ayuda, cuéntanos después cómo van las pruebas, si vas a llegar a la estructura de DWH o te vas a quedar en la relacional, y qué método utilizas finalmente para recoger los datos del fichero XML.