共用方式為


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

本指南說明如何在 Azure SQL 資料庫 中採用現有的正規化資料庫架構,並將其轉換成 Azure Cosmos DB 反正規化架構,以載入 Azure Cosmos DB。

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

我們會使用 Azure Data Factory 建置管線,以使用單一對應數據流從兩個 Azure SQL 資料庫 標準化數據表讀取,其中包含主鍵和外鍵作為實體關聯性。 Data Factory 會使用數據流 Spark 引擎將這些數據表聯結至單一數據流、將聯結的數據列收集到陣列中,併產生個別清理的檔,以插入新的 Azure Cosmos DB 容器。

本指南會即時建置稱為「訂單」的新容器,以使用SalesOrderHeader標準 SQL Server Adventure Works 範例資料庫的SalesOrderDetail 數據表。 這些資料表代表由 SalesOrderID 聯結的銷售交易。 每個唯一的詳細數據記錄都有自己的主鍵 SalesOrderDetailID。 標頭和詳細資料間的關聯為 1:M。 我們會在ADF中聯結 SalesOrderID ,然後將每個相關的詳細數據記錄轉換成稱為「詳細數據」的數位。

本指南的代表性 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」的來源。 針對資料集,建立指向 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 為標頭的 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"。