事实关系

时间:2017-03-07 13:09:38

标签: sql sql-server database ssas data-warehouse

我有两个事实表: 1. FactPOLine:它拥有所有PO线。 2. FactInvoiceLines:它包含所有发票行。

发票和邮政之间存在一对多的关系。即每个发票行只能有一个po行,但是po行可以有多个发票行。

我如何建立这种关系?我认为不建议联系两个事实。

谢谢。

3 个答案:

答案 0 :(得分:2)

事实表通过它们共同的维度连接在一起进行分析。例如,FactPOLine和FactInvoiceLines可能都具有以下维度的键:

  • 项目/产品
  • 客户
  • 供应商
  • 载体
  • 日期

日期是一种特殊情况,其中可能是与每一行相关联的多个日期。但是,如果您可以按每个表的一个主要日期减少,则可以使分析更加容易,以便您可以按年,季度,月分析。

最后,添加垃圾维度以保存po数字和行并将两个表链接到它可能很有用。在这种情况下,用户可以通过PO进行分析。这对于更多操作类型报告很有用。

修改 在您的评论中,您注意到企业希望通过PO进行分析。如果公司每年只有少数PO,这可能是有道理的。然而,更有可能的是,它们有数千,数万或更多,这使得进行详细分析变得非常笨拙。

我建议询问5个为什么,并试图发现他们的目标。即为什么要通过PO进行分析?为什么要查看所有数据?为什么你想看到那些未填充的PO? ...

最终,您将获得一些可以添加到报告和数据模型的强硬措施。像开放PO线的旗帜,或完成%的半加成措施。无论他们追求什么,你都可以得到他们所需要的,而不是PO行的1000页报告。

答案 1 :(得分:2)

我认为这将被称为退化维度。完美的例子是采购订单或发票编号。除PO#外,所有po属性都与其他维度相关联。这些数字感觉像维度属性,但在事件发生之前它们不存在。它们属于事实表,但将用于创建包含单个属性的新维度。所有其他属性仍将存在于其他分析维度中。

http://www.kimballgroup.com/2003/01/fact-tables-and-dimension-tables/

http://www.kimballgroup.com/2003/06/design-tip-46-another-look-at-degenerate-dimensions/

http://www.kimballgroup.com/2007/10/design-tip-95-patterns-to-avoid-when-modeling-headerline-item-transactions/

答案 2 :(得分:0)

这些ID都可以建模为'退化维度'根据Wes的答案,在事实表中。

对于必须加入这些ID的情况,您可以在InvoiceLine表中将InvineLine#旁边的POLine#与plon一起发送。

你甚至可以在POLIne中使用一个事实表代理键,你可以在InvoiceLine中使用它作为外键。它并不完美,但实用。

标记是正确的,您通常通过维度而不是通过此类ID进行链接,但您描述的链接类型在需要时可以在维度建模中使用。