Índices e seletividade

Índices no Couchbase

Os índices no Couchbase são um meio flexível de executar o processamento de back-end. Ao utilizar índices, é possível criar agregações do tipo árvore de decisão e funcionalidade de seletividade, como as encontradas em um sistema de controle de estoque. Ao usar um modelo de dados bem definido e flexível em conjunto com o subsistema de indexação do Couchbase, é possível criar aplicativos que ofereçam um alto grau de seletividade. O Couchbase oferece a capacidade de passar parâmetros para uma experiência de consulta dinâmica. Uma rápida revisão dos parâmetros disponíveis é a seguinte:

  • Key=""
  • Chaves=[]
  • startkey/endkey=""
  • startkey_docID/endkey_docID=""
  • stale=[false,update_after,true]
  • group/group_by
  • include_docs=[true]

Construindo a seletividade

No exemplo a seguir, um sistema de controle de estoque será utilizado para demonstrar o poder de seletividade dos índices no Couchbase. O exemplo é para uma loja de roupas que precisa ser capaz de realizar consultas com seletividade para:

  • por categoria de item
  • por fornecedor de itens
  • por desconto de item

O formato JSON para itens armazenados no intervalo de inventário é simplificado para este exemplo e utiliza um pequeno conjunto de dados de teste de sete documentos. Um exemplo de documento é o seguinte:

{
        "item": "KS-00114629 Dark Grey Glasses",
        "vendor": "kate spade",
        "category": "glasses" (óculos)
}

Com esse bucket, podemos criar um índice chamado "catalogue" (catálogo) da seguinte forma:

function(doc,meta){
  if(doc.item){
        if(doc.vendor){
                emit(doc.vendor, doc.item);
        }
        se(doc.category){
                emit(doc.category, doc.item);
        }
        if(doc.discount){
                emit(doc.discount,doc.item);
        }
  }
}

