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

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

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

С помощью Фабрики данных 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;

Итоговый контейнер CosmosDB внедрит внутренний запрос в один документ и будет выглядеть следующим образом:

Коллекция

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

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

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

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

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

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

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

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

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

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

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

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

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

Join

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

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

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

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

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

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

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

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

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

Aggregate

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

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

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

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

Снимок экрана, на котором изображена вкладка "Предварительный просмотр данных".

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

Дальнейшие действия