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. Datová továrna 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ý záznam podrobností má svůj vlastní primární klíč SalesOrderDetailID. Vztah mezi záhlavím a podrobnostmi je 1:M. Spojíme SalesOrderID se v ADF a potom všechny související záznamy podrobností zahrneme 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 vypadá takto:

Kolekce

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:

    Tok dat 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:

    Vytvořit strukturu

  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, vyberte 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.

    Připojení

  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:

    Scrubber sloupců

  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 zahrnuje všechny ostatní sloupce ve výstupu s výjimkou sloupců uvedených níže (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:

    Agregovat

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

  3. V nastavení jímky, klíč oddílu do /SalesOrderID a kolekce akci "znovu vytvořit". Ujistěte se, že karta mapování vypadá takto:

    Snímek obrazovky znázorňující kartu Mapování

  4. Výběrem náhledu dat se ujistěte, že se tyto 32 řádky nastaví tak, aby se do nového kontejneru vkládaly jako nové dokumenty:

    Snímek obrazovky ukazuje 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 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".