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。
相关文章