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

¿Hay alguna forma de usar objetos json en SQL?

JSON como intención

No hay forma de trabajar con JSON en MySQL. Algunos DBMS pueden admitir JSON, pero eso está fuera de discusión y, además, cualquier tipo de "soporte" solo se trata de realizar algunas operaciones específicas de JSON, pero no de modelar su arquitectura (y esas dos cosas son completamente diferentes) Más , en sentido completo, el concepto de modelo (es decir, las relaciones) para MySQL es diferente de lo que es JSON:como DBMS relacional, sigue modelo de datos relacionales y JSON es un formato completamente diferente. Lo almacenará como un valor de cadena simple, por lo tanto, es imposible hacer nada con él de otra manera, si no usa funciones de cadena. Entonces, incluso trabajando con JSON, no lo hará dentro del modelo relacional, por lo tanto, no será posible mantener características relacionales, como la integridad referencial, por ejemplo.

Opciones para resolver

Tienes varias opciones:

  • Migrar a Postgree SQL ya que tiene soporte extendido para json, desde la versión 9.4 es jsonb y es aún más rápido. Esta podría ser la mejor opción ya que es RDBMS y, por lo tanto, la migración no será tan difícil como para DBMS verdaderamente orientado a documentos.
  • O migre a Mongo ahora (si esa es su intención), antes de que sea demasiado tarde. Tenga en cuenta que Mongo es algo completamente diferente a RDBMS, está orientado a documentos. Supongo que esta es la mejor opción tanto para tu proyecto como para tu cliente (y tu tarea sería explicar eso)
  • Cambie toda la arquitectura para que no almacene objetos JSON y trabaje con entidades normalizadas (en términos de base de datos de relaciones). Esto significa:sí, la refactorización completa de todo el código, el cambio de todas las relaciones, etc. En una situación real, es solo una opción teórica, no se le dará ni tiempo ni dinero para eso.
  • Implemente su propia biblioteca JSON para MySQL. ¿Es difícil? Depende de lo que haga con su JSON, pero JSON es un formato público, por lo que sabrás qué hacer, al menos. Puede hacerlo como UDF o en la tierra del usuario (así que con CREATE FUNCTION declaración). Esto requerirá habilidades específicas y tiempo, por supuesto. Lo malo:bichos. Incluso si puede crear esas funciones más rápido que reestructurar su arquitectura o migrar a Mongo, nunca estará seguro de la calidad de esas funciones. No hay forma de probar ese código de forma nativa. Sin embargo, puedo dar una pista para el caso de las funciones de la tierra del usuario:puede usar mysql-unit para probar su código almacenado, si su MySQL es 5.6 o superior (bueno, he escrito esta herramienta, pero... también puede contener errores)

Funciones "estándar"

Finalmente, si está ejecutando MySQL 5.7, entonces puede haber un rayo de esperanza con las funciones JSON previas al lanzamiento - Entonces, puedes intentar para usar la versión alfa de la funcionalidad JSON, que actualmente existe para MySQL 5.7. Pero no recomendaría (fuertemente) usar eso en un proyecto real ya que esas funciones no están bien probadas ni completas en absoluto. Pero, para instalar esas funciones, deberá descargar el paquete correspondiente y luego conectarlo a su servidor, como:

CREATE FUNCTION json_append       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_valid        RETURNS integer SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_extract      RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_replace      RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_remove       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_set          RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_merge        RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_search       RETURNS string  SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_contains_key RETURNS integer SONAME 'libmy_json_udf.so';

Y después de eso podrás probarlos.