Esse índice executa algumas funcionalidades interessantes que permitem a seletividade na consulta. O fluxo de trabalho para esse índice é o seguinte:

  • if(doc.item){  // Verifica se um documento tem um campo chamado "item"   
  • if(doc.vendor){  /Verifica se um documento tem um campo chamado fornecedor e, se tiver, emite o nome do fornecedor como chave e o campo do item como valor
  • se(doc.category){  /Verifica se um documento tem um campo chamado categoria e, se tiver, emite o nome da categoria como a chave e o campo do item como o valor
  • if(doc.discount){  /Verifica se um documento tem um campo chamado desconto e, se tiver, emite o valor do desconto como a chave e o campo do item como o valor

Esse índice pode potencialmente emitir três linhas para cada documento, supondo que um documento tenha um fornecedor, uma categoria e um desconto.   
    
Uma vez implantado, se esse índice for chamado de qualquer ponto de extremidade no cluster (neste exemplo, é usado um nó do cluster com ip 192.168.60.101) com:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0

São retornadas 16 linhas:

{"total_rows":16, "rows":[
{"id": "0000000007″, "key": "10″, "value": "CH-44308670 Two Tone Yellow Kremlin Bag"},
{"id": "0000000006″, "key": "15″, "value": "IH-00884501 Triple ring Shoulder bag"},
{"id": "0000000007″, "key": "Chrome", "value": "CH-44308670 Two Tone Yellow Kremlin Bag"},
{"id": "0000000001″, "key": "glasses", "value": "KS-00114629 Dark Grey Glasses"},
{"id": "0000000003″, "key": "glasses", "value": "RL-00657038 Blue Rodeo Sunglasses"},
{"id": "0000000002″, "key": "handbag", "value": "KS-00113108 Blue Shoulder Strap Handbag"},
{"id": "0000000004″, "key": "handbag", "value": "RL-00332567 Yellow Messenger Bag"},
{"id": "0000000006″, "key": "handbag", "value": "IH-00884501 Triple ring Shoulder bag"},
{"id": "0000000007″, "key": "handbag", "value": "CH-44308670 Two Tone Yellow Kremlin Bag"},
{"id": "0000000005″, "key": "iron heart", "value": "IH-00130628 Slim Cut Denim"},
{"id": "0000000006″, "key": "iron heart", "value": "IH-00884501 Triple ring Shoulder bag"},
{"id": "0000000001″, "key": "kate spade", "value": "KS-00114629 Dark Grey Glasses"},
{"id": "0000000002″, "key": "kate spade", "value": "KS-00113108 Blue Shoulder Strap Handbag"},
{"id": "0000000005″, "key": "pants", "value": "IH-00130628 Slim Cut Denim"},
{"id": "0000000003″, "key": "ralph lauren", "value": "RL-00657038 Blue Rodeo Sunglasses"},
{"id": "0000000004″, "key": "ralph lauren", "value": "RL-00332567 Yellow Messenger Bag"}
]
}

Seletividade na consulta

Com a flexibilidade definida no modelo de dados e implementada no índice, esse índice pode ser utilizado para realizar consultas no banco de dados com um alto grau de seletividade. Uma consulta Range pode ser utilizada para selecionar todos os itens de um fornecedor específico. Por exemplo, para ver todos os itens no intervalo de Kate Spade, uma startkey e uma endkey de "kate spade" poderiam ser passadas da seguinte forma:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0&startkey=%22kate%20spade%22&endkey=%22kate%20spade%22

Mesmo que o índice contenha 16 linhas, apenas duas seriam retornadas ao aplicativo cliente: 

{"total_rows":16, "rows":[
{"id": "0000000001″, "key": "kate spade", "value": "KS-00114629 Dark Grey Glasses"},
{"id": "0000000002″, "key": "kate spade", "value": "KS-00113108 Blue Shoulder Strap Handbag"}
]
}

Nesse ponto, também existe a opção de retornar o documento inteiro com essa consulta, não apenas os itens emitidos no índice. Se essa mesma consulta for executada novamente, com o parâmetro "include_docs" definido como "true", o resultado será o seguinte:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&skip=0&startkey=%22kate%20spade%22&endkey=%22kate%20spade%22&include_docs=true

Os mesmos dois ids são retornados, desta vez com o documento inteiro para cada linha no índice que corresponda ao intervalo:

{"total_rows":16, "rows":[
{"id": "0000000001″, "key": "kate spade", "value": "KS-00114629 Dark Grey Glasses", "doc":{"meta":{"id": "0000000001″, "rev":”6-00002ec467e06f2a0000000000000000″,”expiration”:0,”flags”:0},”json”:{“item”:”KS-00114629 Dark Grey Glasses”,”vendor”:”kate spade”,”category”:”glasses”}}},
{"id": "0000000002″, "key": "kate spade", "value": "KS-00113108 Blue Shoulder Strap Handbag", "doc":{"meta":{"id": "0000000002″, "rev":"6-00002ec9a2088ad70000000000000000″, "expiration":0, "flags":0}, "json":{"item": "KS-00113108 Bolsa com alça de ombro azul", "vendor": "kate spade", "category": "handbag"}}}
]
}

O poder desse modelo de dados pode ser explicado mais detalhadamente na execução de uma consulta para ver os itens que atualmente têm um desconto associado a eles. Uma consulta pode ser feita com uma chave final "a" devido à ordem de classificação unicode que o Couchbase utiliza e todos os valores numéricos da chave serão retornados:

http://192.168.60.101:8092/inventory/_design/inventory/_view/category?stale=update_after&connection_timeout=60000&endkey=%22a%22

As duas linhas no índice que foram emitidas devido à presença de um desconto no documento para o item são retornadas

{"total_rows":16, "rows":[
{"id": "0000000007″, "key": "10″, "value": "CH-44308670 Two Tone Yellow Kremlin Bag"},
{"id": "0000000006″, "key": "15″, "value": "IH-00884501 Triple ring Shoulder bag"}
]
}
Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Todd Greenstein

Todd Greenstein é arquiteto de soluções na Couchbase. Todd é especializado em design de API, arquitetura, modelagem de dados, desenvolvimento em nodejs e golang.

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.