如果用户订购了具有两个不同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 。
有没有我可以参考的原则?
答案 0 :(得分:0)
从概念上讲,数据仓库中的事实表应按可用的最详细的粒度进行设计。您始终可以将数据从较低的粒度汇总到较高的粒度,反之则不正确-如果您合并记录,则某些信息将永久丢失。如果您以后需要它(即使您现在可能看不到它),您也会后悔这一决定。
我建议采用以下方法:在数据仓库中,将订单号保留为退化尺寸。然后,当您发布星型模式时,您可以构建表的预聚合版本(跳过订单号,将相同记录按日期/小时分组)。这样,您可以在维度模型中使用更小/更干净的事实表,而在DW中保留更详细的数据。