Consulta SQL++ / N1QL

Como desnormalizar documentos importados de tabelas RDBMS usando N1QL

A migração de dados é cheio de desafios.

Ao migrar de um banco de dados relacional (RDBMS) como o SQL Server ou o Oracle, o principal desafio surge no momento de desnormalizar os documentos migrados de acordo com os modelos de dados de destino. Com a introdução de escopos e coleções no a versão 7.0 do Couchbase Server é fácil categorizar e organizar documentos em um compartimento.

Há muitas opções disponíveis para migrar dados do SQL Server ou Oracle para o Couchbase, incluindo:

Na maioria dos casos cbimport por si só é suficiente para concluir a migração de dados de um banco de dados Oracle ou SQL Server para o Couchbase porque cbimport pode importar documentos para um escopo e uma coleção necessários

Neste artigo, abordarei como você pode usar o Consultas SQL++ (referido abaixo como N1QL) no Couchbase 7.0 para mesclar/desnormalizar documentos importados de várias coleções em um escopo.

Informações básicas

Primeiro, vamos analisar os paralelos entre as entidades RDBMS e suas entidades equivalentes no Couchbase Server 7.0:

Entidade RDBMS Equivalente ao Couchbase
Banco de dados Balde
Esquema Escopo
Tabela Coleção
Linha Documento
Coluna Atributo

