Eseguire la migrazione dello schema del database normalizzato dal database SQL di Azure al contenitore denormalizzato di Azure Cosmos DB

Questa guida illustra come accettare uno schema di database normalizzato esistente in database SQL di Azure e convertirlo in uno schema denormalizzato di Azure Cosmos DB per il caricamento in Azure Cosmos DB.

Gli schemi SQL vengono in genere modellati usando la terza forma normale, generando schemi normalizzati che forniscono livelli elevati di integrità dei dati e un minor numero di valori di dati duplicati. Le query possono unire le entità tra le tabelle per la lettura. Azure Cosmos DB è ottimizzato per transazioni super rapide ed esecuzione di query all'interno di una raccolta o di un contenitore tramite schemi denormalizzati con dati indipendenti all'interno di un documento.

Usando Azure Data Factory, si creerà una pipeline che usa un singolo mapping Flusso di dati per leggere da due tabelle normalizzate database SQL di Azure che contengono chiavi primarie ed esterne come relazione di entità. ADF unisce tali tabelle in un singolo flusso usando il motore Spark del flusso di dati, raccoglie le righe unite in matrici e produce singoli documenti puliti per l'inserimento in un nuovo contenitore di Azure Cosmos DB.

Questa guida creerà un nuovo contenitore in tempo reale denominato "orders" che userà le SalesOrderHeader tabelle e SalesOrderDetail dal database di esempio standard di SQL Server Adventure Works. Tali tabelle rappresentano le transazioni di vendita unite da SalesOrderID. Ogni record di dettaglio univoco ha la propria chiave primaria di SalesOrderDetailID. La relazione tra intestazione e dettaglio è 1:M. Verrà eseguito un join SalesOrderID in ADF e quindi verrà eseguito il rollback di ogni record di dettaglio correlato in una matrice denominata "detail".

La query SQL rappresentativa per questa guida è:

  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;

Il contenitore Di Azure Cosmos DB risultante incorporerà la query interna in un singolo documento e avrà un aspetto simile al seguente:

Collection

Creare una pipeline

  1. Selezionare +Nuova pipeline per creare una nuova pipeline.

  2. Aggiungere un'attività del flusso di dati

  3. Nell'attività flusso di dati selezionare Nuovo flusso di dati di mapping.

  4. Di seguito verrà creato questo grafico del flusso di dati

    Data Flow Graph

  5. Definire l'origine per "SourceOrderDetails". Per il set di dati, creare un nuovo set di dati database SQL di Azure che punta alla SalesOrderDetail tabella.

  6. Definire l'origine per "SourceOrderHeader". Per il set di dati, creare un nuovo set di dati database SQL di Azure che punta alla SalesOrderHeader tabella.

  7. Nell'origine superiore aggiungere una trasformazione Colonna derivata dopo "SourceOrderDetails". Chiamare la nuova trasformazione "TypeCast". È necessario arrotondare la colonna ed eseguirne il UnitPrice cast in un tipo di dati double per Azure Cosmos DB. Impostare la formula su: toDouble(round(UnitPrice,2)).

  8. Aggiungere un'altra colonna derivata e chiamarla "MakeStruct". In questo caso verrà creata una struttura gerarchica per contenere i valori della tabella dei dettagli. Tenere presente che i dettagli sono una relazione con l'intestazione M:1 . Denominare la nuova struttura orderdetailsstruct e creare la gerarchia in questo modo, impostando ogni sottocolumn sul nome della colonna in ingresso:

    Create Structure

  9. A questo punto, passare all'origine dell'intestazione sales. Aggiungere una trasformazione Join. Per il lato destro selezionare "MakeStruct". Lasciare che sia impostato su inner join e scegliere SalesOrderID per entrambi i lati della condizione di join.

  10. Fare clic sulla scheda Anteprima dati nel nuovo join aggiunto per visualizzare i risultati fino a questo punto. Verranno visualizzate tutte le righe di intestazione unite con le righe di dettaglio. Si tratta del risultato del join creato da SalesOrderID. Successivamente, si combinano i dettagli delle righe comuni nello struct dei dettagli e si aggregano le righe comuni.

    Join

  11. Prima di poter creare le matrici per denormalizzare queste righe, è prima necessario rimuovere colonne indesiderate e assicurarsi che i valori dei dati corrispondano ai tipi di dati di Azure Cosmos DB.

  12. Aggiungere una trasformazione Seleziona e impostare il mapping dei campi in modo che sia simile al seguente:

    Column scrubber

  13. A questo punto si eseguirà di nuovo il cast di una colonna di valuta, questa volta TotalDue. Come illustrato in precedenza nel passaggio 7, impostare la formula su: toDouble(round(TotalDue,2)).

  14. Ecco dove denormalizzare le righe raggruppando in base alla chiave SalesOrderIDcomune . Aggiungere una trasformazione Aggregazione e impostare il gruppo in base a SalesOrderID.

  15. Nella formula di aggregazione aggiungere una nuova colonna denominata "details" e usare questa formula per raccogliere i valori nella struttura creata in precedenza denominata orderdetailsstruct: collect(orderdetailsstruct).

  16. La trasformazione di aggregazione restituisce solo colonne che fanno parte di formule aggregate o raggruppate. È quindi necessario includere anche le colonne dell'intestazione sales. A tale scopo, aggiungere un criterio di colonna nella stessa trasformazione di aggregazione. Questo modello includerà tutte le altre colonne nell'output, escluse le colonne elencate di seguito (OrderQty, UnitPrice, SalesOrderID):

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

  1. Usare la sintassi "this" ($$) nelle altre proprietà in modo da mantenere gli stessi nomi di colonna e usare la first() funzione come aggregazione. Ciò indica a ADF di mantenere trovato il primo valore corrispondente:

    Aggregate

  2. È possibile completare il flusso di migrazione aggiungendo una trasformazione sink. Fare clic su "new" accanto al set di dati e aggiungere un set di dati di Azure Cosmos DB che punta al database di Azure Cosmos DB. Per la raccolta, lo chiameremo "ordini" e non avrà schemi e nessun documento perché verrà creato in tempo reale.

  3. In Sink Impostazioni l'azione Partition Key to and Collection (Chiave di partizione in /SalesOrderID e raccolta) per "ricreare". Assicurarsi che la scheda mapping sia simile alla seguente:

    Screenshot shows the Mapping tab.

  4. Fare clic sull'anteprima dei dati per assicurarsi di visualizzare queste 32 righe impostate per l'inserimento come nuovi documenti nel nuovo contenitore:

    Screenshot shows the Data preview tab.

Se tutto sembra corretto, è ora possibile creare una nuova pipeline, aggiungere questa attività del flusso di dati a tale pipeline ed eseguirla. È possibile eseguire dal debug o da un'esecuzione attivata. Dopo alcuni minuti, nel database di Azure Cosmos DB dovrebbe essere presente un nuovo contenitore denormalizzato di ordini denominato "orders".