2011-07-13 22 views
7

Quiero almacenar un xml que recibo en mi servicio web Java. Los informes se ejecutarán cada 5 minutos para extraer algunos datos en los elementos xml.Almacenamiento de datos XML en la base de datos: muchas tablas frente a volcar xml en una columna

Pensé en dos enfoques para resolver este problema.

  1. Cree varias tablas en la base de datos para capturar los datos xml. Básicamente, cada elemento tendrá su propia columna en la base de datos.

  2. Vuelca todo el xml en una columna que puede almacenar datos xml. Para fines de informes analizar el valor en la consulta en sí.

¿Cuál de los enfoques anteriores es mejor, particularmente en términos de rendimiento? Esto es crítico ya que los informes se generarán en una frecuencia muy alta (cada 5 minutos).

El esquema xml es bastante complicado y no es simple.

Respuesta

8

Si los datos se escribirán una vez y se consultarán muchas veces, es casi seguro que será más eficiente analizar el documento XML una vez, almacenar los datos en un esquema relacional adecuado y consultar el esquema relacional. El análisis de XML no es barato, por lo que la sobrecarga de analizar potencialmente documentos XML múltiples cada 5 minutos podría ser sustancial.

Por supuesto, al igual que todas las preguntas de rendimiento, su kilometraje puede variar por lo que puede valer la pena probarlo. Si está utilizando Oracle 11.2 y almacena los datos como XML binario (en cuyo caso se almacena después de ser analizado) y crea los XMLIndexes apropiados en los XMLTypes que está almacenando, la penalización del rendimiento por dejar los datos en el documento XML puede ser bastante pequeño. Todavía debería ser más lento que una estructura relacional adecuada, pero la diferencia puede no ser significativa para usted.

Personalmente, prefiero el enfoque de almacenamiento relacional en general, incluso ignorando los problemas de rendimiento, ya que hace que sea más fácil para otros interactuar con los datos.Hay muchos más desarrolladores que pueden escribir SQL decente que escribir expresiones XPath decentes y hay muchas más herramientas de consulta que pueden generar informes de tablas relacionales que pueden generar informes fuera de XML almacenados en una base de datos.

4

Adhoc acceso

Si necesita ejecutar consultas eficiente de los datos contenidos en el archivo XML en un ad-hoc o de manera arbitraria se debe analizar a cabo en Tables y Columns que puede ser lógicamente índice y se unió al.

acceso limitado

Si se acaba de almacenar los datos, y la entrega basada en otros criterios, tales como un identificador único o de otra tecla, y el XML es esencialmente una opaca BLOB luego simplemente almacenarlo en una columna BLOB y listo.

híbrido Modelo

Lo que probablemente va a necesitar es algo intermedio, en el que el XML se almacena en un BLOB y sólo bits correspondientes se almacenan en Tables y Columns para que pueda buscar la carga XML de manera efectiva.

+0

Modelo híbrido: ¿Te refieres a elementos de la tienda consultados con frecuencia en las tablas y almacena el xml como blob? Si es necesario, se pueden consultar otros elementos desde el xml. – Maximus

5

Maximus, Realmente depende de lo que quieras hacer con los datos XML.

Cuando uso XML para fines de control, como configurar cómo se muestra una página, almacenaré todo el XML en un solo campo BLOB. Es rápido y extremadamente simple. Es una rutina sencilla de guardar y cargar. Puede ver fácilmente el XML en el campo BLOB y editarlo.

Si necesita buscar o informar sobre valores dentro del XML, como cuántos clientes tienen un atributo específico, es probable que desee analizar atributos individuales. Esto generalmente significa que tendrá que hacer algunos procesos previos y posteriores, pero le permite acceder rápidamente a los atributos individuales.

1

Sin saber un poco más, es difícil decirlo con certeza, pero lo más probable es que te falte una parte importante que puede simplificar mucho la vida.

  1. de enlace de XML a POJOs (JAXB, moxy o JiBX)
  2. tienda como columnas normalizadas de POJO (utilizar jDBI, Hibernate, o incluso plantillas JDBC simples)

También, dependiendo de exactamente qué tipo de informes produce, tal vez considere la posibilidad de guardar los datos en la memoria; cada 5 minutos no parece ser crítico para el rendimiento, pero de todos modos la persistencia no siempre es necesaria (o solo es para datos históricos o copias de seguridad).

1

Si necesita guardar y consultar más de un par de documentos XML que debe utilizar una base de datos XML ..

eXist es agradable, mantener esas XMLs en una columna o disagrete en muchas mesas es una mala opción Creo ..

0

también podría retirar el tipo de columna XMLData que está en SQLserver de tipo XML o en Oracle http://msdn.microsoft.com/en-us/library/hh403385.aspx

se puede crear columnas calculadas en su columna de datos XML para los campos XML que se consultan la la mayoría que ayudaría en el ayuno er recuperaciones. Para recuperar un determinado valor en un determinado xpath, solo tiene que pasar el xpath a sqlserver para que le devuelva el valor en ese xpath.

Cuestiones relacionadas