Genormaliseerd databaseschema migreren van Azure SQL Database naar een gedenormaliseerde Azure Cosmos DB-container

In deze handleiding wordt uitgelegd hoe u een bestaand genormaliseerd databaseschema in Azure SQL Database gebruikt en converteert naar een gedenormaliseerd Azure Cosmos DB-schema voor laden in Azure Cosmos DB.

SQL-schema's worden doorgaans gemodelleerd met een derde normale vorm, wat resulteert in genormaliseerde schema's die een hoge mate van gegevensintegriteit bieden en minder dubbele gegevenswaarden. Query's kunnen entiteiten samenvoegen tussen tabellen om te lezen. Azure Cosmos DB is geoptimaliseerd voor super snelle transacties en het uitvoeren van query's in een verzameling of container via gedenormaliseerde schema's met gegevens op zichzelf in een document.

Met Behulp van Azure Data Factory bouwen we een pijplijn die gebruikmaakt van één toewijzing Gegevensstroom om te lezen uit twee genormaliseerde Azure SQL Database-tabellen die primaire en refererende sleutels bevatten als entiteitsrelatie. ADF voegt deze tabellen samen in één stroom met behulp van de Spark-engine voor de gegevensstroom, verzamelt samengevoegde rijen in matrices en produceert afzonderlijke opgeschoonde documenten om in te voegen in een nieuwe Azure Cosmos DB-container.

In deze handleiding wordt snel een nieuwe container gemaakt met de naam 'orders' die de SalesOrderHeader en SalesOrderDetail tabellen uit de standaard sql Server Adventure Works-voorbeelddatabase gebruiken. Deze tabellen vertegenwoordigen verkooptransacties die zijn samengevoegd door SalesOrderID. Elke unieke detailrecord heeft een eigen primaire sleutel van SalesOrderDetailID. De relatie tussen koptekst en detail is 1:M. We nemen deel SalesOrderID aan in ADF en rollen vervolgens elke gerelateerde detailrecord in een matrix met de naam 'detail'.

De representatieve SQL-query voor deze handleiding is:

  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;

De resulterende Azure Cosmos DB-container sluit de binnenste query in één document in en ziet er als volgt uit:

Collection

Een pipeline maken

  1. Selecteer +Nieuwe pijplijn om een nieuwe pijplijn te maken.

  2. Een gegevensstroomactiviteit toevoegen

  3. Selecteer nieuwe toewijzingsgegevensstroom in de gegevensstroomactiviteit.

  4. We maken deze gegevensstroomgrafiek hieronder

    Data Flow Graph

  5. Definieer de bron voor SourceOrderDetails. Maak voor de gegevensset een nieuwe Azure SQL Database-gegevensset die verwijst naar de SalesOrderDetail tabel.

  6. Definieer de bron voor SourceOrderHeader. Maak voor de gegevensset een nieuwe Azure SQL Database-gegevensset die verwijst naar de SalesOrderHeader tabel.

  7. Voeg aan de bovenste bron een transformatie van afgeleide kolommen toe na SourceOrderDetails. Roep de nieuwe transformatie 'TypeCast' aan. We moeten de UnitPrice kolom afronden en casten naar een dubbel gegevenstype voor Azure Cosmos DB. Stel de formule in op: toDouble(round(UnitPrice,2)).

  8. Voeg nog een afgeleide kolom toe en noem deze 'MakeStruct'. Hier maken we een hiërarchische structuur voor het opslaan van de waarden uit de detailtabel. Details zijn een M:1 relatie met headers. Geef de nieuwe structuur orderdetailsstruct een naam en maak de hiërarchie op deze manier, waarbij elke subkolom wordt ingesteld op de naam van de binnenkomende kolom:

    Create Structure

  9. Nu gaan we naar de bron van de verkoopheader. Voeg een jointransformatie toe. Selecteer 'MakeStruct' aan de rechterkant. Laat deze ingesteld op inner join en kies SalesOrderID voor beide zijden van de joinvoorwaarde.

  10. Klik op het tabblad Gegevensvoorbeeld in de nieuwe join die u hebt toegevoegd, zodat u uw resultaten tot nu toe kunt zien. U ziet nu alle veldnamenrijen die zijn gekoppeld aan de detailrijen. Dit is het resultaat van de samenvoeging die wordt gevormd door de SalesOrderID. Vervolgens combineren we de details van de gemeenschappelijke rijen in de detailstruct en aggregeren we de gemeenschappelijke rijen.

    Join

  11. Voordat we de matrices kunnen maken om deze rijen te denormaliseren, moeten we eerst ongewenste kolommen verwijderen en ervoor zorgen dat de gegevenswaarden overeenkomen met azure Cosmos DB-gegevenstypen.

  12. Voeg vervolgens een transformatie selecteren toe en stel de veldtoewijzing zo in dat deze er als volgt uitziet:

    Column scrubber

  13. Nu gaan we weer een valutakolom casten, deze keer TotalDue. Zoals we hierboven in stap 7 hebben gedaan, stelt u de formule in op: toDouble(round(TotalDue,2)).

  14. Hier gaan we de rijen denormaliseren door te groeperen op basis van de gemeenschappelijke sleutel SalesOrderID. Voeg een statistische transformatie toe en stel de groep in op SalesOrderID.

  15. Voeg in de statistische formule een nieuwe kolom toe met de naam 'details' en gebruik deze formule om de waarden te verzamelen in de structuur die we eerder orderdetailsstructhebben gemaakt: collect(orderdetailsstruct).

  16. De statistische transformatie levert alleen kolommen op die deel uitmaken van aggregaties of groeperen op formules. Daarom moeten we ook de kolommen uit de koptekst van de verkoop opnemen. Hiervoor voegt u een kolompatroon toe aan dezelfde statistische transformatie. Dit patroon bevat alle andere kolommen in de uitvoer, met uitzondering van de onderstaande kolommen (OrderQty, UnitPrice, SalesOrderID):

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

  1. Gebruik de syntaxis 'this' ($$) in de andere eigenschappen, zodat we dezelfde kolomnamen behouden en de first() functie gebruiken als een statistische functie. Dit vertelt ADF dat de eerste overeenkomende waarde moet worden gevonden:

    Aggregate

  2. We zijn klaar om de migratiestroom te voltooien door een sinktransformatie toe te voegen. Klik op Nieuw naast de gegevensset en voeg een Azure Cosmos DB-gegevensset toe die verwijst naar uw Azure Cosmos DB-database. Voor de verzameling noemen we het 'orders' en hebben we geen schema en geen documenten omdat deze meteen worden gemaakt.

  3. In Sink Instellingen, partitiesleutel naar /SalesOrderID en verzamelingsactie om opnieuw te maken. Controleer of het tabblad Toewijzing er als volgt uitziet:

    Screenshot shows the Mapping tab.

  4. Klik op gegevensvoorbeeld om ervoor te zorgen dat deze 32 rijen zijn ingesteld om als nieuwe documenten in uw nieuwe container in te voegen:

    Screenshot shows the Data preview tab.

Als alles er goed uitziet, bent u nu klaar om een nieuwe pijplijn te maken, voegt u deze gegevensstroomactiviteit toe aan die pijplijn en voert u deze uit. U kunt uitvoeren vanuit foutopsporing of een geactiveerde uitvoering. Na een paar minuten hebt u een nieuwe gedenormaliseerde container met orders met de naam 'orders' in uw Azure Cosmos DB-database.