我现在正在阅读Kimball的数据仓库书,同时,我正在为以下示例设计数据仓库:
1:客户可以购买会产生发票的产品,然后产生发票行。注意:库存行是一个累积表,即,如果他们订购数量为5的产品A,然后再订购5,则会有2条发票行和一个10行的库存行。
因此,根据描述的方案,以下设计将是适当的: 1.客户规模 2.产品尺寸 3.日期维度 3.发票事实 4.库存事实
现在,假设我想找出诸如以下问题的答案 1.当前哪些客户的库存为零,但最近3个月内已生成发票。同样会有其他类似的问题。 2.哪些客户拥有产品A但没有产品B
根据Kimballs的书,似乎两个事实表之间需要某种连接,例如一个子集?
这似乎效率很低,尤其是两个事实表之间记录的绝对大小。这是正确的方法吗?
答案 0 :(得分:1)
哪些客户目前的库存为零,但在最近3个月内已生成发票。
test('Async function', async () => {
expect.assertions(1);
const result = await ContainerGlobals.getResponseFromURL(); // let the Promise resolve
const data = result.getStatus(); // call getStatus on the result
expect(data).toBe(207); // SUCCESS
});
哪些客户拥有产品A但没有产品B
SELECT C.*
FROM DimClient C
WHERE EXISTS (
SELECT * FROM FactInvoice I
WHERE C.ClientKey = I.ClientKey
AND InvoiceDate >= DATEADD(m,GetDate(),-3)
)
AND NOT EXISTS (
SELECT * FROM FactInventory V
WHERE InventoryLevel > 0
AND V.ClientKey = C.ClientKey
AND (Maybe a predicate to limit to current inventory only)
)
这些查询效率低下吗?没有比在源系统上运行相同查询的效率低
实际上,您的源系统可能需要更多的表,更多的连接,并且索引可能更少
星型模式的基础之一是针对分析进行了优化。
答案 1 :(得分:0)
Kimball认为这似乎是构建drilling-across的正确方法。他提到要使其正常工作,应将其设置为使用定义为here和explained here的一致尺寸。 我无法说出这种情况下的效率/低效率。