Sql 事实与事实的关系

Sql 事实与事实的关系,sql,sql-server,database,ssas,data-warehouse,Sql,Sql Server,Database,Ssas,Data Warehouse,我有两个事实表: 1.FactPOLine:它有所有的订单行。 2.FactInvoiceLines:它包含所有发票行 发票和采购订单之间存在一对多关系。i、 e.每个发票行只能有一个采购订单行,但一个采购订单行可以有多个发票行 我如何建立这种关系的模型?我认为不建议将两个事实联系起来 谢谢。事实表通过它们的共同维度进行连接以进行分析。例如,FactPOLine和FactInvoiceLines可能都具有以下维度的键: 项目/产品 顾客 供应商 承运人 日期 日期是一种特殊情况,在这种情况下

我有两个事实表: 1.FactPOLine:它有所有的订单行。 2.FactInvoiceLines:它包含所有发票行

发票和采购订单之间存在一对多关系。i、 e.每个发票行只能有一个采购订单行,但一个采购订单行可以有多个发票行

我如何建立这种关系的模型?我认为不建议将两个事实联系起来


谢谢。

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

  • 项目/产品
  • 顾客
  • 供应商
  • 承运人
  • 日期
日期是一种特殊情况,在这种情况下,它们可能是与每行关联的多个日期。但是,如果您可以为每个表减少一个主要日期,这样您就可以按年度、季度和月份进行分析,那么分析就容易多了

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

编辑: 在您的评论中,您注意到业务需要按PO进行分析。如果该公司每年只有少数几个销售点,这可能是有道理的。然而,更可能的情况是,他们有数千、一万或更多,这使得进行详细分析非常困难

我建议问5个为什么,并试图发现他们的目标。i、 e.为什么要按采购订单进行分析?为什么要查看所有数据?为什么你想看到那些未填充的POs


最终,您将获得一些可以添加到报表和数据模型中的硬度量。例如未结采购订单行的标志,或完成百分比的半累加度量。无论他们的目标是什么,你都可能得到他们所需要的,而不是通过PO行得到1000页的报告。

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


根据Wes的回答,这些ID都可以在事实表本身中建模为“退化维度”

您可以在InvoiceLine表中将POLine#与InvoiceLine#连接在一起,以适应必须在这些ID上加入的情况

您甚至可以在POLIne中使用事实表代理键,并在InvoiceLine中将其用作外键。它并不完美,但很实用


Mark是正确的,您通常通过尺寸而不是通过此类ID进行链接,但您所描述的链接类型在需要时可用于尺寸建模。

感谢您的回复。我有这些维度,这两个事实都与之相关。但企业希望根据POs分析发票,因此我们需要POs和发票之间的直接链接。实现这一目标的两种方法。将发票行中的FK添加到采购订单行,或添加此垃圾维度。我应该走哪条路,或者你认为还有另一条路吗?不要以任何方式将FK从一个事实添加到另一个事实。最干净的方法是通过标注将它们链接起来。这也是您的bi工具所期望的,因此它将使用户体验不那么笨重。我会根据你的评论更新我的答案。采购订单编号不适合垃圾维度——它是采购订单行事实上的退化维度。此外,尽管通常通过共同的维度连接,毫无疑问,一个事实中作为退化维度的发票号和另一个事实中作为退化维度的采购订单号是相关的-没有理由阻止加入。澄清一下-垃圾维度是处理低基数标志和文本类别的一种特殊技术。由于PO编号的基数非常高,我认为将PO编号放入维度没有任何好处,而实际上您已经拥有了它。不过,我不会为FK而烦恼——只要把ID放在事实表中,这样人们就可以在需要时加入它们了。@Rich-当然,我的错误是没有对维度进行分类,称之为degrade或mini。最终,这将在SSAS或类似工具中结束,将其放入单个维度的好处是,您可以切割一个字段。在两个表中都有PO和行只允许您按其中一个进行分析。多维将强制您将文本字段放入另一个表中。我建议提前处理这个问题。