2012-02-09 1042 views
98

¿Cuál es el mejor tipo de datos SQL para almacenar cadenas JSON?¿Cuál es el mejor tipo de datos SQL para almacenar cadenas JSON?

static List<ProductModel> CreateProductList() 
{ 
    string json = @"[ 
     { 
      ProductId: 1, 
      ProductCode: 'A', 
      Product: 'A' 
     }, 
     { 
      ProductId: 2, 
      ProductCode: 'B', 
      Product: 'B' 
     } 
    ]"; 

    IList<JToken> tokenList = JToken.Parse(json).ToList(); 
    List<ProductModel> productList = new List<ProductModel>(); 

    foreach (JToken token in tokenList) 
    { 
     productList.Add(JsonConvert.DeserializeObject<ProductModel>(token.ToString())); 
    } 

    return productList; 
} 

¿Qué tipo de datos SQL debemos usar para almacenar una cadena que contenga JSON?

  • NVARCHAR(255)?
  • TEXT?
  • VARBINARY(MAX)?
+1

Solo un poco de ruido al azar (el comentario, no los datos): Es posible que desee comprimirlo también. En ese caso necesitas algo binario. Por otro lado, ¿por qué no diseñar tablas adecuadas para los datos? –

+3

@El clavo: a veces, almacenar algo como JSON (o como un "documento") es adecuado para la necesidad. Al igual que para un motor de flujo de trabajo o gestión de documentos, etc ... Estoy haciendo esto en un proyecto actual, pasando realmente de enfoque relacional a documento por el lado del comando de mi implementación CQRS. Es muy rápido si usa un serializador como ServiceStack o JSON.Net. – swannee

Respuesta

23

voy a ir a por nvarchar(max). Eso debería ajustarse al requisito.

Actualización: Con SQL Server 2016 y Azure SQL, hay muchas capacidades JSON nativas adicionales. Esto podría tener un impacto positivo en su diseño o enfoque. Usted puede leer esto para más: https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

+7

¿Realmente ** necesita el almacenamiento Unicode de 2 bytes? Dependiendo de sus datos, podría estar desperdiciando el doble de bytes que los necesarios ... (pero si ** HACE ** necesita Unicode, entonces ese es el único camino a seguir, ¡estoy de acuerdo!) –

+5

nvarchar - porque los datos son no definida. Si creemos que el sistema no necesita unicode, podemos ahorrar el movimiento a varchar (max) – Kangkan

+3

Además, usar 'nvarchar' evita los problemas de intercalación que eventualmente tendrá al usar' varchar', pero será más lento en el rendimiento de la consulta que 'varchar'. [Gran pregunta de DBA] (http://dba.stackexchange.com/questions/5346/why-is-there-still-a-varchar-data-type) con más información. –

160

Ciertamente NO:

  • TEXT, NTEXT: esos tipos son obsoleta partir de SQL Server 2005 y no se debe utilizar para un nuevo desarrollo. Utilice VARCHAR(MAX) o NVARCHAR(MAX) lugar

  • IMAGE, VARBINARY(MAX): IMAGE es obsoleto igual TEXT/NTEXT, y no hay realmente ningún punto en el almacenamiento de una cadena de texto en una columna binaria ....

de manera que básicamente hojas VARCHAR(x) o NVARCHAR(x): VARCHAR almacena cadenas no Unicode (1 byte por carácter) y NVARCHAR almacena todo en un modo Unicode de 2 bytes por carácter. Entonces, ¿necesitas Unicode? ¿Tiene caracteres arábigos, hebreos, chinos u otros caracteres no occidentales europeos en sus cadenas, potencialmente? Luego vas con NVARCHAR

Los (N)VARCHAR columnas son de dos tipos: o bien se define una longitud máxima que se traduce en 8000 bytes o menos (VARCHAR hasta 8000 caracteres, NVARCHAR hasta 4000), o si eso no es suficiente, utiliza el (N)VARCHAR(MAX) versiones, que almacenan hasta 2 GByte de datos.

Actualización: SQL Server tendrá el apoyo JSON nativo - un nuevo JSON tipo de datos (que se basa en nvarchar) será presentado, así como un comando FOR JSON para convertir la salida de una consulta en formato JSON

actualización # 2: en el producto final, Microsoft no incluyó una separada JSON tipo de datos - en su lugar, hay una serie de JSON-funciones (a empaquetar filas base de datos en JSON, o para analizar JSON en datos relacionales) que operan en columnas del tipo NVARCHAR(n)

+16

NVARCHAR debería ser la opción preferida ya que sql server 2016 lo usará para su compatibilidad nativa con JSON http: //blogs.msdn .com/b/jocapc/archive/2015/05/16/json-support-in-sql-server-2016.aspx – Loudenvier

+0

@Loudenvier: gracias por la entrada! –

+0

@marc_s ¿Es correcta su declaración de "actualización"? No puedo encontrar ningún tipo de datos JSON oficiales ...? – Nix

0

Recomendaría utilizar nvarchar(max) si planea usar las funciones JSON en SQL 2016 o Azure SQL.

Si no tiene previsto utilizar esas funciones, puede usar varbinary(max) combinado con las funciones COMPRESS (y DECOMPRESS). Más información: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

Las funciones COMPRESS y DECOMPRESS utilizan compresión GZip estándar. Si su cliente puede manejar la compresión GZip (por ejemplo, un navegador que entiende el contenido gzip), puede devolver directamente el contenido comprimido. Tenga en cuenta que esta es la compensación de rendimiento/almacenamiento. Si consulta con frecuencia datos comprimidos, mig tendrá un rendimiento más lento porque el texto se debe descomprimir cada vez.

Cuestiones relacionadas