Migrera normaliserat databasschema från Azure SQL Database till Azure Cosmos DB avmaliserad container

Den här guiden förklarar hur du tar ett befintligt normaliserat databasschema i Azure SQL Database och konverterar det till ett Azure Cosmos DB-avormaliserat schema för inläsning till Azure Cosmos DB.

SQL-scheman modelleras vanligtvis med tredje normala formulär, vilket resulterar i normaliserade scheman som ger höga nivåer av dataintegritet och färre duplicerade datavärden. Frågor kan koppla samman entiteter mellan tabeller för läsning. CosmosDB är optimerat för supersnaliga transaktioner och frågor i en samling eller container via avormaliserade scheman med data som är fristående i ett dokument.

Med Azure Data Factory skapar vi en pipeline som använder en enda mappningsdata-Flow för att läsa från två Azure SQL Database-normaliserade tabeller som innehåller primära och externa nycklar som entitetsrelation. ADF ansluter dessa tabeller till en enda dataström med hjälp av dataflödets Spark-motor, samlar in sammanfogade 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 som kallas "beställningar" som använder tabellerna och från SalesOrderHeader SalesOrderDetail standarddatabasen SQL Server AdventureWorks. Dessa tabeller representerar försäljningstransaktioner som är sammanfogade med SalesOrderID . Varje unik informationspost har sin egen primärnyckel, SalesOrderDetailID . Relationen mellan rubrik och information är 1:M . Vi går med i SalesOrderID ADF och rullar sedan varje relaterad informationspost till en matris med namnet "detail".

Den representativa SQL 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 CosmosDB-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 nedan

Data Flow Graph

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

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

  3. Lägg till en transformering av härledd kolumn i den översta källan efter "SourceOrderDetails". Anropa den nya transformeringen "TypeCast". Vi behöver avrunda kolumnen UnitPrice och typge den till en dubbel datatyp för CosmosDB. Ange formeln till: toDouble(round(UnitPrice,2)) .

  4. Lägg till ytterligare en härledd kolumn och kalla den "MakeStruct". Här skapar vi en hierarkisk struktur som ska innehålla värdena från informationstabellen. Kom ihåg att information är en M:1 relation till rubriken. Ge den nya strukturen ett namn och skapa hierarkin på det här sättet, och ange varje orderdetailsstruct underkolumn till det inkommande kolumnnamnet:

Skapa struktur

  1. Nu går vi till källan för försäljningshuvudet. Lägg till en Kopplingstransformering. Välj MakeStruct till höger. Lämna det inställt på inre koppling och SalesOrderID välj för båda sidorna av kopplingsvillkoret.

  2. Klicka på fliken Dataförhandsgranskning i den nya koppling som du har lagt till så att du kan se resultatet fram till nu. Du bör se alla rubrikrader som är sammanfogade med informationsraderna. Detta är resultatet av den koppling som skapas från SalesOrderID . Nu ska vi kombinera informationen från de gemensamma raderna i informationsstruktur och aggregera de gemensamma raderna.

Join

  1. Innan vi kan skapa matriserna för att avjämna dessa rader måste vi först ta bort oönskade kolumner och se till att datavärdena matchar CosmosDB-datatyperna.

  2. Lägg till en Select transformation next (Välj transformering) och ange fältmappningen så här:

Kolumnscrub

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

  2. Här aviserar vi raderna genom att gruppera efter den gemensamma nyckeln SalesOrderID . Lägg till en mängdtransformering och ange gruppen efter som SalesOrderID .

  3. 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 strukturen som vi skapade tidigare med namnet orderdetailsstruct : collect(orderdetailsstruct) .

  4. Aggregeringsomvandlingen matar bara ut kolumner som ingår i aggregeringen eller grupperar 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 aggregeringsomvandling. Det här mönstret innehåller alla andra kolumner i utdata:

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

  1. Använd syntaxen "den här" i de andra egenskaperna så att vi behåller samma kolumnnamn och first() använder funktionen som en aggregering:

Aggregera

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

  2. I Sink Inställningar,Partition Key to and collection action to "recreate" (Partitionsnyckel till och \SalesOrderID samlingsåtgärd för att "återskapa". Kontrollera att mappningsfliken ser ut så här:

Skärmbild som visar fliken Mappning.

  1. Klicka på dataförhandsgranskning för att se till att dessa 32 rader ä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 avmaliserad container med order som kallas "beställningar" i CosmosDB-databasen.

Nästa steg