事实表变化

问题描述:

背景事实表变化

我试图创建一个销售事实表。 每一行代表客户订单中的产品。 在其他领域,我有这3个具体领域:

  • purchasing_price
  • selling_price
  • 保证金

问题

在我们公司,当我们销售产品时,我并不确切知道购买价格,因为我将在稍后支付此产品,并且购买价格将根据付款日期的汇率计算。 我通常知道订单日期后1周到2个月之间的实际购买价格。 事实上,我们公司得到了一项安排,允许我们在从我们的供应商收到产品的那个月的每个月的第15个月开始支付给我们的供应商。 由于我们在不同的国家有供应商,所以汇率会引起一些问题。

结果AWAITING

我不得不产生2个月报表和1个年度报告: - 15日的1份报告 - 基于订单日期的汇率 在每个月的1日的1份报告根据付款日期的汇率(即当前日期的汇率,因为我们每个月15日向供应商支付) - 根据付款日期的汇率计算的1份年度报告有时会在订单日期后2个月)

示例

  1. 我在7月3日订购产品。
  2. 此产品仅在8月7日发货
  3. 然后我会根据此日期的汇率在9月15日支付产品。

SOLUTIONS

到目前为止,我只找到3解决方法:

  1. 一)建立在事实表1行和2场:real_purchasing_price(这将是平等的到0)和temporary_purchasing_price(它将自动等于基于订单日期的汇率的购买价格)。 b)一旦我支付了产品,我知道正确的汇率,因此我可以根据付款的汇率更新此行,以满足real_purchasing_price的购买价格。

  2. a)基于订单日期的汇率在事实表中创建1行purchasing_price。 b)一旦我支付了产品,我知道正确的汇率,因此我可以在事实表中创建一个与第一个行几乎相似的新行,但这次是基于支付日期的汇率purchasing_price

  3. 一)建立在事实表中的一行基于订单日期 二)一旦我支付的产品,我知道正确的汇率,因此我可以更新该行并替换的汇率purchasing_pricepurchasing_price由正确汇率的基础上。

第4种解决方案属于你。

Thx寻求帮助。 不要犹豫,问我更多的细节。

有一个好的一天,

+0

我认为你应该添加一个真/假的列(或值0,1)来检查完成你的订单 –

+0

好的thx,所以我应该添加此列只有当我选择解决方案2)对不对? – seeusoon

+0

是的。让我们试试:) –

看来你为了经历了三个阶段:

  • 下令

  • 交付

  • 收购价格被称为

一个数据仓库设计方法是不变性(只能插入,不作更新)。

这种做法将导致建立三个事实记录的订单

指示事件

与属性

orderId, productId, orderDate and sellingPrice 

传递的事件

orderId, DeliveryDate, 

请注意,订单和交货记录与OrderId唯一相关(在简化的假设下,每个订单只有一个产品)。

这两个事件都存储在单独的事实表中或存储在一个共同的事件表中 - 这取决于您的完整属性定义。

收购价格被储存在一个单独的表与前一个月的有效性间隔属性

productId, entryDate, validFromDate, ValidToDate, purchasingPrice 

表是基于以下月(entryDate)15日你的规则填补。

此表的关键角色是支持使用productId和validDate的查询,并返回采购价格或未知

在此基础上设计可能会设置一个访问视图(简单视图,物化视图或其它溶液)提供的订单的当前状态

orderId, productId, orderDate, sellingPrice, 
DeliveryDate, -- NULL if not delivered 
purchasingDate, 
purchasingStaus -- 1 purchased, 0 - not yet purchased 
purchasingPrice 

purchasingDate是基于交货日期基础计算关于业务规则。 purchasingStatus是比较报告日期和购买日期的结果。

purchasingPrice是估计产品的最后已知价格或正确的购买价格。

您可能还会问为什么不变性在数据仓库设计中很重要。 它与OLTP中的事务概念类似。在麻烦您可能回滚数据到过去的某个点使用审计维并重新加载它。如果你更新这个更复杂。

