Consulta SQL++ / N1QL

Consulta e indexação flexíveis para o modelo JSON flexível.

Use o N1QL quando estiver em uma situação difícil com o JSON. - Confúcio

Para o modelo de dados JSON, a recomendação é pensar nas coleções como tabelas, no documento JSON como linhas desnormalizadas e nos nomes de campo como colunas - aproximadamente. Tudo isso é válido em bancos de dados como o Couchbase e o MongoDB quando as recomendações são seguidas à risca. Há muitos motivos pelos quais os usuários não seguem simplesmente esse modelo de par de valores-chave o tempo todo. Aqui estão os principais motivos. 

    1. JSON é muito prolixo.
    2. Você deseja converter uma estrutura de dados de mapa/hashmap em que as chaves são dinâmicas.
    3. Dados de série temporal quando os nomes de campo são geralmente carimbos de data/hora codificados.
    4. Codificação baseada em dicionário
    5. Os formatos e padrões de documentos existentes não permitem o redesenho

Se o seu banco de dados e a linguagem de consulta não lidarem com a situação, você terá que passar por um redesenho elaborado. Além de simplesmente acessar as informações, Como você torna as consultas em JSON eficientes quando você não sabe nem mesmo o nome do campo que você precisa indexar? Felizmente, o Couchbase N1QL tem uma variedade de recursos de consulta e índice para lidar também com metadados flexíveis.

Vamos considerar esses casos de uso.

Caso de uso 1: transformação de valor.

Aqui está um exemplo de documento JSON.

O modelo de dados JSON é descrito simplesmente como um conjunto de pares chave-valor. Cada chave é uma cadeia de caracteres, exclusiva naquele nível da hierarquia, e os valores podem ser escalares, objetos ou matrizes. Uma definição rigorosa pode ser lida aqui. O JSON também é autodescritivo, o que o torna flexível para um modelo de documento de banco de dados. Nem todo cliente precisa ter um número fixo de números de telefone, carros ou qualquer outro tipo de atributo. 

As mesmas informações acima podem ser reorganizadas como o JSON abaixo sem perda de informações, mas alguns códigos implícitos

Isso é muito bom se você estiver simplesmente colocando e definindo o documento. Não importa qual seja a estrutura do JSON. Basta arrastar o documento para frente e para trás.

Agora, vamos ver como isso afeta a consulta.

Q1: SELECIONAR * DE clientes ONDE cxname = "Jane Smith";

Com o novo modelo JSON, não há um nome de campo chamado cxname aqui.

O que a magia do object_pairs() function? Ela transforma os pares JSON {"key": "value"} em uma matriz de pares nome-valor. Veja um exemplo.

A função OBJECT_NAMES() extrai a chave (aqui "Jane Smith") e retorna como um valor, que pode ser indexado. Como a função retorna não apenas um valor, mas uma matriz de "nomes de chaves" como valores, você precisa criar um índice de matriz.  As consultas Q1 e Q2 fazem o mesmo trabalho para o respectivo modelo de dados. Porém, precisamos que cada uma dessas consultas seja executada em milissegundos. 

Para o Q1, simplesmente criamos o índice em cxname.

CRIAR ÍNDICE ix_cxname ON clientes(cxname)

Para o Q2,  

CRIAR ÍNDICE ix_people ON pessoas(DISTINTO OBJECT_NAMES(self))

Com esse índice, para o Q2, você obterá um plano que usa o índice.

 

Caso de uso 2: nomes de chaves dinâmicas.

Este caso de uso foi extraído do Couchbase post do fórum.

Pergunta: Qual seria a melhor maneira de indexar os valores dentro de traduções dinamicamente? Ou seja, um índice genérico que indexa todas as chaves dentro do traduções objeto.

Se a necessidade for simplesmente consultar documentos em inglês o tempo todo, para consultar todos os documentos que tenham translations.en = "Hello" (Olá).

Se estiver sempre procurando por traduções para o inglês, basta criar o índice em transactions.en.

Se as chaves forem dinâmicas, você não sabe qual linguagem específica estará nos dados e quais podem ser consultadas, então é preciso torná-las dinâmicas.

Aqui está a explicação para verificar se o índice é de fato coletado e se os predicados são enviados para a varredura do índice.

Não se preocupe se a definição do índice parecer um pouco mais complicada do que o normal. O Index Advisor o ajudará.

Você pode até mesmo adicionar expressões em cima de cada expressão que estiver avaliando.

 

Mais funções de objeto

O N1QL tem mais objeto e funções de dados aninhadas para ajudar com modelos de dados complexos. Confira o conjunto completo de funções de objeto e a seção funções de token.

Referências:

  1. Funções de objeto do Couchbae N1QL Documentação
  2. Couchbase Indexação de matrizes 
  3. Couchbase blog de índice
Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Keshav Murthy

Keshav Murthy é vice-presidente de P&D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experiência em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&D de SQL e NoSQL na IBM Informix. Recebeu dois prêmios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav é bacharel em Ciência da Computação e Engenharia pela Universidade de Mysore, Índia, detém dez patentes nos EUA e tem três patentes pendentes nos EUA.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.