如何设计交货数据的事实表

时间:2020-03-06 14:53:15  来源:igfitidea点击:

我正在建立一个数据仓库,其中包括餐馆的送货信息。数据存储在SQL Server 2005中,然后放入SQL Server Analysis Services 2005多维数据集中。

交货信息包括以下表格:

事实交付

  • 分支键
  • DeliveryDateKey
  • 产品密钥
  • InvoiceNumber(DD:简并尺寸)
  • 数量
  • 单位成本
  • 线成本

笔记:

  • FactDeliveres的粒度是发票上的每一行
  • 产品维度包括供应商信息

问题是:事实表没有主键。主键应该是可以唯一标识每次交货的添加键以及ProductKey。但是我无法唯一标识交货。

在源OLTP数据库中,有一个DeliveryID对于每个传递都是唯一的,但是对于用户而言,这是一个内部ID。 InvoiceNumber是供应商的发票编号-手动输入该编号,因此我们得到重复的编号。

在多维数据集中,我仅基于FactDeliveres中的InvoiceNumber字段创建了一个维度。这确实意味着,当我们按InvoiceNumber分组时,我们可能会合并两个交货,因为它们(错误地)具有相同的InvoiceNumber。

我觉得我需要包括DeliveryID(称为DeliveryKey),但是我不确定如何。

我也是:

  • 使用它作为InvoiceNumber维的基础键吗?
  • 创建一个DimDelivery,它在每次有新交付时都会增长?这可能意味着某些属性来自FactDeliveries,并进入DimDelivery,例如DeliveryDate,Supplier,InvoiceNumber。

毕竟,我只想问你:当我的源数据库中包含以下信息时,如何创建一个Deliveries多维数据集

交货头

  • DeliveryID(PK)
  • 邮寄日期
  • 供应商编号(FK)
  • InvoiceNumber(手动输入)

交货细节

  • DeliveryID(PK)
  • 产品编号(PK)
  • 数量
  • 单位成本

解决方案

我将在事实表中包含数量,单位代码,发票编号,交货编号。 InvoiceNumber和DeliveryID都是简并维度,因为它们会随每个事实(或者很少的事实)而变化。如果每个订单上都有大量物品,则可以按它们自己的尺寸放置它们。如果发票上有多次交货,则下面的模型可能不是100%正确的,但是它将很接近。查看Kimball,他可能有一个针对此业务场景的星型架构示例。

Fact table:
OrderDateID (not in your model, but probably should be, date dimension in a role)
DeliveryDateID (date dimension in a role)
SupplierID (supplier dimension surrogate key)
InvoiceID (invoice dimension surrogate key)
ProductID (product dimension surrogate key)
Quantity (fact)
UnitCost (fact)
InvoiceNumber (optional)
DeliveryID (optional)

以及通常的日期维度表和以下维度:

Supplier Dim:
SupplierID (surrogate)
SupplierCode and data

Invoice Dim:
InvoiceID (surrogate)
InvoiceNumber (optional)
DeliveryID (optional)

Product Dim:
ProductID (surrogate)
ProductCode and Data

永远记住,(星型架构)数据仓库根本不会像OLTP数据那样结构化,而只是事实和描述这些事实的维度。

事实表PK几乎总是代理键。每个事实都是多个维度的一部分,因此事实具有维度的FK,但没有真正的密钥。

交货事实(行项目)属于分支机构,它具有产品,它是较大的交货的一部分,它发生在特定的日期。听起来像是4个独立的维度。

交货维度具有其自己的PK,并且具有发票编号的维度属性。也许还有整个交付的其他属性。

每个交货行项目事实都与一个交货以及该交货的发票编号相关联。