¿Cómo debo modelo de un campo que puede contener tanto numéricos y de cadena de valores en SQL Server 2005?

StackOverflow https://stackoverflow.com/questions/34398

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una nueva tabla de base de datos necesito para crear...
Lógicamente contiene un ID, un name, y un "value".
Que el valor de campo puede ser numérico o una cadena de caracteres en la naturaleza.

No creo que sólo quiero hacer el campo de un varchar, porque yo también quiero ser capaz de consultar con filtros como WHERE value > 0.5 y tal.

¿Cuál es la mejor forma de modelar este concepto en SQL Server 2005?

EDITAR: No me opongo a la creación de varios campos de aquí (una para los números, uno para los no-números), pero ya que todos son en realidad el mismo concepto, no estaba seguro de que era una gran idea.
Supongo que podría crear campos separados, entonces tiene un punto de vista de que tipo de se funde en una sola lógica de la columna.

Alguna opinión sobre que?

Lo que quiero lograr es bastante simple...generalmente estos datos sólo serán a ciegas muestran en una cuadrícula de tipo vista.
Quiero ser también capaz de filtrar en los valores numéricos en esa red.Esta tabla va a terminar siendo en las decenas de millones de registros, por lo que no quiero para mí la pintura en una esquina con el rendimiento de las consultas.
Que el rendimiento de las consultas es mi principal preocupación.

¿Fue útil?

Solución

El problema con la mezcla de datos puede ser la manera en Sql 2005 tipo de datos de texto.No es natural de la especie.

Si usted tiene un campo de tipo varchar y que debes hacer:

where value > '20.5'

Valores como "5" será en su resultado (como en un personaje basado tipo "5" viene después "20.5")

Vas a estar mejor con columnas separadas para el almacenamiento.

Uso Unen para fundirlas en una sola columna si usted necesita de ellos se unieron en sus resultados:

select [ID], [Name], Coalesce( [value_str], [value_num] )
from [tablename]

Otros consejos

Una buena manera de obtener la consulta de soporte que se desea es tener dos columnas:numvalue que almacena un número y textvalue que almacena caracteres.Que debe ser que aceptan valores null o al menos tener algún defecto que no representa ningún valor.Su aplicación puede entonces decidir qué columna para almacenar su valor y dejar sin valor.

Si desea almacenar numéricos y de cadena de valores en la misma columna, no estoy seguro de que usted puede evitar hacer un montón de modelos y la convierte cuando el uso de esa columna como un filtro de consulta.

dos columnas.

Table: (ValueLable as char(x), Value as numerica(p,s))

Yo no creo que sea posible tener una columna con tanto de tipo varchar y el tipo de int.Usted puede guardar su valor como varchar y convertirlo a int durante su consulta.Pero de esta manera usted puede obtener una excepción si su valor no contiene ningún carácter.¿Qué estás tratando de lograr?

Si usted quiere ser capaz de mantener una cadena de caracteres, creo que usted tiene que hacer que la columna de tipo varchar, o similar.

Una alternativa podría ser la de tener 2 o 3 columnas, en lugar de la columna valor.Tal vez tenemos las tres columnas, value_type (enum entre "número" y "cadena"), number_value, string_value.Entonces se podría reconstruir la consulta

WHERE value_type = 'number' AND number_value > 0.5

No creo que usted va a ser capaz de obtener en torno al uso de tipo VARCHAR o NVARCHAR como su tipo de datos.Con una mezcla de datos como la que describís, tendrás que probar el valor cuando se tire el campo de la base de datos y realizar la correspondiente CAST o CONVERT basado en el tipo de datos.

Supongo que podría crear campos separados, entonces tiene un punto de vista de que tipo de se funde en una sola lógica de la columna.Alguna opinión sobre que?

Depende de la fuente de los datos.Si usted está recibiendo los datos de los usuarios (o algún otro sistema) en algunos de forma libre, la manera y realmente no le importa qué tipo de datos es, entonces, la mejor manera de almacenar es la mayoría de manera genérica (varchar, etc).Si los datos de entrada es más estructurada y la atención acerca de que la estructura, entonces tiene más sentido mantener esa estructura en la base de datos mediante el uso de distintos campos.

Desde el punto de vista de un selecto realmente no importa;usted puede almacenar cualquier manera y leer como el mismo esquema.Una vez dentro de los filtros (como usted menciona) las cosas se ponen un poco más peludo, pero todavía fácilmente factible.Sin embargo, no se menciona si usted necesita para ser capaz de actualizar estos datos y si es así, si usted necesita para hacer cumplir cualquiera de validación de los datos.

A partir de los sonidos de la misma, usted necesita para hacer diferentes tipos de búsquedas basadas en el "tipo" de valor almacenado.Como tal, puede tener sentido para añadir un campo de Tipo, de modo que los filtros se puede limitar rápidamente el tipo de valores que le interesan.Nota, por Tipo me refiero a un orden más lógico, el ámbito de aplicación, Tipo;no es el tipo de datos que se almacenan.

Mi recomendación sería utilizar un solo campo con un Tipo de columna si usted necesita soporte de Actualizaciones o utilizar varios campos (o tablas, si estos son totalmente diferentes conjuntos de datos) si la Selección y filtrado de todo lo que se necesita.

Usted podría considerar el uso de dos columnas, una "cadena" y una "numérico" (cualquiera de las variantes de esos son apropiadas) con la "cadena" de la columna NO NULA y la "numérico" en la columna permitir valores NULL.Cuando se inserta un valor, siempre rellenar la "cadena" de la columna de indpendent del tipo, sin embargo, si el valor es numérico, TAMBIÉN se almacene en el "numérico" de la columna.Ahora se han construido en un indicador como el tipo (si es que "numérico" de la columna se rellena es numérica, si no es una cadena), siempre se puede simplemente tirar el valor para la presentación de la "cadena" de la columna, y puede utilizar el "numérico" valor en los cálculos o para la correcta numérico de clasificación o comparación de como sea necesario.Siempre se puede añadir una tercera columna indica el tipo de valor, pero este enfoque elimina la necesidad de que.Tenga en cuenta que usted podría considerar la posibilidad de mantener el numéricos y de cadena de valores con el uso de un conjunto de INSERTAR y ACTUALIZAR los factores desencadenantes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top