【问题标题】:Data warehouse schema: is it OK to directly link fact tables in DWH?数据仓库模式:可以直接链接 DWH 中的事实表吗?
【发布时间】:2019-02-03 07:04:21
【问题描述】:

DWH中可以直接链接事实表吗?

据我了解,在银河模式中,事实表没有链接,它们只是有共同的维度表。但是,如果有假设直接链接它们的 DWH 模式?

【问题讨论】:

    标签: data-warehouse


    【解决方案1】:

    答案是明显的否,根据定义,通过事实表中的外键引用的任何表都是维度表

    另一方面,在 Kimballs 模型中,事实和维度之间没有严格的分界线 - 表格可以根据上下文同时扮演这两种角色。

    例如,包含服务使用情况的表是一个事实表,其维度包括时间位置合约等等。

    合约本身可以建模为事实表,即包含改变合约的交易的表,并具有时间客户等维度评级模型等(你可以称之为渐变维度——但这只是事实表的替代描述)。

    但最重要的是,如果您的模型连接两个“事实”表很好地描述了业务、稳定、易于加载、抗故障并支持高性能报告查询,那么答案是 明显是的,这是正确的模型。

    【讨论】:

      【解决方案2】:

      不,直接链接事实表是不行的。

      首先,如果您正确地为事实表建模,您将无法以有意义的方式链接它们。唯一的例外是具有 1:1 关系的事实表,但问题是 - 也许它们应该从一开始就被建模为一个事实表。

      其次,直接链接事实表违背了维度建模背后的核心思想——模型应该反映底层业务的结构。通常,在维度模型中,事实表代表特定的业务流程,维度代表它们的上下文。这是 OLTP 和维度数据库之间的主要区别 - OLTP 系统经过优化,可以高效可靠地捕获事务,而维度模型经过优化,可以查询数据并从中获得商业意义。混淆这两个概念是错误的。

      【讨论】:

      • 如何累积快照事实,其中事实代表保险索赔之类的东西?有时可能存在与索赔相关的事实,该事实的行为有点像维度?这是我能想到的规则的主要例外(无论如何+1!)
      • 谢谢@Rich!我认为积累快照是一种非常特殊的动物……一方面,它跨越了多个业务流程。另一方面,它本身就是一个独特的业务流程。我仍然试图绕过它。目前,我认为它是一个衍生模型——我首先设计我的基本事实和暗表,然后从它们中积累快照事实。
      【解决方案3】:

      IMO,即使可以,他们也不应该这样做。事实表通常很大,可能有数十亿行,并且以一定的粒度保存度量。

      链接两个或多个事实表可能需要连接数十亿行表,这太昂贵了。

      如果您需要链接不同事实表中的事实(所有维度都是通用的),您最好只进行一次连接,存储结果并改用该结果表。如果这可以在 ETL 级别完成,您可以逐批加入,那就更好了。

      如果您在两个表中连接事实,其中一个维度是另一个维度的超集,您最好将最细粒度的事实聚合到另一个维度并应用上述解决方案。

      如果这两个维度都不是另一个维度的超集,那么您可能需要在一个共同的级别上聚合这两个维度。

      我的立场背后的原因是,我宁愿在存储方面有冗余并避免查询时间计算,而不是让我的用户等待很长时间以使这些连接产生结果。此外,非常大的连接需要大量内存,这通常比存储更昂贵。

      最后,请记住 DWH 通常具有由 ETL 进程加载的数据。它们成批运行,并且可以在每次运行时检查一致性,这与 OLTP 不同,在 OLTP 中,避免多次写入相同数据对于防止不一致至关重要。

      对此有不同的看法,您很可能会对此事有不同的看法。最后,这两种方法都有其优点和缺点,研究两者并选择你最喜欢的一种。

      【讨论】:

        猜你喜欢
        • 2017-07-19
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多