小例子

在15.2。你得到的价格购买产品A在一月

产品A对1.3购进价格表

entryDate = 15.2. 
validFrom = 1.1. 
validTo = 31.1. 
purchacingPrice = 100 

订单。创建于订单事件表记录

orderDate = 1.3. 
sellingPrice = 200 
... 

您可能会报告“最后一个已知purchacing价格”,这是目前100 此事件(查找购买价格表orderDate存储没有给出有效的结果,最后存储的值被返回)

交付10.3。创建于交付事件表中的记录

deliveryDate = 10.3. 
.... 

确切的收购价格仍是未知数(购买价格表deliveryDate没有给出有效的结果查找,返回上次存储的值)

在15.4 。在3月的采购价格表中输入新的采购价格。 从这一点看,真正的购买价格是已知的。

+0

谢谢@Marmite轰炸机这个完整的答案。 我得到了最后一个问题: 关于价格,我不明白,让我们说我有估计一排_italic_last知道product_italic_ – seeusoon

+0

答案上面已被切断对不起的价格 谢谢@Marmite轰炸机这个完整回答。 只是为了确定我非常了解您的解决方案。您是否同意接下来的内容 1)假设我在product_italic_的估计_italic_last知道价格后添加一行,然后我将实现值为0的字段purchaseStatus。 2)一旦我知道了实际购买价格,我将添加一个新的一排与真正的采购价格,我会填补现场purchaseStatus与1 是 - 它是正确的?这样确实没有更新:) – seeusoon

+0

@seeusoon正确,我添加了一个例子,使其更清晰。 –

我假设购买价格,你有被固定的和及部件另一个是变化的,取决于汇率。 (说p * x其中x是汇率)

我会建议创建一个新的事实表,说exchange_rates与不同国家的汇率和时间戳。现在,您的事实表中的purchasing_price列应该是该国家的exchange_rates表的连接结果。

可以说current_values列保持汇率。

EXCHANGE_RATES 
    +-------------+---------------+---------------+-----------+ 
    | EXCHANGE_ID | EXCHANGE_NAME | CURRENT_VALUE | TIMESTAMP | 
    +-------------+---------------+---------------+-----------+ 
    |   1 | JAPAN   |   100 | 20151021 | 
    +-------------+---------------+---------------+-----------+  

在填充购进价格,使用来自EXCHANGE_RATES这个值来获得正确的价值观。

ORDER_DETAIL_FACT  
    +----------+---------+------------------+---------------+--------+ 
    | ORDER_ID | PRODUCT | PURCHASING_PRICE | SELLING_PRICE | MARGIN | 
    +----------+---------+------------------+---------------+--------+ 
    |  101 |  11 | 50*100   |   6000 | 1000 | 
    +----------+---------+------------------+---------------+--------+ 

让我知道你是否需要帮助其实施。

+0

Thx,当然我明白你的观点。但是,只有当我在事实表中添加行的同时具有正确的汇率时,您的解决方案才有效。 我的问题是,我将在当时支付可能在一个月内购买的产品时获得正确的汇率。 告诉我,如果它不够清楚 – seeusoon

+0

所以我不知道我是否应该添加一个正确的汇率新行或我是否应该用正确的汇率更新我的上一行或者如果有适当的解决方案。我认为所有的电子商务公司在他们的数据仓库中都面临同样的问题。 – seeusoon

+0

根据交易所current_value的最新值,您的表格将具有“采购价格”。一旦更新,您可以触发对“ORDER_DETAIL_FACT”的更改以反映正确的“PURCHASING_PRICE”值 – Utsav

我实际上选择使用货币表并添加字段payment_date,该字段允许我将货币表中的正确兑换率与事实表的每一行进行匹配。

不过,我必须更新事实表的每一行,以便在知道它时添加payment_date。

到目前为止我找不到更好的解决方案。

Thx everyone。

+0

我这是一个很好的方向。请参阅我的(对不起,迟到)答案的更新说明。 –