Поделиться через


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

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

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

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

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

Репрезентативный 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 внедряет внутренний запрос в один документ и выглядит следующим образом:

Коллекция

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

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

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

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

  4. Мы создадим этот граф потока данных:

    Граф потока данных

  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 и таким образом создайте иерархию, задав для каждого подчиненного столбца имя входящего столбца:

    Создание структуры

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

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

    Присоединиться

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

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

    Средство очистки столбца

  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 о том, что нужно сохранить первое найденное значение:

    Агрегированное

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

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

    Снимок экрана, на котором изображена вкладка

  4. Выберите предварительную версию данных, чтобы убедиться, что эти 32 строки будут вставлены в новый контейнер:

    Снимок экрана, на котором изображена вкладка

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