Desenvolver e implementar dependências inter-armazém

Neste artigo, aprende a modelar e implementar dependências cross-warehouse utilizando projetos de bases de dados SQL no Visual Studio Code. Parte-se de dois projetos de armazém de dados existentes e configuram-se dependências unidirecionais entre eles, utilizando referências de base de dados e, quando necessário, scripts de pré-implementação e pós-implementação.

Este artigo baseia-se nos conceitos do Desenvolver projetos de armazém em Visual Studio Code e assume que já se sente confortável a construir e publicar um único projeto de armazém.

Pré-requisitos

Antes de começar, certifique-se de que:

  • Cria dois Armazéns de Tecidos no mesmo espaço de trabalho.
  • Crie ou extraia um projeto base de dados para cada armazém em Visual Studio Code.
  • Instala Visual Studio Code na tua estação de trabalho.
  • Instala o SDK .NET para construir e publicar projetos de bases de dados.
  • Instale duas extensões Visual Studio Code: SQL Database Projects e SQL Server (mssql).
    • Pode instalar as extensões necessárias diretamente a partir do marketplace do Visual Studio Code pesquisando por "SQL Database Projects" ou "SQL Server (mssql)".
  • Os projetos de armazém validam, constroem e podem ser publicados no Visual Studio Code.

Observação

Este artigo foca-se em projetos de armazenamento no Visual Studio Code e em como os versiona no Git como projetos de código regular. A integração do Fabric Git para espaços de trabalho e itens de armazém é abordada separadamente em Desenvolvimento e Implementação e integração Git. O artigo pressupõe que o seu espaço de trabalho do Fabric é o alvo de implementação e que o esquema T-SQL reside num ou em mais projetos do Visual Studio Code que gere com controlo de versões no Git.

Este artigo não aborda o desenvolvimento cross-warehouse para o endpoint de análise SQL de um Lakehouse. As tabelas Lakehouse e objetos de endpoint de análise SQL não são objetos rastreados no controlo de código-fonte da mesma maneira que são os projetos de armazém. Use itens do Warehouse com projetos de bases de dados para uma integração completa com o Git e suporte ao deployment em experiências nativas do Fabric e em ferramentas de cliente.

Cenário: Armazéns interdomínio do Zava Analytics

O Zava Analytics utiliza dois domínios de negócio:

  • Vendas – encomendas de clientes, receitas e métricas do pipeline.
  • Marketing – campanhas, canais e métricas de envolvimento.

Cada domínio tem:

  • Um Armazém de Tecidos no mesmo espaço de trabalho:

    • ZavaSalesWarehouse
    • ZavaMarketingWarehouse
  • Um projeto base de dados em Visual Studio Code:

    • Zava.Sales.Warehouse
    • Zava.Marketing.Warehouse

Para construir ELT e relatórios de ponta a ponta, cada domínio necessita de vistas apenas de leitura para aceder a dados do outro domínio:

  • Sales Precisa de envolvimento de marketing por parte do cliente.
  • Marketing Precisa de desempenho de vendas por campanha.

Precisa de:

  • Estabelecer dependências unidirecionais entre armazéns via referências de bases de dados.
  • Evite dependências cíclicas.

Garantir que as dependências entre armazéns sejam unidirecionais

Para cada par de armazéns, escolha uma direção para a dependência lógica:

Exemplo:

  • Sales depende dos dados de engajamento de Marketing.
  • Marketing não depende Sales de quaisquer objetos que sejam necessários no momento da implantação.

Na prática:

Zava.Sales.Warehouse tem uma referência de base de dados a Zava.Marketing.Warehouse.

  • O T-SQL no armazém de Sales pode usar nomes com três componentes, como:
    SELECT * FROM ZavaMarketingWarehouse.Marketing.CampaignEngagement
    
  • Zava.Marketing.Warehouse não faz referência Sales a objetos que forçariam um ciclo de dependência no momento da implementação.

Sugestão

Para cada par de armazéns, desenhe um diagrama simples de setas (Sales → Marketing). Se encontrares setas a apontar em ambas as direções para o mesmo tipo de objeto, refatora o design para restaurar uma dependência unidirecional.

Evitar dependências cíclicas

Uma dependência cíclica ocorre quando o Armazém A e o Armazém B dependem um do outro de uma forma que o motor não consegue resolver numa única implementação.

Exemplo de problema (não faças isto):

  • ZavaSalesWarehouse.dbo.CustomerRollup Veja:
    CREATE VIEW dbo.CustomerRollup AS
    SELECT  c.CustomerId,
            c.TotalRevenue,
            m.LastCampaignId
    FROM    dbo.CustomerRevenue AS c
    LEFT OUTER JOIN   
            ZavaMarketingWarehouse.dbo.CustomerEngagement AS m
            ON c.CustomerId = m.CustomerId;
    
  • ZavaMarketingWarehouse.dbo.CampaignAttribution Veja:
    CREATE VIEW dbo.CampaignAttribution AS
    SELECT  m.CampaignId,
            SUM(s.TotalRevenue) AS RevenueAttributed
    FROM    dbo.Campaigns AS m
    LEFT OUTER JOIN    
            ZavaSalesWarehouse.dbo.CustomerRollup AS s
            ON m.CampaignId = s.LastCampaignId
    GROUP BY m.CampaignId;
    

Neste anti-padrão:

  • CustomerRollup em Vendas depende de CustomerEngagement em Marketing.
  • CampaignAttribution em Marketing depende de CustomerRollupVendas.

Este anti-padrão cria um ciclo: visão de vendas → visão de marketing → visão de vendas novamente.

Orientação:

