Cuándo usar el tipo de datos XML


12

Soy responsable de crear una base de datos en un proyecto. Tenemos campos que rara vez tendrán un valor (1 de cada 10,000 registros) y estoy tratando de encontrar la mejor manera de almacenar esto en la base de datos.

Por lo que puedo ver, tengo 3 opciones:

  1. Agregue una columna en la tabla para cada valor adicional
  2. Agregue una tabla vinculada que haga referencia a la tabla original y tenga registros solo donde necesitemos almacenar un valor
  3. Utilice el tipo de datos XML en la tabla original y almacene todos los valores en este.

¿Hay alguna otra opción que no haya considerado?

Estoy tratando de resolver los pros y los contras de cada método. Hasta donde puedo decir, 1 sería el más fácil y 2 ocuparía la menor cantidad de espacio, pero estoy luchando por encontrar muchos recursos para 3.


1
Para agregar una queja personal contra el abuso de xml en una base de datos, respondería directamente a la pregunta en el título y diría: ¡NUNCA! Para el cuerpo real de la pregunta, dejaré que los colegas lo ayuden, porque ya tiene muy buenas respuestas :-). PD: puedes ignorar mi primera oración.
Marian

¿De cuántos campos adicionales estás hablando? ¿Y tienen sentido ser parte de la misma entidad?
Andrew Bickerton

Respuestas:


12

Parece que lo que necesita son columnas dispersas e índices filtrados y vaya con la opción 1. Estas son funciones totalmente compatibles y documentadas para exactamente este escenario.

El Motor de base de datos de SQL Server usa la palabra clave SPARSE en una definición de columna para optimizar el almacenamiento de valores en esa columna. Por lo tanto, cuando el valor de la columna es NULL para cualquier fila de la tabla, el valor no requiere almacenamiento.

No puedo imaginar una solución XML que funcione bien en este escenario, tendrá una gran sobrecarga de metadatos redundantes y será lenta para consultar.


1
Creo que las columnas dispersas son lo que busco. Espero que se almacene una cantidad muy pequeña de datos en probablemente un puñado de columnas en ciertas tablas.
Matthew Steeples

No estoy seguro si estoy leyendo esto correctamente, pero de acuerdo con este enlace, las columnas dispersas son básicamente una implementación de la base de datos de lo que estaba buscando para 3 de todos modos, ¿no es así? blog.sqlauthority.com/2008/07/14/…
Matthew Steeples

Si se implementa internamente de esa manera (y no sé si es así, es solo el blog de alguien), entonces nunca tendrá que lidiar o analizar el XML usted mismo; se comportará exactamente como una tabla normal (con restricciones) en tipos de datos)
Gaius el

5
  1. Una columna anulable no ocupa espacio si la longitud variable en SQL Server. El hecho de ser NULL se almacena en el mapa de bits NULL . Puede indexarlo si es necesario con índices filtrados para que ignore las columnas NULL.

  2. Agrega complejidad cuando considera el punto 1.

  3. No lo hagas Difícil de buscar, de análisis, etc: se va a arrepentir de esto más adelante

También depende del tamaño: ¿será char (1000) durante algunos miles de millones de filas? O tinyint para 100k filas? Si este último considera la complejidad añadida del punto 2: no vale la pena.


¿Tiene una referencia de que una columna anulable que es nula no ocupa espacio? Sabía que si era nulo o no estaba almacenado en el mapa de bits nulo, pero pensé que para los campos de longitud fija los datos todavía estaban almacenados en la tabla. El tipo de datos que usaré para la mayoría de estos valores es dinero (por lo tanto, 8 bytes)
Matthew Steeples

1
@ Matthew Steeples: Dije que la longitud variable ya no ocupa espacio. Y para referencia sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx#p41 ¿Cómo pueden las filas para estos 8 bytes?
gbn

En este momento estamos en 500,000 filas, pero vamos a expandirnos (con suerte) a un ritmo de aproximadamente 1 millón por día de la semana una vez que estemos en vivo.
Matthew Steeples

3

Con SQL Server 2008 tiene la opción adicional de usar columnas dispersas, que están diseñadas específicamente para la situación que mencionó.

Tienen el beneficio adicional de que puede verlos como un objeto XML combinado usando XML COLUMN_SET o hacer referencia a ellos individualmente y proporcionan un tremendo ahorro de espacio.

Consulte el siguiente artículo del blog para obtener más detalles: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx


-4

Una cuarta opción: no usar tablas. Las tablas se adaptan muy mal a este tipo de datos (de hecho, a cualquier tipo de datos que no se hayan ajustado a la fuerza en forma de tabla). Solo usa XML.


3
-1 ya que si bien es cierto que "no usar tablas" es una opción , la respuesta indica claramente una queja contra las estructuras de la tabla y en realidad no presenta una respuesta útil.
Andrew Bickerton
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.