Dela 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 mappningsdataflöde för att läsa från två normaliserade Azure SQL Database-tabeller som innehåller primära och främmande nycklar som utgör entitetsrelationen. Datafabriken kopplar dessa tabeller till en enda ström med hjälp av Spark-motorn för dataflöde, samlar in kopplade rader i matriser och skapar enskilda rensade dokument för infogning i en ny Azure Cosmos DB-container.

Den här guiden bygger en ny container i farten som heter "orders" och som använder tabellerna SalesOrderHeader och SalesOrderDetail från SQL Servers standarddatabas Adventure Works-exempel. 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 sedan distribuerar vi 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:

Samling

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:

    Dataflödesgraf

  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 härledd kolumn-transformation efter "SourceOrderDetails" till den översta källan. Kalla den nya omvandlingen "TypeCast". Vi måste avrunda UnitPrice-kolumnen och omvandla den till datatypen double 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". Det är här vi skapar en hierarkisk struktur för att lagra värdena från informationstabellen. Kom ihåg att detaljer är en M:1 relation till rubriken. Namnge den nya strukturen orderdetailsstruct och skapa hierarkin på det här sättet och ange varje underkolumn till det inkommande kolumnnamnet:

    Skapa struktur

  9. Nu går vi till försäljningshuvudkällan. 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. Välj 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 detaljerna från de gemensamma raderna till detaljstrukturen och aggregerar de gemensamma raderna.

    Anslut

  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:

    Kolumnskrubber

  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 ställ in grupperingen enligt 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 sammanställningsomvandlingen skriver bara ut kolumner som ingår i sammanställnings- eller grupperingsformel. 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:

    Aggregera

  2. Vi är redo att slutföra migreringsflödet genom att lägga till en mottagartransformering. Välj "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 Inställningar för mottagning, ställ in partitionsnyckel till /SalesOrderID och ställ in åtgärd för samling till "återskapa". Kontrollera att mappningsfliken ser ut så här:

    Skärmbild som visar fliken Mappning.

  4. Välj dataförhandsgranskning för att se till att de här 32 raderna är inställda på att infogas som nya dokument i den nya containern:

    Skärmbild som visar fliken Dataförhandsgranskning.

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.