postgresql - 可以在数据仓库维度表上存储事务主键以在事实暗淡之间关联吗?
问题描述
我有这样的数据源(postgres 事务系统)(简化,实际表的字段比这更多):
然后我需要创建一个 ETL 管道,其中所需的报告是这样的:
- 订单号(从
sales_order_header
) - 项目名称(来自
sales_order_lines
) - 批处理开始和结束(从
receiving_batches
) - 已交货数量、已批准接收数量、已拒绝接收数量(来自
receiving_inventories
)
我对事实暗淡表的设计是这样的(简化的)。
我不知道的是最佳 ETL 设计。让我们关注如何插入事实,以及事实与dim_sales_orders
如果我有这样的临时表:
ETL 每天运行。22:00之后就没有收货了,所以我可以在23:00运行ETL。然后我可以从sales_order_header
and获取数据sales_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
. 所以在这种情况下,我选择:
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 选择现有的暗淡?
如何为事实表优化选择维度 ID?
谢谢
解决方案
实际上必须在维度中包含源 PK/BK。
标准流程是加载 Dims,然后加载事实。对于事实负载,您将源数据转换为适当的 Dim SK,并使用 PK/BK 查找 Dims
推荐阅读
- c# - 使用组合框中的包含无法正确过滤列表
- vba - MS Word - 查找带有换行文本的表格行
- abap - 在 SAP GUI 中显示自定义图标
- angular - 将 Angular 的依赖项移动到 devDependencies
- php - 如何在 Laravel 控制器中使用“for 循环”而不是“foreach 循环”?
- angular - BehaviorSubject 为每个订阅发出相同的值
- amazon-web-services - 如果我在 Cloudfront 上启用了 SSL,AWS ALB 是否需要 SSL?
- azure - QnA Maker 在 MS Teams 中部署时不显示按钮
- javascript - 如何在窗口关闭 MSCRM 上将值从 HTML webresource 传递到 javascript
- c++ - 如何在 C++ 中使用 unix 时间格式化 time_t 中的时间/日期字符串