Migrowanie znormalizowanego schematu bazy danych z usługi Azure SQL Database do zdenormalizowanego kontenera usługi Azure Cosmos DB

W tym przewodniku wyjaśniono, jak zastosować istniejący znormalizowany schemat bazy danych w usłudze Azure SQL Database i przekonwertować go na zdenormalizowany schemat usługi Azure Cosmos DB na potrzeby ładowania do usługi Azure Cosmos DB.

Schematy SQL są zwykle modelowane przy użyciu trzeciej formy normalnej, co powoduje znormalizowane schematy zapewniające wysoki poziom integralności danych i mniej zduplikowanych wartości danych. Zapytania mogą łączyć jednostki między tabelami w celu odczytu. Usługa Azure Cosmos DB jest zoptymalizowana pod kątem super-szybkich transakcji i wykonywania zapytań w ramach kolekcji lub kontenera za pomocą zdenormalizowanych schematów z danymi samodzielnie zawartymi w dokumencie.

Korzystając z usługi Azure Data Factory, utworzymy potok, który używa pojedynczego Przepływ danych mapowania do odczytu z dwóch znormalizowanych tabel usługi Azure SQL Database zawierających klucze podstawowe i obce jako relację jednostki. Usługa ADF połączy te tabele w jednym strumieniu przy użyciu aparatu Spark przepływu danych, zbierze sprzężone wiersze w tablice i utworzy indywidualne oczyszczone dokumenty w celu wstawienia do nowego kontenera usługi Azure Cosmos DB.

Ten przewodnik utworzy nowy kontener na bieżąco o nazwie "orders", który będzie używać SalesOrderHeader tabel i SalesOrderDetail ze standardowej przykładowej bazy danych SQL Server Adventure Works. Te tabele reprezentują transakcje sprzedaży połączone przez SalesOrderID. Każdy unikatowy rekord szczegółów ma własny klucz SalesOrderDetailIDpodstawowy . Relacja między nagłówkem a szczegółem to 1:M. Dołączymy do SalesOrderID usługi ADF, a następnie przerzucimy każdy powiązany rekord szczegółów do tablicy o nazwie "detail".

Reprezentatywne zapytanie SQL dla tego przewodnika to:

  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;

Wynikowy kontener usługi Azure Cosmos DB osadzi zapytanie wewnętrzne w jednym dokumencie i będzie wyglądać następująco:

Collection

