【问题标题】:Need help modeling a fact table需要帮助对事实表进行建模
【发布时间】:2014-12-05 16:59:54
【问题描述】:

我正在将我的第一步转移到数据仓库。

我购买了 Kimball & Ross 的优秀书籍“数据仓库工具包 - 第三版”,它向我解释了如何掌握基本概念。
今天我已经开始设计我的第二个数据集市,但我已经陷入了一个(也许是愚蠢的)问题。假设我正在为一个简单的销售事件建模:一个简单的事实表将是:

DATE_ID | CUSTOMER_ID | PRODUCT_ID | QUANTITY

每个维度都与其他维度存在多对多关系,正如书中和网络中所解释的那样。
接下来,我想添加更多维度,例如运营商:

DATE_ID | CUSTOMER_ID | PRODUCT_ID | CARRIER_ID | QUANTITY

维度仍然是多对多的关系。
现在,我被要求添加很多(可能是十几个或更多)关于交货的细节,比如一堆日期、路线、箱子和托盘的数量、各种标志等,所以我在考虑一个 DELIVERY 维度表.我的第一次尝试是:

DATE_ID | CUSTOMER_ID | PRODUCT_ID | CARRIER_ID | DELIVERY_ID | QUANTITY

但是...令人惊讶的是,事实表现在不再是多对多关系了。所以我想:“好吧,我可以重构它,因为现在其他维度实际上是交付的属性”,但它会变成

DELIVERY_ID | PRODUCT_ID | QUANTITY

我的事实表只有 2 个维度。
现在,在其他情况下,我会将交付视为退化维度,但由于我必须将很多属性与它相关联,所以我不知道该遵循哪条路线:

  • 创建一个 DELIVERY 维度并重构事实表?
  • 将它们放入事实表中?
  • 创建一个 DELIVERY 维度并将 DELIVERY_ID 放入事实表中,假装它只是一个退化维度?

也许在维度和事实之间做出选择并不那么简单

【问题讨论】:

  • 来自 IBM 红皮书的更多免费数据仓库设计资源链接在 this SO answer

标签: database-design data-modeling data-warehouse


【解决方案1】:

正如您所描述的,delivery 是与 sale 相关的单独事件。所以交付应该是一个单独的事实表。

当然,如果您不需要增加的复杂性,您总是可以“投射”(可以这么说)一个维度中的一个事实。例如,假设您只需要了解有关交货的一些简单事实:例如承运人和交货日期。然后您可以在 SALES 中使用 DELIVERY_ID 并将这些信息注册到 DELIVERY 维度中。

但是,如果您必须记录交付的全部复杂性(可能有两个或多个交付相对于一个销售,两个或多个销售相对于一个交付),您需要两个事实表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2012-03-17
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多