可以在数据仓库维度表上存储事务主键以在事实暗淡之间关联吗?

Posted

技术标签:

【中文标题】可以在数据仓库维度表上存储事务主键以在事实暗淡之间关联吗?【英文标题】:Is it OK to store transactional primary key on data warehouse dimension table to relate between fact-dim? 【发布时间】:2021-08-30 10:48:32 【问题描述】:

我有这样的数据源(postgres 事务系统)(简化,实际表有比这更多的字段):

然后我需要创建一个 ETL 管道,其中所需的报告是这样的:

订单号(来自sales_order_header) 项目名称(来自sales_order_lines) 批处理开始和结束(来自receiving_batches) 已交货数量、已批准接收数量、已拒绝接收数量(来自receiving_inventories

我对事实暗淡表的设计是这样的(简化的)。

我不知道的是最佳 ETL 设计。 下面我们重点来看看如何插入fact,以及fact与dim_sales_orders的关系

如果我有这样的临时表:

ETL 每天运行。 22:00之后就没有收货了,所以我可以在23:00运行ETL。 然后我可以从sales_order_headersales_order_lines 获取数据,所以在23:00,脚本可以运行,有点:

INSERT
    INTO
    staging_sales_orders (
    SELECT
        order_number,
        item_name
    FROM
        sales_order_header soh,
        sales_order_lines sol
    WHERE
        soh.sales_order_id = sol.sales_order_header_id
        and date_trunc('day', sol.created_timestamp) = date_trunc('day', now())
    );

对于事实表,可以在 23:30 运行,带查询

SELECT
    soh.order_number,
    rb.batch_shift_start,
    rb.batch_shift_end,
    sol.item_name,
    ri.delivered_quantity,
    ri.approved_received_quantity,
    ri.rejected_received_quantity
FROM
    receiving_batches rb,
    receiving_inventories ri,
    sales_order_lines sol,
    sales_order_header soh
WHERE
    rb.batch_id = ri.batch_id
    AND ri.sales_order_line_id = sol.sales_order_line_id
    AND sol.sales_order_header_id = soh.sales_order_id
    AND date_trunc('day', sol.created_timestamp) = date_trunc('day', now())

但是如何将数据以最优的方式加载到事实表中,尤其是事实表中呢?

我的方法

    staging_sales_orders 中选择并将它们插入dim_sales_orders,使用自动递增主键。 在插入fact_receiving_inventories 之前,我需要知道dim_sales_order_id。所以在这种情况下,我选择:​​i>
SELECT
    dim_sales_order_id
FROM
    dim_sales_orders dso
WHERE
    order_number = staging_row.order_number
    AND item_name = staging_row.item_name
    然后插入事实表。

现在我怀疑的是第 2 点(从现有的暗淡中选择)。在这里,我根据 2 个 varchar 列进行选择,这应该会影响性能。由于采用标准化形式,我正在考虑修改临时表,在两个临时表上添加sales_order_line_id。因此,在上述第 2 点期间,我可以这样做

SELECT
    dim_sales_order_id
FROM
    dim_sales_orders dso
WHERE
    sales_order_line_id = staging_row.sales_order_line_id

但作为结果,我需要将sales_order_line_id 添加到dim_sales_orders 中,这在教程中并不常见。我的意思是,添加事务表 PK 在技术上是可以完成的,因为我可以访问数据源。但是,添加这样的事务字段(尤其是因为它是 PK)是否是一个好的 DW fact-dim 维度? 还是有其他方法,而不是根据 2 个 varchars 选择现有的 dim?

如何为事实表优化选择维度 id?

谢谢

【问题讨论】:

【参考方案1】:

实际上必须在维度中包含源 PK/BK。

标准流程是加载 Dims,然后加载事实。对于事实负载,您可以将源数据转换为适当的 Dim SK,并使用 PK/BK 查找 Dim

【讨论】:

以上是关于可以在数据仓库维度表上存储事务主键以在事实暗淡之间关联吗?的主要内容,如果未能解决你的问题,请参考以下文章

什么是ODS?还有什么是事实表和维度表啊?希望高手指教~

20190424 数据仓库 维度建模

数据仓库之事实表设计

数据仓库如何将具有外键的事实表连接到主键包含两个属性的维度表

维度与事务数据库?

在另一个事实表中使用退化维度