【问题标题】:In data warehouse, can fact table contain two same records?在数据仓库中,事实表可以包含两条相同的记录吗?
【发布时间】:2019-05-06 07:49:15
【问题描述】:

如果用户使用两个不同的 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 将是选择。

有什么原则可以参考吗?

【问题讨论】:

    标签: data-warehouse


    【解决方案1】:

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

    我会推荐以下方法:在数据仓库中,将订单号保留为退化维度。然后,当您发布星型模式时,您可能会构建表的预聚合版本(跳过订单号,按日期/小时对相同的记录进行分组)。这样,您可以在维度模型中拥有更小/更清晰的事实表,同时在 DW 中保留更详细的数据。

    【讨论】:

    • 谢谢,publish a star schemapre-aggregate version of the table 是什么意思?我正在设计的数据仓库将是我们 BI 和报表系统的唯一数据源。
    • 终端工具(报告系统)不应直接访问数据仓库表。相反,内容的子集被具体化(复制)到专用服务器、数据库或至少一个模式,然后 BI 工具可以访问这些模式。在此过程中,您可以创建相同数据的多个版本(例如,相同的记录按小时分组)。有些人通过视图/SQL 查询提供数据访问,但保存静态的一次性副本是一种更加可靠和方便的设计。
    • 你说的是数据集市?抱歉,我对数据仓库领域很陌生。我要问一些基本的/。
    • @RADO 谢谢,我刚刚阅读了数据仓库工具包,我的许多疑问都清楚了。另一个问题是,这种建模方法不再流行了吗?因为通过搜索,感觉最近一两年关于维度建模的讨论越来越少了。
    • 我会避免从有限的研究中得出深刻的结论。如果您想做出合理的判断,请参加 BI 专家讨论趋势和最新发展的会议或其他相关活动。总的来说,我认为情况正好相反——Power BI、Tableau、Qlick 等交互式 BI 工具正在快速增长,它们都需要适当的维度模型。
    猜你喜欢
    • 2019-05-12
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多