Não modele dependências mútuas entre armazéns como objetos regulares ao nível do esquema. Se realmente precisas deste tipo de lógica, move um lado da dependência para:

  • Um script pós-implantação, ou
  • Um modelo semântico a jusante ou relatório que une os dois armazéns no momento da consulta.

Utilize scripts de pré e pós-implementação para a lógica entre armazéns sensível à implementação

Como as implementações em armazém são operações completas de diferença de esquema (não implementações parciais por objeto), trate cuidadosamente os itens entre armazém:

Se o Armazém A e o Armazém B precisam ambos de objetos que dependem um do outro:

  • Mantém as tabelas centrais e as vistas principais em cada projeto de armazém.
  • Mover vistas de ponte ou objetos utilitários que criam ciclos em scripts de pré ou pós-implementação num projeto.
  • Certifica-te de que esses scripts são idempotentes e seguros para reexecutar.

Exemplos de padrões:

  • Script pré-implantação: eliminar temporariamente uma vista entre armazéns antes de aplicar alterações no esquema que a possam incompatibilizar.
  • Script pós-implementação: recriar ou atualizar a vista inter-armazéns após a implementação de ambos os armazéns.

Para mais informações e exemplos, consulte Scripts de pré-implementação e pós-implementação para o Fabric Data Warehouse.

Padrão 1: Referências diretas entre armazéns via referências de base de dados

Neste padrão, modelas dependências unidirecionais diretamente nos projetos de base de dados usando Referências de Base de Dados.

Passo 1: Começar a partir de dois projetos de armazém existentes

Já devias ter:

  • Zava.Sales.Warehouse → implantado em ZavaSalesWarehouse
  • Zava.Marketing.Warehouse → implantado em ZavaMarketingWarehouse

Crie ou extraia cada projeto utilizando os passos em Desenvolver projetos warehouse no Visual Studio Code.

Passo 2: Adicionar uma referência da base de dados de Vendas para a de Marketing

  • No Visual Studio Code, abra o painel Projetos de Base de Dados.
  • Clique com o botão direito do rato no Zava.Sales.Warehouse projeto.
  • Selecionar Adicionar Referência de Base de Dados....
  • Escolha uma das seguintes opções:
    • Projeto de base de dados no espaço de trabalho atual (também abrir o projeto de base de dados referenciado no Visual Studio Code), ou
    • Aplicação da camada de dados (.dacpac) (utilize esta opção se criou um .dacpac para o armazém Marketing).
  • Defina as opções de referência:
    • Tipo de referência: Mesmo servidor, base de dados diferente.
    • Nome ou variável da base de dados: Use uma variável SQLCMD, por exemplo [$(MarketingWarehouseName)].
  • Salve e reconstrua o projeto de Vendas.

No .sqlproj ficheiro, deverá ver uma entrada semelhante a:

<ItemGroup>
  <ArtifactReference Include="..\Zava.Marketing.Warehouse\bin\Debug\Zava.Marketing.Warehouse.dacpac">
    <DatabaseVariableLiteralValue>$(MarketingWarehouseName)</DatabaseVariableLiteralValue>
  </ArtifactReference>
</ItemGroup>
<ItemGroup>
  <SqlCmdVariable Include="MarketingWarehouseName">
    <DefaultValue>ZavaMarketingWarehouse</DefaultValue>
  </SqlCmdVariable>
</ItemGroup>

Sugestão

Ao usar uma variável SQLCMD para o nome do armazém remoto, pode reutilizar o mesmo projeto em todos os seus ambientes, como Dev, Test e Prod.

Passo 3: Criar uma vista inter-armazéns no sistema de Vendas

No projeto Sales, adicione uma visualização que leia do armazém Marketing.

-- schema/Views/dbo.CustomerEngagementFact.sql
CREATE VIEW [dbo].[CustomerEngagementFact] AS
SELECT
    s.CustomerId,
    s.TotalRevenue,
    m.LatestChannel,
    m.LastEngagementDate
FROM dbo.CustomerRevenue AS s
JOIN [$(MarketingWarehouseName)].[dbo].[CustomerEngagement] AS m
    ON s.CustomerId = m.CustomerId;

Pontos principais:

  • O nome [$(MarketingWarehouseName)].[dbo].[CustomerEngagement] em três partes corresponde ao padrão T-SQL usado para consultas cross-warehouse no editor Fabric SQL.
  • O DacFx resolve a base de dados externa através da referência da base de dados.

Construa o projeto para garantir que não há SQL71501 erros de referência não resolvidos .

Passo 4: Publique o armazém de Marketing e depois as Vendas

Para evitar problemas de implantação:

  • Construir e publicarZava.Marketing.Warehouse Primeiro:
    • Clique com o botão direito no projeto → Build.
    • Clique com o botão direito do projeto → Publicar → escolher ZavaMarketingWarehouse.
  • Quando Marketing a implementação for bem-sucedida, compilar e publicarZava.Sales.Warehouse:
    • Clique com o botão direito no projeto → Build.
    • Clique com o botão direito do projeto → Publicar → escolher ZavaSalesWarehouse.

O fluxo de implementação resultante é:

Zava.Marketing.Warehouse (sem dependências externas) → Zava.Sales.Warehouse (depende de Marketing)

Agora, qualquer consulta T-SQL em ZavaSalesWarehouse pode usar a dbo.CustomerEngagementFact view, que lê do Marketing warehouse internamente usando T-SQL entre armazéns.

Continue a aprender

  • Combine este padrão com o controlo de código-fonte e as orientações sobre CI/CD em Desenvolvimento e implementação e com a documentação da integração do Git no Fabric.
  • Estenda o cenário do Zava Analytics para incluir ambientes Dev/Test/Prod, usando pipelines de implementação ou CI/CD externo para coordenar a ordem de publicação em vários armazéns.