Sdílet prostřednictvím


Migrace normalizovaného schématu databáze ze služby Azure SQL Database do denormalizovaného kontejneru služby Azure Cosmos DB

Tato příručka vysvětluje, jak vzít existující normalizované schéma databáze ve službě Azure SQL Database a převést ho na denormalizované schéma služby Azure Cosmos DB pro načtení do služby Azure Cosmos DB.

Schémata SQL se obvykle modelují pomocí třetího normálního formátu, což vede k normalizovaným schématům, která poskytují vysokou úroveň integrity dat a méně duplicitních hodnot dat. Dotazy můžou spojit entity mezi tabulkami pro čtení. Azure Cosmos DB je optimalizovaná pro super-rychlé transakce a dotazování v rámci kolekce nebo kontejneru prostřednictvím denormalizovaných schémat s daty obsaženými v dokumentu.

Pomocí služby Azure Data Factory vytvoříme kanál, který používá jedno mapování Tok dat ke čtení ze dvou normalizovaných tabulek Azure SQL Database, které jako relaci entit obsahují primární a cizí klíče. ADF tyto tabulky spojí do jednoho datového proudu pomocí modulu Spark toku dat, shromáždí spojené řádky do polí a vytvoří jednotlivé vyčištěné dokumenty pro vložení do nového kontejneru Azure Cosmos DB.

Tato příručka vytvoří nový kontejner za běhu s názvem "orders", který bude používat SalesOrderHeader tabulky ze SalesOrderDetail standardní ukázkové databáze SQL Server Adventure Works. Tyto tabulky představují prodejní transakce spojené SalesOrderID. Každý jedinečný podrobný záznam má svůj vlastní primární klíč SalesOrderDetailID. Vztah mezi záhlavím a podrobnostmi je 1:M. Připojíme SalesOrderID se v ADF a poté všechny související záznamy podrobností zařadíme do pole s názvem "detail".

Reprezentativní dotaz SQL pro tuto příručku:

  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;

Výsledný kontejner Azure Cosmos DB vloží vnitřní dotaz do jednoho dokumentu a bude vypadat takto:

Collection

Vytvořit kanál

  1. Vyberte +Nový kanál a vytvořte nový kanál.

  2. Přidání aktivity toku dat

  3. V aktivitě toku dat vyberte Nový tok dat mapování.

  4. Tento graf toku dat vytvoříme níže.

    Data Flow Graph

  5. Definujte zdroj pro SourceOrderDetails. Pro datovou sadu vytvořte novou datovou sadu Azure SQL Database, která odkazuje na SalesOrderDetail tabulku.

  6. Definujte zdroj pro SourceOrderHeader. Pro datovou sadu vytvořte novou datovou sadu Azure SQL Database, která odkazuje na SalesOrderHeader tabulku.

  7. Do horního zdroje přidejte transformaci odvozeného sloupce za SourceOrderDetails. Volejte novou transformaci TypeCast. Potřebujeme sloupec zaokrouhlit UnitPrice a přetypovat na dvojitý datový typ pro Azure Cosmos DB. Nastavte vzorec na: toDouble(round(UnitPrice,2)).

  8. Přidejte další odvozený sloupec a zavolejte ho MakeStruct. Tady vytvoříme hierarchickou strukturu, která bude obsahovat hodnoty z tabulky podrobností. Mějte na paměti, že podrobnosti jsou vztahem M:1 k záhlaví. Pojmenujte novou strukturu orderdetailsstruct a vytvořte hierarchii tímto způsobem a nastavujte jednotlivé podsloupce na název příchozího sloupce:

    Create Structure

  9. Teď přejdeme ke zdroji prodejní hlavičky. Přidejte transformaci spojení. Na pravé straně vyberte MakeStruct( MakeStruct). Ponechte ji nastavenou na vnitřní spojení a zvolte SalesOrderID pro obě strany podmínky spojení.

  10. V novém spojení, které jste přidali, klikněte na kartu Náhled dat, abyste viděli výsledky až do tohoto okamžiku. Měly by se zobrazit všechny řádky záhlaví spojené s řádky podrobností. To je výsledek spojení, které je vytvořeno z SalesOrderID. V dalším kroku zkombinujeme podrobnosti z běžných řádků do struktury podrobností a agregujeme společné řádky.

    Join

  11. Než začneme vytvářet pole pro denormalizaci těchto řádků, musíme nejprve odebrat nežádoucí sloupce a zajistit, aby hodnoty dat odpovídaly datovým typům Azure Cosmos DB.

  12. Přidejte další transformaci Select a nastavte mapování polí tak, aby vypadalo takto:

    Column scrubber

  13. Teď znovu přetypujme sloupec měny, tentokrát TotalDue. Stejně jako jsme to udělali výše v kroku 7, nastavte vzorec na: toDouble(round(TotalDue,2)).

  14. Tady je místo, kde denormalizujeme řádky seskupením podle společného klíče SalesOrderID. Přidejte agregační transformaci a nastavte skupinu na SalesOrderIDhodnotu .

  15. V agregačním vzorci přidejte nový sloupec s názvem "podrobnosti" a pomocí tohoto vzorce shromážděte hodnoty ve struktuře, kterou jsme vytvořili dříve s názvem orderdetailsstruct: collect(orderdetailsstruct).

  16. Agregační transformace bude pouze výstupní sloupce, které jsou součástí agregace nebo seskupení podle vzorců. Proto musíme zahrnout i sloupce z prodejní hlavičky. Uděláte to tak, že do stejné agregační transformace přidáte vzor sloupce. Tento vzor bude obsahovat všechny ostatní sloupce ve výstupu s výjimkou níže uvedených sloupců (OrderQty, UnitPrice, SalesOrderID):

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

  1. V ostatních vlastnostech použijte syntaxi "this" ($$), abychom zachovali stejné názvy sloupců a funkci použili first() jako agregaci. To dává ADF pokyn, aby zachoval první nalezenou odpovídající hodnotu:

    Aggregate

  2. Jsme připraveni dokončit tok migrace přidáním transformace jímky. Klikněte na nový vedle datové sady a přidejte datovou sadu Azure Cosmos DB, která odkazuje na databázi Azure Cosmos DB. Pro kolekci ji budeme volat "orders" a nebude mít žádné schéma a žádné dokumenty, protože se vytvoří za běhu.

  3. V Nastavení jímky proveďte akci klíč oddílu a /SalesOrderID kolekci pro opětovné vytvoření. Ujistěte se, že karta mapování vypadá takto:

    Screenshot shows the Mapping tab.

  4. Kliknutím na náhled dat se ujistěte, že jsou tyto 32 řádků nastavené tak, aby se do nového kontejneru vkládaly jako nové dokumenty:

    Screenshot shows the Data preview tab.

Pokud všechno vypadá dobře, jste teď připraveni vytvořit nový kanál, přidat tuto aktivitu toku dat do tohoto kanálu a spustit ji. Spuštění můžete provést z ladění nebo aktivovaného spuštění. Po několika minutách byste měli mít v databázi Azure Cosmos DB nový denormalizovaný kontejner objednávek s názvem "orders".