Tworzenie potoku

  1. Wybierz pozycję +Nowy potok , aby utworzyć nowy potok.

  2. Dodawanie działania przepływu danych

  3. W działaniu przepływu danych wybierz pozycję Nowy przepływ mapowania danych.

  4. Skonstruujemy ten wykres przepływu danych poniżej

    Data Flow Graph

  5. Zdefiniuj źródło dla elementu "SourceOrderDetails". W przypadku zestawu danych utwórz nowy zestaw danych usługi Azure SQL Database, który wskazuje tabelę SalesOrderDetail .

  6. Zdefiniuj źródło "SourceOrderHeader". W przypadku zestawu danych utwórz nowy zestaw danych usługi Azure SQL Database, który wskazuje tabelę SalesOrderHeader .

  7. W górnym źródle dodaj przekształcenie kolumny pochodnej po "SourceOrderDetails". Wywołaj nową transformację "TypeCast". Musimy zaokrąglić kolumnę UnitPrice i rzutować ją na podwójny typ danych dla usługi Azure Cosmos DB. Ustaw formułę na: toDouble(round(UnitPrice,2)).

  8. Dodaj kolejną kolumnę pochodną i wywołaj ją "MakeStruct". W tym miejscu utworzymy hierarchiczną strukturę do przechowywania wartości z tabeli szczegółów. Pamiętaj, że szczegóły są relacją z nagłówkiem M:1 . Nadaj nowej strukturze orderdetailsstruct nazwę i utwórz hierarchię w ten sposób, ustawiając każdy podkolumn na nazwę przychodzącej kolumny:

    Create Structure

  9. Teraz przejdźmy do źródła nagłówka sprzedaży. Dodaj przekształcenie sprzężenia. Po prawej stronie wybierz pozycję "MakeStruct". Pozostaw wartość sprzężenia wewnętrznego i wybierz SalesOrderID dla obu stron warunku sprzężenia.

  10. Kliknij kartę Podgląd danych w dodanym nowym sprzężeniu, aby zobaczyć wyniki do tego momentu. Powinny zostać wyświetlone wszystkie wiersze nagłówka połączone ze szczegółowymi wierszami. Jest to wynik sprzężenia tworzonego z obiektu SalesOrderID. Następnie połączymy szczegóły z typowych wierszy w strukturę szczegółów i zagregujemy typowe wiersze.

    Join

  11. Zanim będziemy mogli utworzyć tablice, aby zdenormalizować te wiersze, najpierw musimy usunąć niechciane kolumny i upewnić się, że wartości danych są zgodne z typami danych usługi Azure Cosmos DB.

  12. Dodaj przekształcenie Select (Wybierz przekształcenie) i ustaw mapowanie pól tak, aby wyglądało następująco:

    Column scrubber

  13. Teraz ponownie rzutujmy kolumnę waluty, tym razem TotalDue. Podobnie jak w powyższym kroku 7 ustaw formułę na : toDouble(round(TotalDue,2)).

  14. W tym miejscu zdenormalizujemy wiersze, grupując według klucza wspólnego SalesOrderID. Dodaj przekształcenie agregacji i ustaw grupę według na .SalesOrderID

  15. W formule agregującej dodaj nową kolumnę o nazwie "details" i użyj tej formuły, aby zebrać wartości w strukturze utworzonej wcześniej o nazwie orderdetailsstruct: collect(orderdetailsstruct).

  16. Przekształcenie agregujące będzie zawierać tylko kolumny, które są częścią agregacji lub grupowania według formuł. Dlatego musimy również uwzględnić kolumny z nagłówka sprzedaży. W tym celu dodaj wzorzec kolumny w tej samej transformacji agregującej. Ten wzorzec będzie zawierać wszystkie inne kolumny w danych wyjściowych, z wyłączeniem kolumn wymienionych poniżej (OrderQty, UnitPrice, SalesOrderID):

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

  1. Użyj składni "this" ($$) w innych właściwościach, aby zachować te same nazwy kolumn i użyć first() funkcji jako agregacji. Spowoduje to, że usługa ADF zachowa pierwszą zgodną wartość:

    Aggregate

  2. Jesteśmy gotowi do zakończenia przepływu migracji przez dodanie przekształcenia ujścia. Kliknij pozycję "nowy" obok zestawu danych i dodaj zestaw danych usługi Azure Cosmos DB, który wskazuje bazę danych usługi Azure Cosmos DB. W przypadku kolekcji będziemy nazywać ją "zamówieniami" i nie będzie miała schematu i żadnych dokumentów, ponieważ zostanie utworzona na bieżąco.

  3. W Ustawienia ujścia akcja Klucz partycji do /SalesOrderID i kolekcja w celu "odtworzenia". Upewnij się, że karta mapowania wygląda następująco:

    Screenshot shows the Mapping tab.

  4. Kliknij podgląd danych, aby upewnić się, że zobaczysz te 32 wiersze ustawione do wstawienia jako nowe dokumenty do nowego kontenera:

    Screenshot shows the Data preview tab.

Jeśli wszystko wygląda dobrze, możesz teraz przystąpić do tworzenia nowego potoku, dodać to działanie przepływu danych do tego potoku i wykonać go. Można wykonać z poziomu debugowania lub wyzwolonego przebiegu. Po kilku minutach w bazie danych usługi Azure Cosmos DB powinien istnieć nowy zdenormalizowany kontener zamówień o nazwie "orders".