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. Começa-se a partir de dois projetos de armazém existentes e configura-se dependências unidirecionais entre eles usando referências de base de dados.

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 assume que o seu espaço de trabalho Fabric é o destino de implementação e que o esquema T-SQL reside num ou mais projetos do Visual Studio Code que controla 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 (SalesMarketing). 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 precisar deste tipo de lógica, mova um lado da dependência para um modelo semântico ou relatório posterior que une os dois armazéns no momento da consulta.

Referências diretas entre armazéns através de 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

Cada projeto foi criado ou extraído usando os passos em Desenvolver projetos de armazém em 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 um dos:
    • Projeto de base de dados no espaço de trabalho atual (Um projeto de base de dados referenciado desta forma também deve estar aberto em Visual Studio Code), ou
    • Aplicação no nível de dados (.dacpac) (Assume que já concluiu uma compilação .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

Usar uma variável SQLCMD para o nome do armazém remoto permite-te reutilizar o mesmo projeto em todos os teus ambientes, como Dev/Test/Prod, onde os nomes dos armazéns podem ser diferentes.

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 controlo de versões e orientação CI/CD em Desenvolvimento e implementação e documentação de integração Fabric git.
  • 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.