首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据建模设计

数据建模设计
EN

Stack Overflow用户
提问于 2019-01-07 05:07:56
回答 2查看 90关注 0票数 1

目前,我正在阅读Kimball的数据仓库书,同时,我正在考虑为以下示例设计一个数据仓库:

1:客户可以购买产品,这将生成发票,然后将生成库存行。注:库存行是一个累加表,即,如果他们订购数量为5的产品A,然后再订购5,则将有2个发票行和一个10个单位的库存行。

因此,基于所描述的场景,以下设计将是合适的: 1.客户维度2.产品维度3.日期维度3.发票事实4.库存事实

现在,假设我想找出像1这样的问题的答案。哪些客户目前的库存为零,但在过去3个月内生成了发票。还会有其他类似的问题。2.哪些客户有产品A但没有产品B

根据金波尔斯的书,似乎需要在两个事实表之间进行某种连接,比如子集?

这似乎相当低效,特别是两个事实表之间记录的绝对大小。这是正确的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-01-07 11:39:01

哪些客户目前的库存为零,但在过去3个月内生成了发票。

代码语言:javascript
复制
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)
    )

哪些客户有产品A但没有产品B

代码语言:javascript
复制
SELECT C.* 
FROM DimClient C
WHERE EXISTS (
  SELECT * FROM FactInvoice I 
  WHERE C.ClientKey = I.ClientKey
  AND I.ProductID IN (1,2,3)
  )
AND NOT EXISTS (
  SELECT * FROM FactInvoice I 
  WHERE C.ClientKey = I.ClientKey
  AND I.ProductID NOT IN (4,5,6)
  )

这些查询是低效的吗?与对源系统运行相同的查询相比,效率并不低

实际上,您的源系统可能需要更多的表、更多的连接,并且可能需要更少的索引

星型模式的基础之一是它们针对分析进行了优化。

票数 1
EN

Stack Overflow用户

发布于 2019-01-07 05:45:36

根据金博尔的说法,这似乎是构建drilling-across的正确方法。他提到,为了正确地工作,应该将其设置为使用hereexplained here定义的一致维度。不过,我不能说在这种情况下会有多高的效率/低效率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54065957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档