對于一個大學小組專案,我們正在使用 SQL Server 和 Visual Studio 構建一個資料倉庫。我們目前在暫存區,想用資料填充表格。但是,我們注意到,在我們的事實銷售表中,價格總和 運費總和與 payment_value 不同,并且值與 csv 檔案不同。這就是為什么我們嘗試在排序 1 中額外選中“洗掉具有重復排序值的行”框(參見檔案)。如果不選中該選項,我們最終會得到 117.216 行,而選中它,我們會得到 102.727 行。然而,所有值之間仍然存在差異。為了更好地概述和理解,請參考下圖:

我們發現重復是由于每個訂單可能不止一次付款,這意味著存在模型設計問題。付款實際上應該是另一個事實表,與銷售分開。
我們試圖為支付創建一個事實表,但是我們不知道如何去做,因為我們認為不可能有兩個事實表相互連接。您能否在這里幫助我們,因為付款應該連接到銷售,但是銷售是一個事實表,所以我們不知道如何繼續。
我們面臨的另一個問題是,如果 Payment 將是一個事實表,我們將失去一個維度。在我們的指南中,我們需要有 5 個維度,我們不知道要創建什么其他維度(也可以組成)。如果您對如何解決相關問題有任何建議,我們將非常高興。
為了更好地理解和洞察,我們為您提供了我們的 SQL 腳本、平面檔案以及 Visual Studio 資料流:下載檔案
任何幫助深表感謝!非常感謝您提前!:)
uj5u.com熱心網友回復:
您仍然可以將付款作為一個維度來保持在專案的約束范圍內。要處理訂單和付款之間的多對多關系,您可以做的一件事就是所謂的表,因此您的架構將如下所示:
CREATE DATABASE [OLIST_STORE_STG]
GO
USE [OLIST_STORE_STG]
GO
/* the dimension table for Customers: stg_dim_customer */
CREATE TABLE Stg_Dim_Customer (
BK_Customer_unique NVARCHAR (50) PRIMARY KEY,
Customer_zip_code_prefix INT NOT NULL,
Customer_city NVARCHAR(50) NOT NULL,
Customer_state NVARCHAR(50) NOT NULL,
);
/* Object: The dimension table for products: Stg_Dim_Product */
CREATE TABLE Stg_Dim_Product (
BK_Product NVARCHAR(50) PRIMARY KEY,
Product_category_name_english NVARCHAR(50) NOT NULL,
Product_photos_qty INT NULL,
Product_name_lenght INT NULL,
Product_description_lenght INT NULL,
Product_weight_g INT NULL,
Product_length_cm INT NULL,
Product_height_cm INT NULL,
Product_width_cm INT NULL,
);
/* Object: The dimension table for sellers: Stg_Dim_Sellers */
CREATE TABLE Stg_Dim_Sellers(
BK_Sellers NVARCHAR (50) PRIMARY KEY,
Sellers_zip_code_prefix INT NOT NULL,
Sellers_city NVARCHAR (50) NOT NULL,
Sellers_state NVARCHAR (50) NOT NULL,
);
/* The dimension table for sellers: Stg_Dim_Payment */
CREATE TABLE Stg_Dim_Payment(
BK_Payment INT PRIMARY KEY,
Payment_sequential INT NOT NULL,
Payment_type NVARCHAR (50) NOT NULL,
Payment_installments INT NOT NULL
);
/* The dimension table for Date: Stg_Dim_Date */
CREATE TABLE Stg_Dim_Date(
SK_Date INT PRIMARY KEY,
Full_date DATE NOT NULL,
Day_number INT NOT NULL,
Day_name NVARCHAR (20) NOT NULL,
Month_number INT NOT NULL,
Month_name NVARCHAR (50) NOT NULL,
Trimester_number INT NOT NULL,
Trimester_name NVARCHAR (50) NOT NULL,
Year INT NOT NULL
);
/* The Facts Table for Sales: Stg_Fact_Sales */
CREATE TABLE Stg_Fact_Sales (
FK_Date DATE ,
FK_Product NVARCHAR(50) ,
FK_Sellers NVARCHAR(50),
FK_Customer_unique NVARCHAR(50) ,
Delays INT NULL,
Price DECIMAL(18, 2) NOT NULL,
Freight_value DECIMAL(18, 2) NOT NULL,
Payment_value DECIMAL (18,2) NOT NULL,
Order_status NVARCHAR(50) NOT NULL,
Order_reference NVARCHAR (50) NOT NULL,
Order_item_reference INT NOT NULL,
CONSTRAINT pk_Fact_Sales PRIMARY KEY (
Order_reference ASC,
Order_item_reference ASC
)
);
/* The Facts Table for Reviews: Stg_Fact_Reviews */
CREATE TABLE Stg_Fact_Reviews (
FK_Date DATE NOT NULL,
FK_Customer_unique NVARCHAR(50) NOT NULL,
Average_review_score DECIMAL(18,2) NOT NULL,
CONSTRAINT pk_Fact_Reviews PRIMARY KEY (
FK_Date ASC,
FK_Customer_unique ASC
)
);
/* Bridge table to relate orders to payments */
CREATE TABLE Stg_Order_Payments (
FK_Order_reference NVARCHAR (50),
FK_Payment NVARCHAR (50)
);
當然,這將需要在 SSIS 包中體現:在生成 fact_sales 時洗掉付款和訂單之間的合并,并添加一個從付款到 stg_order_payments 的新資料流
其他設計考慮:
付款最常保存在事實表中。如果您需要更多維度來約束專案,例如可以制作一個郵政編碼表,這樣您就不必在客戶和賣家維度中重復城市和州,而只需一個表郵政編碼的外鍵。類別也可能是另一個維度,假設將來還有法語或任何其他語言的翻譯;最好有葡萄牙語的產品類別和帶有葡萄牙語名稱和所有翻譯的類別表。更好的是,您可以將數字類別代碼作為產品中的 FK 創建到表類別中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404979.html
標籤:
上一篇:如何從SSIS中的GoogleAnalytics獲取目標名稱或目標ID?
下一篇:Unity中的超出范圍例外
