SSIS:导致重复的模型设计问题——可以连接两个事实表吗?

SSIS: Model design issue causing duplications - can two fact tables be connected?

对于大学小组项目,我们正在使用 SQL 服务器和 Visual Studio 构建数据仓库。我们目前在暂存区,想要用数据填充 tables。 但是,我们注意到在我们的事实中销售 table 价格总和 + 运费总和与 payment_value 不同,并且值与 csv 文件不同。这就是为什么我们尝试在排序 1 中额外选中“删除具有重复排序值的行”框(参见文件)。如果不检查该选项,我们最终会得到 最后 117.216 行并检查它,我们最终得到 102.727 行。然而,所有值之间仍然存在差异。为了更好地概述和理解,请参考下图:

我们发现重复是因为每个订单可能有不止一次付款,这意味着存在模型设计问题。付款实际上应该是另一个事实 table,与销售分开。

我们试图为付款创建一个事实 table,但是我们不确定如何去做,因为我们认为不可能将两个事实 table 连接到每个其他。你能不能帮我们解决这个问题,因为付款应该与销售相关联,但是销售是事实table,所以我们不确定如何进行。

我们面临的另一个问题是,如果付款成为事实 table,我们将失去一个维度。在我们的指导方针中,我们需要有 5 个维度,我们不知道要创建什么其他维度(也可以弥补)。如果您对如何解决该相关问题有任何建议,我们将非常高兴。

为了更好地理解和洞察,我们为您提供了我们的 SQL 脚本、平面文件以及 visual studio 数据流:Download files

非常感谢任何帮助!非常感谢您! :)

您仍然可以将付款作为一个维度,以保持在项目的限制范围内。您可以做的一件事是处理订单和付款之间的多对多关系,这就是所谓的 table,因此您的架构将如下所示:

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

其他设计注意事项:

付款最常发生在事实 table 中。如果您需要更多维度来限制项目,例如可以制作邮政编码 table,这样您就不必在客户和卖家维度中重复城市和州,而只需一个外键即可table 邮政编码。类别也可以是另一个维度,假设将来也有法语或任何其他语言的翻译;最好有葡萄牙语的产品类别和带有葡萄牙语名称和所有翻译的类别 table。更好的是,您可以在 table 类别的产品中创建数字类别代码作为 FK。