本文介紹了SSIS:模型設計問題導致重復-兩個事實表可以連接嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
對于一個大學小組項目,我們正在使用SQL Server和Visual Studio構建一個數據倉庫。我們目前處于準備區域,希望用數據填充表。
但是,我們注意到,在事實銷售表中,價格加運費值之和與Payment_Value不同,并且值與CSV文件也不同。這就是為什么我們試圖在排序1中額外選中”刪除具有重復排序值的行”框(參見文件)。如果不勾選這個選項,我們最終會得到
最后是117.216行,檢查一下,結果是102.727行。然而,所有這些價值之間仍然存在差異。要更好地了解和了解,請參閱下圖:
我們發現重復是由于每個訂單可能有多個付款,這意味著存在模型設計問題。付款實際上應該是另一個事實數據表,與銷售額分開。
我們試圖為Payment創建一個事實數據表,但是我們不確定如何操作,因為我們認為兩個事實數據表不可能相互連接。您是否可以幫助我們,因為付款應該與銷售相關聯,但是銷售是一個事實表,所以我們不確定如何繼續。
我們面臨的另一個問題是,如果Payment將是一個事實表,我們將丟失一個維度。在我們的指導方針中,我們被要求有5個維度,我們不知道要創建什么其他維度(也可以是虛構的)。如果您對如何解決相關問題有任何建議,我們將非常樂意。
為了更好地理解和洞察,我們向您提供了我們的SQL腳本、平面文件以及Visual Studio數據流:Download files
如有任何幫助,不勝感激!非常提前感謝您!:)
推薦答案
您仍然可以將付款作為維度,以保持在項目的約束范圍內。您可以做一件事來處理訂單和付款之間的多對多關系,這就是所謂的表,因此您的模式將如下所示:
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時刪除付款和訂單之間的合并,并將新數據流從Payments添加到stg_Order_Payments
其他設計注意事項:
付款通常保存在事實數據表中。如果您需要項目約束的更多維度,例如,您可以創建一個郵政編碼表格,這樣您就不必在Customers和Sellers維度中重復城市和州,而只需在表格Zip Codes中使用外鍵。此外,類別也可以是另一個維度,假設將來也有到法語或任何其他語言的翻譯;最好有葡萄牙語的產品類別和一個包含葡萄牙語名稱和所有翻譯的類別表。更好的是,您可以在表Category的產品中創建一個數字類別代碼作為FK。
這篇關于SSIS:模型設計問題導致重復-兩個事實表可以連接嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,