Migrace normalizovaného databázového schématu z Azure SQL Database do denormalizovaného kontejneru Azure Cosmos DB

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

SQL schémata se obvykle modelují pomocí třetí normální formy, což vede k normalizovaným schématům, která poskytují vysokou úroveň integrity dat a méně duplicitních datových hodnot. Dotazy mohou kvůli čtení spojit entity mezi tabulkami. CosmosDB je optimalizovaná pro superrychlé 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í Azure Data Factory vytvoříme kanál, který používá jednu tabulku mapování dat Flow ke čtení ze dvou normalizovaných tabulek Azure SQL Database které jako relaci entity obsahují primární a cizí klíče. ADF tyto tabulky spojí do jednoho datového proudu pomocí modulu Spark pro tok dat, shromáždí spojené řádky do polí a vytvoří jednotlivé vyčistěné dokumenty pro vložení do nového kontejneru Azure Cosmos DB.

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

Reprezentativním SQL pro tohoto průvodce je:

  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 CosmosDB vloží vnitřní dotaz do jednoho dokumentu a bude vypadat takhle:

Kolekce

Vytvoření kanálu

  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ý mapování toku dat.

  4. Graf toku dat vytvoříme níže.

Datové Flow Graph

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

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

  3. V horním zdroji přidejte transformaci Derived Column (Odvozený sloupec) za SourceOrderDetails. Zavolejte novou transformaci TypeCast. Potřebujeme sloupec zaokrouhlit UnitPrice a přetypovat na datový typ Double pro CosmosDB. Nastavte vzorec na: toDouble(round(UnitPrice,2)) .

  4. Přidejte další odvozený sloupec a volejte ho MakeStruct. Tady vytvoříme hierarchickou strukturu, která bude obsahovat hodnoty z tabulky podrobností. Nezapomeňte, že podrobnosti jsou M:1 relací k záhlaví. Pojmechte novou strukturu a vytvořte hierarchii tímto způsobem a jednotlivé orderdetailsstruct podsloupce nastavte na název příchozího sloupce:

Vytvoření struktury

  1. Teď přejděte ke zdroji prodejní hlavičky. Přidejte transformaci Join. Pro pravou stranu vyberte MakeStruct. Ponechte ji nastavenou na vnitřní spojení SalesOrderID a zvolte pro obě strany podmínky spojení.

  2. V novém připojení, které jste přidali, klikněte na kartu Náhled dat, abyste až do tohoto okamžiku viděli výsledky. Měli byste vidět všechny řádky záhlaví spojené s řádky podrobností. Toto je výsledek spojení vytvořeného z SalesOrderID . Dále zkombinovat podrobnosti ze společných řádků do struktury podrobností a agregovat společné řádky.

Join (Spojení)

  1. Než vytvoříme pole pro denormalizaci těchto řádků, musíme nejprve odebrat nežádoucí sloupce a ujistit se, že hodnoty dat budou odpovídat datovým typům CosmosDB.

  2. Dále přidejte transformaci Select (Vybrat) a nastavte mapování polí tak, aby vypadalo takhle:

Scrubber sloupců

  1. Teď znovu přetypovat sloupec měny, tentokrát TotalDue . Stejně jako v kroku 7 nastavte vzorec na : toDouble(round(TotalDue,2)) .

  2. Tady denormalizujeme řádky seskupením podle společného klíče SalesOrderID . Přidejte transformaci agregace a nastavte skupinu podle na SalesOrderID .

  3. Do agregovaného vzorce přidejte nový sloupec s názvem "details" a použijte tento vzorec ke shromáždění hodnot ve struktuře, kterou jsme vytvořili dříve s názvem orderdetailsstruct : collect(orderdetailsstruct) .

  4. Agregační transformace bude výstupem pouze sloupců, které jsou součástí agregace nebo seskupování podle vzorců. Proto musíme zahrnout také sloupce z prodejní hlavičky. Chcete-li to provést, přidejte do stejné agregační transformace vzor sloupce. Tento vzor bude obsahovat všechny ostatní sloupce ve výstupu:

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 first() jako agregaci:

Agregace

  1. 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 CosmosDB, která odkazuje na vaši databázi CosmosDB. Pro kolekci ji nazýme "orders" a nebude mít žádné schéma ani žádné dokumenty, protože se budou vytvářet za běhu.

  2. V části Nastavení vyberte Klíč oddílu do \SalesOrderID a akci kolekce, která se má znovu vytvořit. Ujistěte se, že vaše karta mapování vypadá takhle:

Snímek obrazovky znázorňuje kartu Mapování

  1. Klikněte na náhled dat a ujistěte se, že vidíte těchto 32 řádků, které se mají vložit jako nové dokumenty do nového kontejneru:

Snímek obrazovky znázorňuje kartu Náhled dat.

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 ho. Spuštění můžete provést z ladění nebo aktivované spuštění. Po několika minutách byste měli mít v databázi CosmosDB nový denormalizovaný kontejner objednávek s názvem "orders".

Další kroky