MySQL + JSON da casamento sim!

167 visualizações

Publicada em

Conheça um pouco sobre esse novo e aguardado recurso do MySQL 5.7, o DATA TYPE JSON.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
167
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
4
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

MySQL + JSON da casamento sim!

  1. 1. MYSQL + JSON DA CASAMENTO SIM! UTILIZANDO O DATA TYPE JSON NO MYSQL 5.7 Esse artigo está publicado em: http://performancedb.com.br/blog/archives/176
  2. 2. Hoje vamos falar um pouco sobre um assunto muito desejado e esperado, tanto por desenvolvedores quanto por DBAs. O MySQL suporta armazenar documentos JSON???? A resposta é um grande e sonoro SIM!!! Na versão 5.7.8 foi adicionado o data type JSON e com ele você pode armazenar e manipular documentos JSON. Isso significa que posso fazer no MySQL tudo que faço no MongoDB? Não, pelo menos por enquanto não. Eu ainda não vejo dessa forma, na maturidade atual do recurso ele já pode ajudar muito a suprir algumas necessidades em armazenar e manipular documentos JSON, mas não temos(ainda!?) uma engine completa e altamente robusta para isso! Vamos ver alguns exemplos de como armazenar, buscar e manipular documentos JSON. Em um próximo POST vou falar sobre performance e melhores práticas. Para esse exemplo estou utilizando o MySQL 5.7.11 que foi instalado no Ubuntu 15.10. Veja como fazer instalação do MySQL 5.7 em alguns ambientes que não sejam derivados do RedHat e do Debian. FreeBSD SlackWare Criando uma tabela e uma coluna com o data type JSON CREATE TABLE pessoas ( id INT AUTO_INCREMENT PRIMARY KEY , pessoa JSON ) ENGINE = InnoDB; Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  3. 3. Mas Diego, por que utilizar o data type JSON se podemos utilizar o TEXT ou o BLOB? A resposta é simples, utilizando o data type JSON você ganha algumas ferramentas valiosas, como uma validação dos documentos, ou seja, nada de gravar documentos incompletos ou com erro de sintaxe, ganha opção de realizar busca e manipulação dos documentos sem o uso de REGEXP, o que vai facilitar muito a sua vida, sem contar com os recursos de performance(que vou falar em outro post). Inserindo os dados INSERT INTO pessoas (pessoa) VALUES ('{"nome": "Fulano", "sexo": "M", "dtNascimento": "1990-01-01", "cidade": "Curitiba", "uf": "PR"}'); Mas também podemos inserir um array de objetos. INSERT INTO pessoas (pessoa) VALUES('[{"nome": "Fulano"}, {"nome": "Beltrano"}, {"nome": "Ciclano"}]'); Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  4. 4. O MySQL vai tratar como types diferentes. Para os próximo exemplos vou alterar os dados da tabela pessoas. TRUNCATE TABLE pessoas; INSERT INTO pessoas (pessoa) VALUES('{"nome": "Fulano", "sexo":"m", "idade":18, "localizacao":{"cidade":"Curitiba", "UF":"PR"} , "areas_interesse": ["A", "B", "c"]}'); INSERT INTO pessoas (pessoa) VALUES('{"nome": "Beltrana", "sexo":"f", "idade":19, "localizacao":{"cidade":"Florianópolos", "UF":"SC"} , "areas_interesse": ["A", "C", "F"]}'); INSERT INTO pessoas (pessoa) VALUES('{"nome": "Ciclano", "sexo":"m", "idade":20, "localizacao":{"cidade":"Porto Alegre", "UF":"RS"} , "areas_interesse": ["A", "B", "D"]}'); Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  5. 5. INSERT INTO pessoas (pessoa) VALUES('{"nome": "Zezinho", "sexo":"m", "idade":21, "localizacao":{"cidade":"São Paulo", "UF":"SP"} , "areas_interesse": ["E"]}'); INSERT INTO pessoas (pessoa) VALUES('{"nome": "Luizinha", "sexo":"m", "idade":22, "localizacao":{"cidade":"Rio de Janeiro", "UF":"RJ"} , "areas_interesse": ["A", "E"]}'); Selecionando e filtrando dados dos documentos JSON Assim como já acontece em outras linguagens de programação e outros bancos de dados que manipulam documentos JSON, o caracter sifrão($) é utilizado para representar o documento, e após podem ser utilizados seletores. JSON_EXTRACT Retorna o valor de uma chave do documento. SELECT JSON_EXTRACT(pessoa, '$.nome') FROM pessoas; Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  6. 6. SELECT JSON_EXTRACT(pessoa, '$.areas_interesse') FROM pessoas; Mais alguns exemplos SELECT JSON_EXTRACT(pessoa, '$.localizacao') FROM pessoas; SELECT JSON_EXTRACT(pessoa, '$.localizacao.UF') FROM pessoas; SELECT * FROM pessoas WHERE JSON_EXTRACT(pessoa, '$.localizacao.cidade') = 'Curitiba'; JSON_UNQUOTE Remove as aspas quando o valor de uma chave for string. SELECT JSON_UNQUOTE(JSON_EXTRACT(pessoa, '$.nome')) AS nome FROM pessoas; JSON_KEYS Retornas as chaves de um documento. Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  7. 7. SELECT JSON_KEYS(pessoa) FROM pessoas; SELECT JSON_KEYS(pessoa, '$.localizacao') FROM pessoas; JSON_LENGTH Retorna a quantidade de chaves que existem no documento, ou a partir de uma profundidade específica. SELECT JSON_LENGTH(pessoa) FROM pessoas; SELECT JSON_LENGTH(pessoa, '$.localizacao' ) FROM pessoas; Da para utilizar essa função para saber se uma chave existe, isso pode ser bem útil, já que o que eu mais escuto é que o “bom” de armazenar documentos, cada um pode ter uma estrutura diferente. SELECT * FROM pessoas WHERE JSON_LENGTH(pessoa, '$.localizacao.UF') = 1; SELECT * FROM pessoas WHERE JSON_LENGTH(pessoa, '$.localizacao') >= 1; JSON_SEARCH Retorna o path de um valor que será buscado no documento. Caso o valor não seja localizado, o valor NULL será retornado. o primeiro parâmetro é o documento JSON, o segundo deve ser o valor “one” ou o valor “all”, caso o valor do segundo parâmetro seja “one”, a função irá retornar a primeira chave(elemento) que possui esse valor, e caso o valor do parâmetro seja “all”, será retornada todas as chaves(elementos) que possuem o valor, o terceiro parâmetro é a string que será buscada e aqui é necessário uma atenção especial, pois o valor que será buscado é case sensitive., o quarto valor é o caracter de escape que deve ser utilizado para realizar a busca, caso não tenho o valor NULL deve ser informado, esse parâmetro é opcional, o quinto parâmetro é o path que a busca deve ser realizada, esse parâmetro também não é obrigatório. Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  8. 8. Para entender melhor o diferença dos valores “one”e “all”no segundo parâmetro faça esse teste. INSERT INTO pessoas (pessoa) VALUES('{"nome": "A", "sexo":"A", "idade":"A", "localizacao":{"cidade":"A", "UF":"A"} , "areas_interesse": ["A", "A"]}'); SELECT JSON_SEARCH(pessoa, 'one', 'A') FROM pessoas; SELECT JSON_SEARCH(pessoa, 'all', 'A') FROM pessoas; Veja como fazer para selecionar quem tem o valor “D” informado no elemento areas_interesse. SELECT * FROM pessoas WHERE JSON_SEARCH(pessoa, 'one', 'D', NULL, '$.areas_interesse') IS NOT NULL; Ou quem é da cidade de Curitiba. SELECT * FROM pessoas WHERE JSON_SEARCH(pessoa, 'one', 'Curitiba', NULL, '$.localizacao.cidade') IS NOT NULL; Adicionando Elementos em um documento JSON JSON_SET Insere ou altera um elemento no documento. Sua utilização é bem simples, e ela recebe 3 elementos. O primeiro é o documento, o segundo é o path e nome do novo elemento, e o terceiro é o valor. SELECT JSON_SET('{"a":"a1", "b":"b2"}', '$.c', 'c3'); SELECT JSON_SET('{"a":"a1", "b":"b2"}', '$.a', 'c3'); Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  9. 9. UPDATE pessoas SET pessoa = JSON_SET(pessoa, '$.dtNascimento', '1990-01-01') WHERE JSON_SEARCH(pessoa, 'one', 'Fulano', NULL, '$.nome') IS NOT NULL; UPDATE pessoas SET pessoa = JSON_SET(pessoa, '$.dtNascimento', '1991-02-02') WHERE JSON_EXTRACT(pessoa, '$.nome') = 'Beltrana'; Agora que temos um data em nosso documento, também podemos realizar pesquisas por datas, pois o MySQL indexa as datas nos formatos DATE, DATETIME ou TIMESTAMP. JSON_ARRAY_APPEND Adiciona um novo elemento em um array. Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  10. 10. UPDATE pessoas SET pessoa = JSON_ARRAY_APPEND(pessoa, '$.areas_interesse', 'J') WHERE id = 4; JSON_REMOVE Remove uma chave ou um elemento de um array. Removendo uma chave Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  11. 11. UPDATE pessoas SET pessoa = JSON_REMOVE(pessoa, '$.dtNascimento') WHERE id = 1; Removendo um elemento de um array Para remover um elemento de um array é necessário informar a posição do elemento, essa posição é o índice interno do array. O primeiro elemento sempre é o índice 0(zero) e assim por diante, sempre incrementando 1. Para facilitar essa remoção eu utilizei outra função que já falei nesse artigo, que é a função JSON_SEARCH. Vamos remover o elemento “E”. UPDATE pessoas Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB
  12. 12. SET pessoa = JSON_REMOVE(pessoa, JSON_UNQUOTE(JSON_SEARCH(pessoa, 'one', 'E', NULL, '$.areas_interesse'))) WHERE id = 4; Veja que também foi necessário utilizar a função JSON_UNQUOTE para remover as aspas, assim fazendo a função JSON_REMOVE remover o elemento corretamente. Eu busquei fazer os exemplos para atender a uma necessidade, mas além das funções que mostrei aqui existe outras, veja mais em https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.htmle htt ps://dev.mysql.com/doc/refman/5.7/en/json.html Espero que esse artigo ajude vocês, e em breve irei fazer outro falando da performance e dicas para melhores práticas. Gostou? compartilha esse artigo ai Curta a página da PerformanceDB no Facebook e receba sempre em primeira mão os novos artigos. Florianópolis, 15 de Fevereiro de 2016 Cordialmente, ___________________________________ Diego Hellas PERFORMANCEDB Florianópolis – Santa Catarina - Brasil MySQL - MariaDB Telefones: (48) 9948-2057 E-mail: contato@performancedb.com.br Skype: diego.hellas Site: www.performancedb.com.br PERFORMANCEDB

×