事實表的代理鍵分配是否要求源數據具有自然鍵?
假設我有一個簡單的 OLTP 數據庫,其中包含訂單、產品和客戶:
從它開始,我正在建構一個包含訂單事實表、產品維度、客戶維度和日期維度的數據集市:
將訂單表載入到 fact_orders 時(假設我使用 SSIS 查找轉換來分配代理鍵),這是否意味著訂單的數據源也需要具有關聯的自然“外鍵”值OLTP系統中的訂單?
換句話說,正在載入的數據會來自這樣的查詢嗎?
SELECT order_date, -- needed to get date surrogate key customer_name, -- needed to get customer surrogate key product_name, -- needed to get product surrogate key order_number, -- denegenerate dimension, qty_ordered AS order_qty, -- measure total_amount AS order_amount -- measure FROM orders o INNER JOIN customers c ON o.customer_id = c.customer_id INNER JOIN products p ON o.product_id = p.product_id
我不確定您是否需要“自然”鍵,但您可能確實需要維護各種鍵映射。因此,您需要了解源系統和目標系統之間的關係映射,確定這些關係的鍵並從那裡建構鍵映射。
我之前有一個關於此的問題,稱為“從自然鍵映射到基於整數的鍵的最佳實踐是什麼?(ETL)”。
**編輯:**到目前為止,我看到至少三個,如果不是四個映射。
CustomersToDim_Customers (customer_id, dim_customer_id) ProductsToDim_Products (product_id, dim_product_id) OrderDatesToDim_Date (order_date, date_id) or (map_id,order_date,date_id) if you want to use a key to map.
最後,我將 order_id 視為事實表的關鍵。所以我會去
OrdersToFactOrders (order_id,dim_date_id,dim_customer_id,dim_product_id)
在我的例子中,我用 dim_field_id 重命名了市場的欄位,因為我不想在我的表中發生名稱衝突或混淆他們指向的 Id。您的 ETL 必須知道 CustomersToDim_Customers.dim_customer_id 確實映射到 Dim_Customers.customer_id 並且 CustomersToDim_Customers.customer_id 確實映射到 Customers.customer_id。
我也傾向於將 order_number 包含在 OrdersToFactOrders 映射表中,但那是因為我喜歡跟踪數據以用於審計目的。讓我的生活更輕鬆。但是,根據您告訴我的內容,order_number 和 order_id 是一對一的,因此包含 order_number 將是多餘的,並且只有在您有完美主義偏執狂以確保您的數據在雙方都正確時才需要(我真的很喜歡以確保 ETL 完成後 A 側的 A 和 B 側的 B 確實正確。)。