在数据仓库中,事实table可以包含两条相同的记录吗?
In data warehouse, can fact table contain two same records?
如果用户用两种不同的方式订购相同的产品order_id;
订单是在相同的日期-小时粒度内创建的,例如
order#1 2019-05-05 17:23:21
order#2 2019-05-05 17:33:21
在数据仓库中,我们是否应该像这样将它们分成两行(选项1):
| id | user_key | product_key | date_key | time_key | price | quantity |
|-----|----------|-------------|----------|----------|-------|----------|
| 001 | 1111 | 22 | 123 | 456 | 10 | 1 |
| 002 | 1111 | 22 | 123 | 456 | 10 | 2 |
或者将它们与合计数量排成一行(选项 2):
| id | user_key | product_key | date_key | time_key | price | quantity |
|-----|----------|-------------|----------|----------|-------|----------|
| 001 | 1111 | 22 | 123 | 456 | 10 | 3 |
我知道如果把order_id
作为退化维度放在事实table中,应该是选项1。但在我们的例子中,我们真的不想保留 order_id.
我也曾经看过一篇文章,说过滤掉所有维度后,事实中应该只有一行数据table。如果这个陈述是正确的,选项 2 将是选择。
有什么原则可以参考吗?
从概念上讲,数据仓库中的事实 table 应该按照可用的最详细粒度进行设计。您始终可以将数据从较低粒度聚合到较高粒度,反之则不然——如果您合并记录,一些信息将永久丢失。如果您以后需要它(即使您现在可能看不到它),您会后悔这个决定。
我推荐以下方法:在数据仓库中,将订单号保留为退化维度。然后,当您发布星型模式时,您可能会构建 table 的预聚合版本(跳过订单号,按 date/hour 对相同记录进行分组)。这样,您可以在维度模型中包含 smaller/cleaner 个事实 table,同时在 DW 中保留更详细的数据。
如果用户用两种不同的方式订购相同的产品order_id; 订单是在相同的日期-小时粒度内创建的,例如
order#1 2019-05-05 17:23:21
order#2 2019-05-05 17:33:21
在数据仓库中,我们是否应该像这样将它们分成两行(选项1):
| id | user_key | product_key | date_key | time_key | price | quantity |
|-----|----------|-------------|----------|----------|-------|----------|
| 001 | 1111 | 22 | 123 | 456 | 10 | 1 |
| 002 | 1111 | 22 | 123 | 456 | 10 | 2 |
或者将它们与合计数量排成一行(选项 2):
| id | user_key | product_key | date_key | time_key | price | quantity |
|-----|----------|-------------|----------|----------|-------|----------|
| 001 | 1111 | 22 | 123 | 456 | 10 | 3 |
我知道如果把order_id
作为退化维度放在事实table中,应该是选项1。但在我们的例子中,我们真的不想保留 order_id.
我也曾经看过一篇文章,说过滤掉所有维度后,事实中应该只有一行数据table。如果这个陈述是正确的,选项 2 将是选择。
有什么原则可以参考吗?
从概念上讲,数据仓库中的事实 table 应该按照可用的最详细粒度进行设计。您始终可以将数据从较低粒度聚合到较高粒度,反之则不然——如果您合并记录,一些信息将永久丢失。如果您以后需要它(即使您现在可能看不到它),您会后悔这个决定。
我推荐以下方法:在数据仓库中,将订单号保留为退化维度。然后,当您发布星型模式时,您可能会构建 table 的预聚合版本(跳过订单号,按 date/hour 对相同记录进行分组)。这样,您可以在维度模型中包含 smaller/cleaner 个事实 table,同时在 DW 中保留更详细的数据。