將正規化資料庫結構描述從 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 範例資料庫的 SalesOrderHeader
和 SalesOrderDetail
資料表。 這些資料表代表由 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 容器會將內部查詢內嵌至單一文件,看起來如下所示:
建立新管線
選取 [+ 新增管線],建立新管線。
新增資料流程活動
在資料流程活動中,選取 [新增對應資料流]。
我們將於下方建構此資料流程圖
定義「SourceOrderDetails」的來源。 針對資料集,建立指向
SalesOrderDetail
資料表的新 Azure SQL Database 資料集。定義「SourceOrderHeader」的來源。 針對資料集,建立指向
SalesOrderHeader
資料表的新 Azure SQL Database 資料集。在第一個來源的「SourceOrderDetails」後,新增衍生資料行轉換。 呼叫新的轉換「TypeCast」。 我們必須將
UnitPrice
資料行四捨五入,並將其轉換為適用於 Azure Cosmos DB 的 double 資料類型。 將公式設為:toDouble(round(UnitPrice,2))
。新增另一個名稱為「MakeStruct」的衍生資料行。 我們將於此處建立階層式結構,以保留 details 資料表的值。 請注意,details 為標頭的
M:1
關聯。 將新結構命名為orderdetailsstruct
並以此方式建立階層,將每個子資料行設為傳入資料行的名稱:現在來看看銷售標頭來源。 新增聯結轉換。 於右側選取 [MakeStruct]。 保留內部聯結的設定,並為聯結條件的兩端選擇
SalesOrderID
。按一下新增聯結中的 [資料預覽] 索引標籤,以便查看此時的結果。 您應可看到所有標頭資料列已聯結詳細資料列。 這是從
SalesOrderID
建立聯結的結果。 接下來,我們會將一般資料列的詳細資料合併至詳細資料結構,並彙總一般資料列。我們必須先移除非必要的資料行,並確定資料值符合 Azure Cosmos DB 資料類型,才能建立陣列來對這些資料列進行反正規化。
接著新增「選取轉換」並設定欄位對應,如下所示:
現在再次轉換貨幣資料行,這次是
TotalDue
。 如步驟 7 的動作,請將公式設為:toDouble(round(TotalDue,2))
。我們將於此處進行反正規化,依一般索引鍵
SalesOrderID
分組資料列。 新增彙總轉換,並將群組依據設為SalesOrderID
。在彙總公式中新增名稱為「details」的新資料行,並使用此公式來收集先前所建立結構 (名稱為
orderdetailsstruct
:collect(orderdetailsstruct)
) 中的值。彙總轉換只會輸出屬於彙總或依公式分組的資料行。 因此,銷售標頭的資料行也必須包含在內。 若要進行,請在同一個彙總轉換中新增資料行模式。 此模式會將所有其他資料行放進輸出中,但不包括下列資料行 (OrderQty、UnitPrice、SalesOrderID):
instr(name,'OrderQty')==0&&instr(name,'UnitPrice')==0&&instr(name,'SalesOrderID')==0
在其他屬性中使用 "this" 語法 ($$),以維護相同的資料行名稱,並使用
first()
函式作為彙總。 這指示 ADF 保留第一個找到的相符值:我們已準備好新增接收轉換,完成移轉流程。 按一下資料集旁的 [新增],並新增指向您 Azure Cosmos DB 資料庫的 Azure Cosmos DB 資料集。 該集合將命名為「orders」,不含結構描述及文件 (因為會即時建立)。
在 [接收設定] 中,將分割區索引鍵設為
/SalesOrderID
,集合動作設為「重新建立」。 確定對應索引標籤如下所示:按一下 [資料預覽],確定您看到這 32 個資料列集要插入新容器作為新文件:
若確認無誤,您現在已準備好建立新的管線,請將此資料流程活動新增至該管線,並執行該活動。 您可從偵錯執行或透過觸發程序執行。 幾分鐘後,在 Azure Cosmos DB 資料庫中應該會有一個新的反正規化訂單容器,名為 "orders"。
相關內容
- 使用對應資料流程轉換,以組建資料流程邏輯的其餘部分。
- 下載本教學課程所需的已完成管線範本,並將範本匯入您的處理站。