Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe alguma maneira de usar objetos json no SQL


JSON como intenção

Não há como trabalhar com JSON no MySQL. Alguns DBMS podem suportar JSON, mas isso está fora de questão e, além disso, qualquer tipo de "suporte" é apenas para realizar algumas operações específicas de JSON, mas não para modelar sua arquitetura (e essas duas coisas são completamente diferentes). , no sentido pleno, o conceito de modelo (ou seja, relações) para MySQL é diferente de JSON:como um DBMS relacional, segue modelo de dados relacional , e JSON é um formato completamente diferente. Você irá armazená-lo como um valor de string simples, portanto, impossível fazer qualquer coisa com ele de outra maneira, se não usar funções de string. Então mesmo trabalhando com JSON você fará isso fora do modelo relacional, portanto, não será possível manter recursos relacionais, como integridade referencial, por exemplo.

Opções para resolver

Você tem várias opções:
  • Migre para Postgree SQL, pois estendeu o suporte para json, desde a versão 9.4 é jsonb e é ainda mais rápido. Esta pode ser a melhor opção, pois é RDBMS e, portanto, a migração não será tão difícil como para um DBMS verdadeiramente orientado a documentos.
  • Ou migre para o Mongo agora (se essa for sua intenção), antes que seja tarde demais. Leve em conta que o Mongo é uma coisa completamente diferente do RDBMS, é orientado a documentos. Acho que esta é a melhor opção tanto para o seu projeto quanto para o seu cliente (e sua tarefa seria explicar isso)
  • Mude toda a arquitetura para que você não armazene objetos JSON e trabalhe com entidades normalizadas (em termos de banco de dados de relação). Isso significa - sim, refatoração completa de todo o código, alteração de todas as relações etc. Na situação real, é apenas uma opção teórica, você não terá tempo nem dinheiro para isso.
  • Implemente sua própria biblioteca JSON para MySQL. É difícil? Depende do que você fará com seu JSON, mas JSON é formato público, então você saberá o que fazer, pelo menos. Você pode fazer isso como UDF ou na área do usuário (assim com CREATE FUNCTION declaração). Isso exigirá habilidades específicas e tempo, é claro. As coisas ruins:insetos. Mesmo que você consiga criar essas funções mais rapidamente do que reestruturar sua arquitetura ou migrar para o Mongo, você nunca terá certeza da qualidade dessas funções. Não há como testar esse código nativamente. No entanto, posso dar dicas para o caso de funções de usuário - você pode usar mysql-unit para testar seu código armazenado, se seu MySQL for 5.6 ou superior (bem, eu escrevi essa ferramenta, mas... ela também pode conter bugs)

Funções "padrão"

Finalmente, se você estiver executando o MySQL 5.7, pode haver um raio de esperança com as funções JSON de pré-lançamento a> - então, você pode tentar para usar a versão alfa da funcionalidade JSON, que existe atualmente para o MySQL 5.7. Mas eu não recomendaria (fortemente) usar isso em um projeto real, pois essas funções não são bem testadas nem completas. Mas, para instalar essas funções, você precisará baixar o pacote correspondente e conectá-los ao seu 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';

E depois disso você poderá experimentá-los.