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

Armazenar JSON no banco de dados versus ter uma nova coluna para cada chave

Atualizado em 4 de junho de 2017


Dado que esta pergunta/resposta ganhou alguma popularidade, achei que valia a pena atualizar.

Quando esta questão foi postada originalmente, o MySQL não tinha suporte para tipos de dados JSON e o suporte no PostgreSQL estava em sua infância. Desde a versão 5.7, o MySQL agora suporta um tipo de dados JSON (em um formato de armazenamento binário) e PostgreSQL JSONB amadureceu significativamente. Ambos os produtos fornecem tipos JSON de alto desempenho que podem armazenar documentos arbitrários, incluindo suporte para indexação de chaves específicas do objeto JSON.

No entanto, ainda mantenho minha declaração original de que sua preferência padrão, ao usar um banco de dados relacional, ainda deve ser coluna por valor. Os bancos de dados relacionais ainda são construídos na suposição de que os dados dentro deles serão razoavelmente bem normalizados. O planejador de consulta tem melhores informações de otimização ao examinar as colunas do que ao examinar as chaves em um documento JSON. Chaves estrangeiras podem ser criadas entre colunas (mas não entre chaves em documentos JSON). Importante:se a maioria do seu esquema for volátil o suficiente para justificar o uso de JSON, convém pelo menos considerar se um banco de dados relacional é a escolha certa.

Dito isso, poucos aplicativos são perfeitamente relacionais ou orientados a documentos. A maioria dos aplicativos tem uma mistura de ambos. Aqui estão alguns exemplos em que eu pessoalmente achei o JSON útil em um banco de dados relacional:

  • Ao armazenar endereços de e-mail e números de telefone de um contato, armazená-los como valores em uma matriz JSON é muito mais fácil de gerenciar do que várias tabelas separadas

  • Salvar preferências de usuário de chave/valor arbitrário (onde o valor pode ser booleano, textual ou numérico, e você não deseja ter colunas separadas para diferentes tipos de dados)

  • Armazenar dados de configuração que não possuem esquema definido (se você estiver criando Zapier ou IFTTT e precisar armazenar dados de configuração para cada integração)

Tenho certeza de que existem outros também, mas estes são apenas alguns exemplos rápidos.

Resposta Original


Se você realmente quiser adicionar quantos campos quiser sem limitação (além de um limite de tamanho de documento arbitrário), considere uma solução NoSQL como o MongoDB.

Para bancos de dados relacionais:use uma coluna por valor. Colocar um blob JSON em uma coluna torna praticamente impossível a consulta (e dolorosamente lento quando você realmente encontra uma consulta que funciona).

Os bancos de dados relacionais aproveitam os tipos de dados ao indexar e devem ser implementados com um normalizado estrutura.

Como uma observação lateral:isso não quer dizer que você nunca deve armazenar JSON em um banco de dados relacional. Se você estiver adicionando metadados verdadeiros ou se seu JSON estiver descrevendo informações que não precisam ser consultadas e é usado apenas para exibição, pode ser um exagero criar uma coluna separada para todos os pontos de dados.