Migrar o esquema de banco de dados normalizado do Banco de Dados SQL do Azure para o contêiner desnormalizado do Azure Cosmos DB

Este guia explicará como converter um esquema de banco de dados normalizado existente no banco de dados SQL do Azure em um esquema desnormalizado do Azure Cosmos DB para carregar no Azure Cosmos DB.

Os esquemas SQL normalmente são modelados usando o terceiro formato normal, resultando em esquemas normalizados que fornecem altos níveis de integridade de dados e menos valores de dados duplicados. As consultas podem unir entidades em tabelas para leitura. O Azure Cosmos DB é otimizado para transações super-rápidas e consultas em uma coleção ou contêiner por meio de esquemas desnormalizados que usam dados autossuficientes em um documento.

Usando o Azure Data Factory, criaremos um pipeline que usa um fluxo de dados de mapeamento único para ler de duas tabelas normalizadas do banco de dados SQL do Azure que contêm chaves primárias e estrangeiras como a relação de entidade. O ADF unirá essas tabelas em um único fluxo usando o mecanismo Spark do fluxo de dados, coletará linhas Unidas em matrizes e produzirá documentos limpos individuais para inserção em um novo contêiner do Azure Cosmos DB.

Este guia criará um contêiner de imediato, chamado "orders", que usará as tabelas SalesOrderHeader e SalesOrderDetail do banco de dados de exemplo Adventure Works padrão do SQL Server. Essas tabelas representam as transações de vendas unidas pelo SalesOrderID. Cada registro de detalhes exclusivo tem a própria chave primária de SalesOrderDetailID. A relação entre o cabeçalho e o detalhe é 1:M. Uniremos no SalesOrderID no ADF e, em seguida, acumularemos cada registro detalhado relacionado em uma matriz chamada "Detalhe".

A consulta SQL representativa para este guia é:

  SELECT
  o.SalesOrderID,
  o.OrderDate,
  o.Status,
  o.ShipDate,
  o.SalesOrderNumber,
  o.ShipMethod,
  o.SubTotal,
  (select SalesOrderDetailID, UnitPrice, OrderQty from SalesLT.SalesOrderDetail od where od.SalesOrderID = o.SalesOrderID for json auto) as OrderDetails
FROM SalesLT.SalesOrderHeader o;

O contêiner do Azure Cosmos DB resultante vai inserir a consulta interna em um só documento, e vai ter esta aparência:

Collection

Criar um pipeline

  1. Selecione +Novo Pipeline para criar um novo pipeline.

  2. Adicionar uma atividade de fluxo de dados

  3. Na atividade de fluxo de dados, selecione Novo fluxo de dados de mapeamento.

  4. Será criado o gráfico de fluxo de dados abaixo

    Data Flow Graph

  5. Defina a origem para "SourceOrderDetails". Para conjunto de dados, crie um novo conjunto de dados do banco de dados SQL do Azure que aponte para a tabela SalesOrderDetail.

  6. Defina a origem para "SourceOrderDetails". Para conjunto de dados, crie um novo conjunto de dados do banco de dados SQL do Azure que aponte para a tabela SalesOrderHeader.

  7. Na origem superior, adicione uma transformação de coluna derivada após "SourceOrderDetails". Chame a nova transformação "TypeCast". É preciso arredondar a coluna UnitPrice e convertê-la em um tipo de dados duplo para o Azure Cosmos DB. Defina a fórmula como: toDouble(round(UnitPrice,2)).

  8. Adicione outra coluna derivada e chame-a de "MakeStruct". É aí que criaremos uma estrutura hierárquica para manter os valores da tabela de detalhes. Lembre-se de que detalhes é uma relação M:1 com o cabeçalho. Nomeie a nova estrutura orderdetailsstruct e crie a hierarquia dessa forma, configurando cada subcoluna para o nome da coluna de entrada:

    Create Structure

  9. Agora, vamos para a fonte de cabeçalho de vendas. Adicione uma transformação de junção. Para o lado direito, selecione "MakeStruct". Deixe definido como junção interna e escolha SalesOrderID para ambos os lados da condição de junção.

  10. Clique na guia Visualização de dados na nova junção que você adicionou para que você possa ver os resultados até este ponto. Você deve ver todas as linhas de cabeçalho unidas com as linhas de detalhes. Esse é o resultado da junção que está sendo formada a partir de SalesOrderID. Em seguida, combinaremos os detalhes das linhas comuns na estrutura de detalhes e agregaremos as linhas comuns.

    Join

  11. Antes de criar as matrizes para desnormalizar essas linhas, precisamos remover as colunas indesejadas e verificar se os valores de dados corresponderão aos tipos de dados do Azure Cosmos DB.

  12. Adicione uma transformação Selecionar próximo e defina o mapeamento de campo como este:

    Column scrubber

  13. Agora, vamos converter novamente uma coluna de moeda, desta vez TotalDue. Como realizado na etapa 7, defina a fórmula como: toDouble(round(TotalDue,2)).

  14. Aqui é onde desnormalizaremos as linhas agrupando pela chave comum SalesOrderID. Adicione uma transformação Agregação e defina "Agrupar por" como SalesOrderID.

  15. Na fórmula de agregação, adicione uma nova coluna chamada "Detalhes" e use esta fórmula para coletar os valores na estrutura criada anteriormente chamada orderdetailsstruct: collect(orderdetailsstruct).

  16. A transformação Agregação só produzirá colunas que fazem parte das fórmulas Agregação ou "Agrupar por". Portanto, também é preciso incluir as colunas do cabeçalho de vendas. Para fazer isso, adicione um padrão de coluna na mesma transformação Agregação. Esse padrão incluirá todas as outras colunas na saída, excluindo as listadas abaixo (OrderQty, UnitPrice, SalesOrderID):

instr(name,'OrderQty')==0&&instr(name,'UnitPrice')==0&&instr(name,'SalesOrderID')==0

  1. Use a sintaxe "this" ($$) nas outras propriedades para manter os mesmos nomes de coluna e use a função first() como uma agregação. Isso informa ao ADF que ele deve manter o primeiro valor correspondente encontrado:

    Aggregate

  2. Tudo pronto para concluir o fluxo de migração. Basta adicionar uma transformação de coletor. Clique em "novo" ao lado do conjunto de dados e adicione um conjunto de dados do Azure Cosmos DB que aponte para o banco de dados do Azure Cosmos DB. Para a coleção, chame "Orders" e ela não terá nenhum esquema e nem documento, pois será criada imediatamente.

  3. Em configurações do coletor, chave de partição para /SalesOrderID e ação de coleção para "recriar". Verifique se a guia mapeamento tem esta aparência:

    Screenshot shows the Mapping tab.

  4. Clique em visualização de dados para certificar-se de que você está vendo essas 32 linhas definidas como inserir como novos documentos no novo contêiner:

    Screenshot shows the Data preview tab.

Se tudo estiver correto, agora você estará pronto para criar um novo pipeline, adicionar essa atividade de fluxo de dados a esse pipeline e executá-lo. Você pode executar a partir de depurar ou de uma execução de gatilho. Após alguns minutos, você terá um novo contêiner de pedidos desnormalizado chamado "orders" no banco de dados Azure Cosmos DB.