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 datový kanál, který používá Tok dat pro mapování ke čtení ze dvou normalizovaných tabulek Azure SQL Database, jež obsahují primární a cizí klíče jako vztah mezi entitami. 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ří za pochodu nový kontejner s názvem "orders", který bude používat SalesOrderHeader a SalesOrderDetail tabulky ze standardní Adventure Works ukázková databáze SQL Server. 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. Připojíme SalesOrderID v ADF a potom jednotlivé související záznamy zahrneme do pole nazvaného "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 pipelinu

  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ý datový tok mapování.

  4. Tento graf toku dat vytvoříme:

    Graf datových toků

  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. Nazvěte novou transformaci "TypeCast". Potřebujeme zaokrouhlit sloupec UnitPrice a převést ho na datový typ `double` pro Azure Cosmos DB. Nastavte vzorec na: toDouble(round(UnitPrice,2)).

  8. Přidejte další odvozený sloupec a nazvěte 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 transformační spojení. Na pravé straně vyberte "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:

    Čistič 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 mít pouze výstupní sloupce, které jsou součástí agregačních nebo seskupovacích 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 tomu říkáme "orders" a nemá žádné schéma a žádné dokumenty, protože se vytvoří za pochodu.

  3. V nastavení úložiště nastavte klíč oddílu na /SalesOrderID a akci kolekce na "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".

  • Sestavte zbytek logiky toku dat pomocí transformací mapování toků dat.
  • Stáhněte si dokončenou šablonu datového toku pro tento kurz a importujte ji do vaší továrny.