將正規化資料庫結構描述從 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 容器會將內部查詢內嵌至單一檔,如下所示:
建立新管線
選取 [+ 新增管線],建立新管線。
新增資料流程活動
在資料流程活動中,選取 [新增對應資料流]。
我們會建構此資料流圖形:
定義「SourceOrderDetails」的來源。 針對資料集,建立指向
SalesOrderDetail
資料表的新 Azure SQL Database 資料集。定義「SourceOrderHeader」的來源。 針對資料集,建立指向
SalesOrderHeader
資料表的新 Azure SQL Database 資料集。在第一個來源的「SourceOrderDetails」後,新增衍生資料行轉換。 呼叫新的轉換「TypeCast」。 我們必須將
UnitPrice
資料行四捨五入,並將其轉換為適用於 Azure Cosmos DB 的 double 資料類型。 將公式設為:toDouble(round(UnitPrice,2))
。新增另一個名稱為「MakeStruct」的衍生資料行。 這是我們建立階層式結構,以保存詳細數據數據表中的值。 請注意,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 數據集。 針對集合,我們會將其稱為「訂單」,而且沒有架構且沒有文件,因為它會即時建立。
在 [接收設定] 中,將分割區索引鍵設為
/SalesOrderID
,集合動作設為「重新建立」。 確定對應索引標籤如下所示:選取資料預覽,以確定您看到這 32 個資料列設定為插入新檔案到新的容器:
如果一切看起來都不錯,您現在已準備好建立新的管線,將此數據流活動新增至該管線並加以執行。 您可從偵錯執行或透過觸發程序執行。 幾分鐘後,在 Azure Cosmos DB 資料庫中應該會有一個新的反正規化訂單容器,名為 "orders"。
相關內容
- 使用對應資料流程轉換,以組建資料流程邏輯的其餘部分。
- 下載本教學課程所需的已完成管線範本,並將範本匯入您的處理站。