在数据仓库中,事实表可以包含两个相同的记录吗?

时间:2019-05-06 07:49:16

标签: data-warehouse

如果用户订购了具有两个不同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作为退化维放在事实表中,它应该是选项1 。但是在我们的情况下,我们真的不想保留order_id。

我也曾经读过一篇文章,说过滤掉所有维度后,事实表中应该只有一行数据。如果此说法正确,则选择选项2

有没有我可以参考的原则?

1 个答案:

答案 0 :(得分:0)

从概念上讲,数据仓库中的事实表应按可用的最详细的粒度进行设计。您始终可以将数据从较低的粒度汇总到较高的粒度,反之则不正确-如果您合并记录,则某些信息将永久丢失。如果您以后需要它(即使您现在可能看不到它),您也会后悔这一决定。

我建议采用以下方法:在数据仓库中,将订单号保留为退化尺寸。然后,当您发布星型模式时,您可以构建表的预聚合版本(跳过订单号,将相同记录按日期/小时分组)。这样,您可以在维度模型中使用更小/更干净的事实表,而在DW中保留更详细的数据。