sql >> Base de Datos >  >> RDS >> Mysql

Almacenar JSON en la base de datos frente a tener una nueva columna para cada clave

Actualizado el 4 de junio de 2017

Dado que esta pregunta/respuesta ha ganado cierta popularidad, pensé que valía la pena actualizarla.

Cuando se publicó originalmente esta pregunta, MySQL no tenía soporte para los tipos de datos JSON y el soporte en PostgreSQL estaba en sus inicios. Desde 5.7, MySQL ahora admite un tipo de datos JSON (en un formato de almacenamiento binario) y PostgreSQL JSONB ha madurado significativamente. Ambos productos proporcionan tipos JSON de alto rendimiento que pueden almacenar documentos arbitrarios, incluida la compatibilidad con la indexación de claves específicas del objeto JSON.

Sin embargo, sigo manteniendo mi declaración original de que su preferencia predeterminada, al usar una base de datos relacional, aún debe ser columna por valor. Las bases de datos relacionales todavía se crean asumiendo que los datos dentro de ellas estarán bastante bien normalizados. El planificador de consultas tiene mejor información de optimización cuando mira columnas que cuando mira claves en un documento JSON. Las claves externas se pueden crear entre columnas (pero no entre claves en documentos JSON). Importante:si la mayoría de su esquema es lo suficientemente volátil como para justificar el uso de JSON, al menos debería considerar si una base de datos relacional es la opción correcta.

Dicho esto, pocas aplicaciones son perfectamente relacionales u orientadas a documentos. La mayoría de las aplicaciones tienen una combinación de ambos. Aquí hay algunos ejemplos en los que personalmente encontré JSON útil en una base de datos relacional:

  • Al almacenar direcciones de correo electrónico y números de teléfono para un contacto, almacenarlos como valores en una matriz JSON es mucho más fácil de administrar que varias tablas separadas

  • Guardar preferencias de usuario arbitrarias de clave/valor (donde el valor puede ser booleano, textual o numérico, y no desea tener columnas separadas para diferentes tipos de datos)

  • Almacenamiento de datos de configuración que no tienen un esquema definido (si está creando Zapier o IFTTT y necesita almacenar datos de configuración para cada integración)

Estoy seguro de que también hay otros, pero estos son solo algunos ejemplos rápidos.

Respuesta original

Si realmente desea poder agregar tantos campos como desee sin limitación (aparte de un límite de tamaño de documento arbitrario), considere una solución NoSQL como MongoDB.

Para bases de datos relacionales:use una columna por valor. Poner un blob JSON en una columna hace que sea prácticamente imposible consultar (y muy lento cuando realmente encuentra una consulta que funciona).

Las bases de datos relacionales aprovechan los tipos de datos al indexar y están diseñadas para implementarse con un normalizado estructura.

Como nota al margen:esto no quiere decir que nunca deba almacenar JSON en una base de datos relacional. Si está agregando metadatos verdaderos, o si su JSON describe información que no necesita ser consultada y solo se usa para mostrar, puede ser exagerado crear una columna separada para todos los puntos de datos.