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:
Vytvořit kanál
Vyberte +Nový kanál a vytvořte nový kanál.
Přidání aktivity toku dat
V aktivitě toku dat vyberte Nový tok dat mapování.
Tento graf toku dat vytvoříme:
Definujte zdroj pro SourceOrderDetails. Pro datovou sadu vytvořte novou datovou sadu Azure SQL Database, která odkazuje na
SalesOrderDetail
tabulku.Definujte zdroj pro SourceOrderHeader. Pro datovou sadu vytvořte novou datovou sadu Azure SQL Database, která odkazuje na
SalesOrderHeader
tabulku.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))
.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 strukturuorderdetailsstruct
a vytvořte hierarchii tímto způsobem a nastavujte jednotlivé podsloupce na název příchozího sloupce: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í.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.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.
Přidejte další transformaci Select a nastavte mapování polí tak, aby vypadalo takto:
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))
.Tady je místo, kde denormalizujeme řádky seskupením podle společného klíče
SalesOrderID
. Přidejte agregační transformaci a nastavte skupinu naSalesOrderID
hodnotu .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)
.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
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: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.
V nastavení jímky, klíč oddílu do
/SalesOrderID
a kolekce akci "znovu vytvořit". Ujistěte se, že karta mapování vypadá takto: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:
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".
Související obsah
- Sestavte zbytek logiky toku dat pomocí transformací toků dat mapování.
- Stáhněte si dokončenou šablonu kanálu pro účely tohoto kurzu a naimportujte ji do vaší továrny.