將正規化資料庫結構描述從 Azure SQL Database 移轉至 Azure Cosmos DB 的反正規化容器 (機器翻譯)

本指南說明如何在 Azure SQL Database 中取得現有的正規化資料庫結構描述,並轉換為載入 Azure Cosmos DB 的 Azure Cosmos DB 反正規化結構描述。

SQL 結構描述通常使用第三正規化形式來建立模型,並產生正規化結構描述,以提供較高的資料完整性、較少的重複資料值。 查詢可聯結各資料表的實體,以便跨資料表讀取。 Azure Cosmos DB 最適合超快速交易,以及透過反正規化結構描述和文件內的獨立式資料,在集合或容器內查詢。

我們將透過 Azure Data Factory 建置管線,使用一個對應資料流來讀取兩個 Azure SQL Database 正規化資料表,其中包含主索引鍵和外部索引鍵作為實體關聯性。 ADF 會使用資料流程 Spark 引擎將這些資料表聯結至單一資料流、將聯結的資料列收集至陣列,並產生已清理的個別文件,以便插入新的 Azure Cosmos DB 容器。

本指南會即時建立名為 "orders" 的新容器,此容器使用標準 SQL Server AdventureWorks 範例資料庫SalesOrderHeaderSalesOrderDetail 資料表。 這些資料表代表由 SalesOrderID 聯結的銷售交易。 每個唯一的詳細資料記錄皆有自己的 SalesOrderDetailID 主索引鍵。 標頭和詳細資料間的關聯為 1:M。 我們將在 ADF 中聯結 SalesOrderID,並將相關的各項詳細資料記錄整併至名稱為「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」的來源。 針對資料集,建立指向 SalesOrderDetail 資料表的新 Azure SQL Database 資料集。

  6. 定義「SourceOrderHeader」的來源。 針對資料集,建立指向 SalesOrderHeader 資料表的新 Azure SQL Database 資料集。

  7. 在第一個來源的「SourceOrderDetails」後,新增衍生資料行轉換。 呼叫新的轉換「TypeCast」。 我們必須將 UnitPrice 資料行四捨五入,並將其轉換為適用於 Azure Cosmos DB 的 double 資料類型。 將公式設為:toDouble(round(UnitPrice,2))

  8. 新增另一個名稱為「MakeStruct」的衍生資料行。 我們將於此處建立階層式結構,以保留 details 資料表的值。 請注意,details 為標頭的 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 資料集。 該集合將命名為「orders」,不含結構描述及文件 (因為會即時建立)。

  3. 在 [接收設定] 中,將分割區索引鍵設為 /SalesOrderID,集合動作設為「重新建立」。 確定對應索引標籤如下所示:

    Screenshot shows the Mapping tab.

  4. 按一下 [資料預覽],確定您看到這 32 個資料列集要插入新容器作為新文件:

    Screenshot shows the Data preview tab.

若確認無誤,您現在已準備好建立新的管線,請將此資料流程活動新增至該管線,並執行該活動。 您可從偵錯執行或透過觸發程序執行。 幾分鐘後,在 Azure Cosmos DB 資料庫中應該會有一個新的反正規化訂單容器,名為 "orders"。