A migração de dados de um RDBMS para o Couchbase pode ter duas variantes:

  1. Mapeamento um a um: Cada tabela do RDBMS é importada para uma coleção no Couchbase e cada linha dessa tabela se torna um documento JSON. Essa é a migração mais simples, pois não requer nenhuma desnormalização e todo o processo pode ser concluído usando cbimport somente.
  2. Mapeamento de muitos para um: Várias tabelas de um banco de dados RDBMS são combinadas em um único documento do Couchbase, ou podemos dizer que as tabelas RDBMS normalizadas são desnormalizadas em documentos do Couchbase. Para obter a desnormalização, temos várias opções, como
    • Desnormalização na fonte: Isso significa exportar dados do Oracle/SQL Server no formato JSON e a estrutura desse JSON corresponde ao modelo de dados de destino do Couchbase. Em seguida, você importa esse documento JSON exportado para o Couchbase usando cbimport. No entanto, isso não é possível o tempo todo, porque você precisa trabalhar em algumas consultas complexas para gerar o modelo de dados de destino. Além disso, a exportação JSON nem sempre é suportada por todos os bancos de dados.
    • Desnormalização na camada intermediária: Isso só é possível se você estiver usando algum código personalizado (qualquer linguagem de programação como C#, Java etc.) para mover dados do RDBMS para o Couchbase. Dessa forma, seu código se conecta ao banco de dados de origem, lê os dados da origem, modifica os dados de acordo com o modelo de dados de destino do Couchbase e, em seguida, grava os dados no Couchbase. No entanto, isso exige muito trabalho de desenvolvimento, pois você precisa escrever código para cada modelo de dados de destino.
    • Desnormalização no destino: Nessa opção, você move os dados do RDBMS para o Couchbase usando cbimport ou por outros meios. Em seguida, você escreve algumas consultas N1QL personalizadas para realizar a desnormalização no nível do Couchbase. Essa é uma opção adequada caso o modelo de dados de destino tenha no máximo três ou quatro níveis de aninhamento de filhos. Você pode optar por essa opção mesmo se o aninhamento tiver mais de três ou quatro níveis, mas isso introduz mais complexidade.

Exemplo de passo a passo: Migração de dados do RDBMS para o Couchbase com desnormalização no destino usando N1QL

Para demonstrar essa atividade de migração e desnormalização, criei um banco de dados de amostra no SQL Server que contém cinco nomes de tabelas: [Cliente], [Endereço], [Pedido], [OrderDetails]e [Detalhes do produto]. Abaixo está o diagrama do banco de dados para mostrar os relacionamentos e os detalhes das colunas:

An ecommerce database diagram example for Microsoft SQL Server

Abaixo estão os dados de amostra carregados em cada tabela:

select * from [dbo].[Customer] Customer sample data
select * from [dbo].[Address] Address sample data
select * from [dbo].[ProductDetails] Product details sample data
select * from [dbo].[Order] Order sample data
select * from [dbo].[OrderDetails] Order details sample data

Configuração do Couchbase 7.0: Instalei o Couchbase 7.0 em uma máquina Windows e meu cluster de teste está pronto. Criei um bucket chamado testBucket. Além disso, criei um escopo chamado dbo correspondente ao esquema do RDBMS e, em seguida, criou cinco coleções no dbo escopo. Aqui, estou mantendo os nomes das coleções iguais aos nomes das tabelas do RDBMS. No entanto, isso não é obrigatório; os nomes de escopo e coleção podem ser qualquer coisa de sua escolha.

Em seguida, importo todas as tabelas do RDBMS para esse escopo (dbo) usando cbimport.

Using the cbimport tool to import data from RDBMS to Couchbase

Vamos nos preparar para a importação de dados para o Couchbase:

Etapa 1: Exportar dados de tabela para CSVs usando o assistente de exportação do SQL Server.

SQL Server Export Wizard for CSV data

Etapa 2: Importar documentos para o Couchbase usando cbimport:

Abra o prompt de comando do Windows e redirecione para C:\Arquivos de programas\Couchbase\Server\bin e executar cbimport comando. Favor Consulte esta documentação para obter mais informações sobre cbimport sintaxe. Abaixo está o exemplo para importar o Cliente.csv que é colocado no caminho D:/CSVs no dbo escopo e coleta de clientes. Aqui a chave do documento é Identificação do cliente selecionado no CSV Nome da coluna CustomerId.

CSV data import to Couchbase using Windows

Da mesma forma, podemos importar Endereço, ProductDetail, Pedido e Detalhes do pedido CSVs em coleções correspondentes dentro do dbo escopo. No momento, temos cinco coleções em dbo e cada coleção tem documentos nela (destacados abaixo).

Data import for scopes and collections using the Couchbase Web Console

Etapa 3: Vamos verificar os dados importados. Podemos fazer essa etapa examinando o documento por meio da interface do usuário ou verificando a estrutura do documento usando o N1QL. Eu criei cinco índices primários para cada coleção para executar uma consulta N1QL para verificação de documentos. A verificação pode ser feita por meio da correspondência do número de documentos importados, bem como da estrutura, dos atributos e dos dados do documento.

Data verfication for indexes using a N1QL query

Observação: Para executar uma consulta N1QL, deve haver algum índice presente (primário ou secundário) para essa coleção.

Abaixo está o resultado da consulta N1QL para cada coleção (alterei a visualização do resultado da consulta para "tabela"):

Selecione c.* de testBucket.dbo.Cliente c N1QL query sample with customer data
Selecione a.* de testBucket.dbo.Endereço a N1QL query sample with address data
Selecione p.* de testBucket.dbo.ProductDetails N1QL query sample with product details data
Selecione o.* de testBucket.dbo.Pedido o N1QL query sample with order data
Selecione od.* de testBucket.dbo.OrderDetails N1QL query sample with order details data

Os documentos são importados com sucesso, mas esse é um mapeamento de um para um, ou seja, cada tabela é importada como uma coleção. Para tabelas em que precisamos apenas de mapeamento um-para-um (por exemplo, ProductDetails); a migração de dados é concluída nessa etapa.

No entanto, para tabelas em que precisamos realizar a desnormalização, há mais algumas etapas antes de obtermos nosso modelo de dados final. Por exemplo, as tabelas RDBMS Cliente, Endereço, Pedido e OrderDetails devem ser mesclados em um único documento. Seu modelo de dados de destino deve ser semelhante a:

Couchbase document database data model example

Etapa 4: Para desnormalização no destino de destino (por exemplo, Servidor Couchbase), seguiremos uma abordagem de baixo para cima. Primeiro, mesclaremos OrderDetails em Pedidoe, em seguida, mesclaremos Pedido e Endereço em Cliente.

Vamos preparar uma consulta N1QL para mesclar OrderDetails em um Pedido documento. Para isso, usaremos grupo por e ARRAY_AGG e a consulta retornará uma matriz de detalhes do pedido agrupados por Id do pedido.

N1QL query with merge statement, limit clause and group by clause
Observação: Você pode usar palavra-chave limit após grupo por para restringir o tamanho do resultado para uma execução mais rápida em dados enormes.

N1QL query results for a merge statement with limit and group by clauses

Agora temos o OrderDetails array pronto. É hora de mesclá-lo em um Pedido documento. Usaremos o o Couchbase MERGE declaração para realizar essa operação. Aqui estamos adicionando um novo atributo chamado detalhes do pedido em cada Pedido documento quando Order.OrderId e OrderDetails.OrderId são combinados.

An example N1QL query merge statement for Order detail to Order

Antes de executar essa consulta, vamos dar uma olhada nos índices necessários para ela. Nossas consultas anteriores devem funcionar com o índice primário, mas para a parte de mesclagem, precisamos criar um índice secundário. Não se preocupe, o consultor de índices do Couchbase nos ajudará.

Copie a consulta acima no Query Workbench e clique no botão "Index Advisor". Ele mostrará automaticamente o criação de índices que é necessária para executar essa consulta.

The Couchbase Query Workbench Index Advisor

Estou pegando uma referência do consultor de índice e anexando um ONDE para criar um índice parcial no Pedido coleção.

Creating a partial index using a where clause in Couchbase

Este índice parcial abrange apenas os Pedido documentos em que o detalhes do pedido está faltando. No caso de termos milhões de Pedido documentos, o número de documentos nesse índice começará a ser reduzido quando executarmos mesclar em blocos (usando o LIMITE palavra-chave). Por exemplo, neste momento, temos seis documentos cobertos por esse índice.

Criação de um índice secundário no Detalhes do pedido é semelhante, como mostrado abaixo.

Create a secondary index for order details example in Couchbase

Agora temos dois índices em um estado pronto.

Two indexes that are ready in Couchbase

Em seguida, vamos executar um mesclar com uma declaração limite cláusula. Eu atualizei a onde na subconsulta (onde od.OrderId não estiver faltando) para selecionar o índice apropriado durante a execução.

A N1QL merge statement with a limit clause and where clause subquery example

Essa declaração atualizará um Pedido e anexar o documento OrderDetails como um documento filho. No meu caso, ele escolheu o Pedido documento com orderId=2 e o atualizou. Ordem Id 2 tem apenas um OrderDetails portanto, ele o adicionou como uma matriz.

An example of a merged document array in Couchbase

Vamos dar uma olhada no índice. A contagem de documentos diminuiu de seis para cinco. Isso ocorre porque um documento não está satisfazendo a condição do índice parcial. Esse índice será atualizado como ordem documentos são atualizados.

An example index and partial index update view in Couchbase

Agora, remova o Limite e executar uma cláusula mesclar para atualizar todos os ordem documentos.

a N1QL statement for merge query remove limit clause to update documents

Essa declaração traz o adv_OrderId contagem de documentos de índice para zero, pois todos os Pedido agora têm um atributo detalhes do pedido.

Index document count example in Couchbase

Escolhi uma aleatoriamente ordem documento (orderId=9) e incluiu o resultado abaixo.

An example JSON document in Couchbase

Agora temos um Pedido documento pronto com seu filho para ser mesclado em Cliente. Vamos modificar nosso mesclar consulta de acordo e criar índices apropriados para a execução da consulta:

O índice da consulta/subconsulta interna:

A create index inner query subquery N1QL example

O índice parcial para Cliente coleção:

Creating a partial index for a collection N1QL example

O mesclar consulta para mesclar Pedidos em Cliente:

A merge query N1QL example for a customer order

Após a execução, essa é a última cliente estrutura do documento (escolhida aleatoriamente):

A customer document structure JSON example in Couchbase Server

Até este ponto, obtivemos a desnormalização do ordem, detalhes do pedido e Cliente tabelas. Agora vamos mesclar endereço como uma matriz em Cliente como fizemos com os outros.

Criar o índice para o Cliente coleção:

Create index for a collection example in Couchbase

Criar o índice para o endereço coleção:

Create an index for a Collection using sample address data in Couchbase Server

O mesclar consulta para mesclar endereço em Cliente:

A N1QL statement to merge query addresses to customers in Couchbase

Depois de executar essa consulta, obteremos nosso modelo de dados final, que é composto de quatro tabelas RDBMS.

    • Cliente será o documento pai.
    • Endereço será uma matriz de objetos incorporados em cliente.
    • Pedido será uma matriz de objetos incorporados em cliente.
    • OrderDetails será uma matriz de objetos incorporada em cada ordem objeto.

Estrutura final do cliente documento:

An ecommerce example JSON document final structure in Couchbase database

Por fim, obtivemos a desnormalização de acordo com nosso modelo de dados de destino usando consultas N1QL.

Podemos modificar a subconsulta para selecionar um número de atributos/colunas em vez de *. Além disso, podemos usar Funções de objeto do Couchbase para adicionar/remover qualquer atributo no resultado da subconsulta/parente.

Etapa 5 (opcional): Agora é hora de fazer a limpeza. Como temos nosso modelo de dados de destino conosco no Cliente podemos excluir as outras três coleções (endereço, ordem e OrderDetails).

Conclusão

Em resumo, a desnormalização no destino pode ser obtida usando a linguagem de consulta N1QL junto com os índices apropriados. Ela pode ser usada para qualquer nível de aninhamento, de acordo com suas necessidades, começando com os dados filhos mais baixos em seu modelo de dados.

Faça um test drive no Couchbase: Faça o download do Couchbase Server 7.0 hoje mesmo

 

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Gurmeet Singh

Gurmeet está trabalhando como líder de tecnologia na Infosys e tem mais de 9 anos de experiência em desenvolvimento full-stack, incluindo front-end, back-end e bancos de dados. Gurmeet é bacharel em Ciência da Computação pela Punjab Technical University, na Índia. Veja seu perfil no LinkedIn para obter mais detalhes: https://www.linkedin.com/in/gurmeet-singh-04281381/

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.