【发布时间】:2019-02-03 07:04:21
【问题描述】:
DWH中可以直接链接事实表吗?
据我了解,在银河模式中,事实表没有链接,它们只是有共同的维度表。但是,如果有假设直接链接它们的 DWH 模式?
【问题讨论】:
标签: data-warehouse
DWH中可以直接链接事实表吗?
据我了解,在银河模式中,事实表没有链接,它们只是有共同的维度表。但是,如果有假设直接链接它们的 DWH 模式?
【问题讨论】:
标签: data-warehouse
答案是明显的否,根据定义,通过事实表中的外键引用的任何表都是维度表。
另一方面,在 Kimballs 模型中,事实和维度之间没有严格的分界线 - 表格可以根据上下文同时扮演这两种角色。
例如,包含服务使用情况的表是一个事实表,其维度包括时间、位置、合约等等。
但合约本身可以建模为事实表,即包含改变合约的交易的表,并具有时间、客户等维度、评级模型等(你可以称之为渐变维度——但这只是事实表的替代描述)。
但最重要的是,如果您的模型连接两个“事实”表很好地描述了业务、稳定、易于加载、抗故障并支持高性能报告查询,那么答案是 明显是的,这是正确的模型。
【讨论】:
不,直接链接事实表是不行的。
首先,如果您正确地为事实表建模,您将无法以有意义的方式链接它们。唯一的例外是具有 1:1 关系的事实表,但问题是 - 也许它们应该从一开始就被建模为一个事实表。
其次,直接链接事实表违背了维度建模背后的核心思想——模型应该反映底层业务的结构。通常,在维度模型中,事实表代表特定的业务流程,维度代表它们的上下文。这是 OLTP 和维度数据库之间的主要区别 - OLTP 系统经过优化,可以高效可靠地捕获事务,而维度模型经过优化,可以查询数据并从中获得商业意义。混淆这两个概念是错误的。
【讨论】:
IMO,即使可以,他们也不应该这样做。事实表通常很大,可能有数十亿行,并且以一定的粒度保存度量。
链接两个或多个事实表可能需要连接数十亿行表,这太昂贵了。
如果您需要链接不同事实表中的事实(所有维度都是通用的),您最好只进行一次连接,存储结果并改用该结果表。如果这可以在 ETL 级别完成,您可以逐批加入,那就更好了。
如果您在两个表中连接事实,其中一个维度是另一个维度的超集,您最好将最细粒度的事实聚合到另一个维度并应用上述解决方案。
如果这两个维度都不是另一个维度的超集,那么您可能需要在一个共同的级别上聚合这两个维度。
我的立场背后的原因是,我宁愿在存储方面有冗余并避免查询时间计算,而不是让我的用户等待很长时间以使这些连接产生结果。此外,非常大的连接需要大量内存,这通常比存储更昂贵。
最后,请记住 DWH 通常具有由 ETL 进程加载的数据。它们成批运行,并且可以在每次运行时检查一致性,这与 OLTP 不同,在 OLTP 中,避免多次写入相同数据对于防止不一致至关重要。
对此有不同的看法,您很可能会对此事有不同的看法。最后,这两种方法都有其优点和缺点,研究两者并选择你最喜欢的一种。
【讨论】: