Перенос нормализованной схемы базы данных из Базы данных SQL Azure в денормализованный контейнер Azure Cosmos DB

В этом руководстве объясняется, как преобразовать имеющуюся нормализованную схему базы данных из Базы данных SQL Azure в денормализованную схему Azure Cosmos DB для загрузки в Azure Cosmos DB.

Схемы SQL обычно моделируются с помощью третьей нормальной формы, результатом чего стают нормализованные схемы, обеспечивающие высокий уровень целостности данных и меньшее количество повторяющихся значений данных. Запросы могут соединять сущности вместе между таблицами для чтения. Azure Cosmos DB оптимизирован для супер-быстрых транзакций и запросов в коллекции или контейнере с помощью денормализованных схем с данными, автономными внутри документа.

С помощью Фабрики данных Azure мы соберем конвейер, использующий единый поток данных для сопоставления для чтения из двух нормализованных таблиц Базы данных SQL Azure, содержащих первичные и внешние ключи в качестве связи сущностей. Служба ADF присоединяет эти таблицы к одному потоку с помощью обработчика потока данных Spark, собирает объединенные строки в массивы и создает отдельные очищенные документы для вставки в новый контейнер Azure Cosmos DB.

В этом руководстве показано создание нового контейнера под названием "Заказы", в котором будут использоваться таблицы SalesOrderHeader и SalesOrderDetail из стандартного образца базы данных SQL Server AdventureWorks. Эти таблицы представляют собой транзакции по продажам, соединение которых было выполнено с помощью SalesOrderID. У каждой уникальной записи сведений есть свой собственный первичный ключ SalesOrderDetailID. Отношение между заголовком и сведениями — 1:M. Мы выполним присоединение к SalesOrderID в ADF, а затем свернем каждую связанную запись со сведениями в массив с именем detail.

Репрезентативный SQL-запрос для этого руководства:

  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;

Полученный контейнер Azure Cosmos DB внедряет внутренний запрос в один документ и выглядит следующим образом:

Collection

Создание конвейера

  1. Выберите + Создать конвейер, чтобы создать новый конвейер.

  2. Добавьте действие потока данных.

  3. В действии потока данных выберите Создать поток данных для сопоставления.

  4. Далее мы создадим этот граф потока данных.

    Data Flow Graph

  5. Определите источник SourceOrderDetails. Для набора данных создайте новый набор данных Базы данных SQL Azure, указывающий на таблицу SalesOrderDetail.

  6. Определите источник SourceOrderHeader. Для набора данных создайте новый набор данных Базы данных SQL Azure, указывающий на таблицу SalesOrderHeader.

  7. В верхнем источнике после SourceOrderDetails добавьте преобразование "Производный столбец". Вызовите новое преобразование TypeCast. Необходимо округлить UnitPrice столбец и привести его к двойному типу данных для Azure Cosmos DB. Задайте для формулы следующее значение: toDouble(round(UnitPrice,2)).

  8. Добавьте еще один производный столбец и назовите его MakeStruct. Здесь мы создадим иерархическую структуру для хранения значений из таблицы со сведениями. Помните, что между сведениями и заголовком есть связь M:1. Назовите новую структуру orderdetailsstruct и таким образом создайте иерархию, задав для каждого подчиненного столбца имя входящего столбца:

    Create Structure

  9. Теперь давайте перейдем к источнику заголовка продажи. Добавьте преобразование "Соединение". Для правой стороны выберите "MakeStruct". Оставьте в качестве значения внутреннее соединение и выберите SalesOrderID для обеих сторон условия соединения.

  10. В новом добавленном соединении щелкните вкладку "Предварительный просмотр данных", чтобы просмотреть все результаты до этого момента. Должны отобразиться все строки заголовка, объединенные со строками детализации. Это результат соединения, сформированного из SalesOrderID. Далее мы объединим сведения из общих строк в структуру сведений и вычислим общие строки.

    Join

  11. Прежде чем создавать массивы для денормализации этих строк, сначала необходимо удалить нежелательные столбцы и убедиться, что значения данных соответствуют типам данных Azure Cosmos DB.

  12. Добавьте преобразование "Выбор" и задайте сопоставление поля следующим образом:

    Column scrubber

  13. Теперь снова приведите столбец валюты, на этот раз им будет TotalDue. Так же как и на шаге 7, задайте для формулы значение: toDouble(round(TotalDue,2)).

  14. Здесь мы денормализуем строки, сгруппировав их по общему ключу SalesOrderID. Добавьте преобразование "Статистическая обработка" и задайте для параметра "Группировка по" значение SalesOrderID.

  15. В вычислительной формуле добавьте новый столбец под названием details и используйте эту формулу для сбора значений в созданной ранее структуре под названием orderdetailsstruct: collect(orderdetailsstruct).

  16. Преобразование "Статистическая обработка" будет выводить только столбцы, которые являются частью статистического выражения или группирования по формулам. Поэтому необходимо также включить столбцы из заголовка продажи. Для этого добавьте шаблон столбца в это же преобразование "Статистическая обработка". Этот шаблон будет содержать все остальные столбцы в выходных данных, за исключением перечисленных ниже столбцов (OrderQty, UnitPrice, SalesOrderID):

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

  1. Используйте синтаксис this ($$) в других свойствах, чтобы сохранить имена столбцов и использовать функцию first() в качестве статистического выражения: Это сообщает ADF о том, что нужно сохранить первое найденное значение:

    Aggregate

  2. Поток миграции готов к завершению после добавления преобразования "Приемник". Щелкните "Создать" рядом с набором данных и добавьте набор данных Azure Cosmos DB, указывающий на базу данных Azure Cosmos DB. Для коллекции мы дадим ему название "Заказы". Так как он будет создан в режиме реального времени, то не будет иметь схемы и документов.

  3. В параметрах приемника задайте для ключа секции значение /SalesOrderID, а для действия сбора — "Повторное создание". Убедитесь, что вкладка "Сопоставление" выглядит следующим образом:

    Screenshot shows the Mapping tab.

  4. Щелкните вкладку "Предварительный просмотр данных", чтобы убедиться, что следующий набор из 32 строк отображается в виде новых документов в новом контейнере:

    Screenshot shows the Data preview tab.

Если все выглядит хорошо, можно создать новый конвейер, добавить это действие потока данных в этот конвейер и выполнить его. Вы можете выполнить запуск из отладки или с помощью триггера. Через несколько минут в базе данных Azure Cosmos DB должен быть новый денормализованный контейнер заказов с именем orders.