Share via


Migrera normaliserat databasschema från Azure SQL Database till en avnormaliserad Azure Cosmos DB-container

Den här guiden beskriver hur du tar ett befintligt normaliserat databasschema i Azure SQL Database och konverterar det till ett avnormaliserat Schema i Azure Cosmos DB för inläsning till Azure Cosmos DB.

SQL-scheman modelleras vanligtvis med tredje normal form, vilket resulterar i normaliserade scheman som ger höga dataintegritetsnivåer och färre duplicerade datavärden. Frågor kan koppla samman entiteter mellan tabeller för läsning. Azure Cosmos DB är optimerat för supersnabba transaktioner och frågor i en samling eller container via avnormaliserade scheman med data som är fristående i ett dokument.

Med Azure Data Factory skapar vi en pipeline som använder en enda mappning Dataflöde för att läsa från två normaliserade Azure SQL Database-tabeller som innehåller primära och externa nycklar som entitetsrelation. ADF ansluter dessa tabeller till en enda ström med hjälp av Spark-motorn för dataflöde, samlar in anslutna rader i matriser och skapar enskilda rensade dokument för infogning i en ny Azure Cosmos DB-container.

Den här guiden skapar en ny container i farten med namnet "orders" som använder tabellerna SalesOrderHeader och från sql Server Adventure Works-exempeldatabasenSalesOrderDetail. Dessa tabeller representerar försäljningstransaktioner som är kopplade till SalesOrderID. Varje unik detaljpost har en egen primärnyckel för SalesOrderDetailID. Relationen mellan rubrik och detaljer är 1:M. Vi ansluter till SalesOrderID ADF och distribuerar sedan varje relaterad detaljpost till en matris med namnet "detail".

Den representativa SQL-frågan för den här guiden är:

  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;

Den resulterande Azure Cosmos DB-containern bäddar in den inre frågan i ett enda dokument och ser ut så här:

Collection

Skapa en pipeline

  1. Välj +Ny pipeline för att skapa en ny pipeline.

  2. Lägga till en dataflödesaktivitet

  3. I dataflödesaktiviteten väljer du Nytt mappningsdataflöde.

  4. Vi skapar det här dataflödesdiagrammet nedan

    Data Flow Graph

  5. Definiera källan för "SourceOrderDetails". För datauppsättning skapar du en ny Azure SQL Database-datauppsättning som pekar på SalesOrderDetail tabellen.

  6. Definiera källan för "SourceOrderHeader". För datauppsättning skapar du en ny Azure SQL Database-datauppsättning som pekar på SalesOrderHeader tabellen.

  7. Lägg till en transformering av härledd kolumn efter "SourceOrderDetails" på den översta källan. Anropa den nya omvandlingen "TypeCast". Vi måste avrunda kolumnen och omvandla den UnitPrice till en dubbel datatyp för Azure Cosmos DB. Ange formeln till: toDouble(round(UnitPrice,2)).

  8. Lägg till en annan härledd kolumn och kalla den "MakeStruct". Här skapar vi en hierarkisk struktur för att lagra värdena från informationstabellen. Kom ihåg att information är en M:1 relation till huvudet. Namnge den nya strukturen orderdetailsstruct och skapa hierarkin på det här sättet och ange varje underkolumn till det inkommande kolumnnamnet:

    Create Structure

  9. Nu går vi till källan för försäljningshuvudet. Lägg till en Join-transformering. Välj "MakeStruct" till höger. Låt den vara inställd på inre koppling och välj SalesOrderID för båda sidor av kopplingsvillkoret.

  10. Klicka på fliken Dataförhandsgranskning i den nya koppling som du har lagt till så att du kan se dina resultat fram till den här punkten. Du bör se alla rubrikrader som är kopplade till de detaljerade raderna. Det här är resultatet av att kopplingen skapas från SalesOrderID. Därefter kombinerar vi informationen från de gemensamma raderna till informations struct och aggregerar de gemensamma raderna.

    Join

  11. Innan vi kan skapa matriserna för att avnormalisera dessa rader måste vi först ta bort oönskade kolumner och se till att datavärdena matchar Azure Cosmos DB-datatyper.

  12. Lägg till en Välj transformering härnäst och ställ in fältmappningen så här:

    Column scrubber

  13. Nu ska vi återigen kasta en valutakolumn, den här gången TotalDue. Precis som vi gjorde ovan i steg 7 anger du formeln till: toDouble(round(TotalDue,2)).

  14. Här avnormaliserar vi raderna genom att gruppera efter den gemensamma nyckeln SalesOrderID. Lägg till en aggregeringstransformering och ange gruppen efter till SalesOrderID.

  15. I sammansättningsformeln lägger du till en ny kolumn med namnet "details" och använder den här formeln för att samla in värdena i den struktur som vi skapade tidigare med namnet orderdetailsstruct: collect(orderdetailsstruct).

  16. Den aggregerade omvandlingen matar bara ut kolumner som ingår i aggregerade eller grupperade efter formler. Därför måste vi även inkludera kolumnerna från försäljningshuvudet. Det gör du genom att lägga till ett kolumnmönster i samma aggregerade transformering. Det här mönstret innehåller alla andra kolumner i utdata, exklusive kolumnerna nedan (OrderQty, UnitPrice, SalesOrderID):

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

  1. Använd syntaxen "this" ($$) i de andra egenskaperna så att vi behåller samma kolumnnamn och använder first() funktionen som aggregering. Detta talar om för ADF att behålla det första matchande värdet som hittas:

    Aggregate

  2. Vi är redo att slutföra migreringsflödet genom att lägga till en mottagartransformering. Klicka på "ny" bredvid datauppsättningen och lägg till en Azure Cosmos DB-datauppsättning som pekar på din Azure Cosmos DB-databas. För samlingen kallar vi den "beställningar" och den har inget schema och inga dokument eftersom den kommer att skapas i farten.

  3. I sink Inställningar, partitionsnyckel till /SalesOrderID och insamlingsåtgärd för att "återskapa". Kontrollera att mappningsfliken ser ut så här:

    Screenshot shows the Mapping tab.

  4. Klicka på förhandsversionen av data för att se till att de här 32 raderna är inställda på att infogas som nya dokument i den nya containern:

    Screenshot shows the Data preview tab.

Om allt ser bra ut är du nu redo att skapa en ny pipeline, lägga till den här dataflödesaktiviteten i pipelinen och köra den. Du kan köra från felsökning eller en utlöst körning. Efter några minuter bör du ha en ny avnormaliserad container med order som kallas "beställningar" i din Azure Cosmos DB-databas.