【问题标题】:How to store data in fact table with multiple products in an order in data warehouse如何在数据仓库中按订单将数据存储在具有多个产品的事实表中
【发布时间】:2016-06-12 05:14:29
【问题描述】:

我正在尝试为我的一个项目(销售订单)设计数据仓库的维度建模。我是这个概念的新手。

到目前为止,我可以理解产品,客户和日期可以存储在维度表中,订单信息将存储在事实表中。

Date_dimension 表结构将是

date_dim_id, date, week_number, month_number

Product_dimension 表结构将是

product_dim_id, product_name, desc, sku

Order_fact 表结构将是

order_id, product_dim_id(fk), date_dim_id(fk), order_quantity, order_total_price, etc

如果一个订单有2个或更多的产品,order_fact 表中是否会重复输入相同的order_id, date_dim_id

请帮忙。我在这里很困惑。我知道在关系数据库中,order table 每个订单都会有一个条目,并且产品和订单之间的关系将保存在以 order_id 和 product_id 作为外键的不同表中。

提前致谢。

【问题讨论】:

  • 您想从订单头表中保存哪些信息?您在订单级别详细信息中创建一个事实,然后制定如何保存订单标题信息。例如,客户仅出现在源系统的标题中,但在您的订单事实表中,它将针对所有单个产品订单重复出现。这没有问题。唯一的挑战是当您在标题上显示总购物金额时 - 您不能在多个产品记录中重复此操作。
  • 有两种主要的解决方法: 1. 按记录数划分运费,并将其分布在所有记录中; 2.添加另一条记录,假装运输是产品。无论您做什么,您都需要保留原始订单号,以便您可以衡量“每个订单的平均销售额”和“每个订单的平均产品”等内容。无论如何,这个标题/细节维度建模在互联网上被讨论得令人作呕。你为什么不做一些研究并提出一个具体的问题。
  • 您可能应该使用订单行项目作为事实表的粒度

标签: data-warehouse dimensional-modeling fact-table


【解决方案1】:

这是一个经典案例,您应该(可能)有两个事实表 FactOrderHeader 和 FactOrderDetail。

FactOrderHeader 将记录每个订单,存储有关订单价值和任何订单级别折扣的信息;尽管在某些情况下它们可以表示为 OrderDetail 记录。

FactOrderDetail 将记录每个订单行,存储有关产品、产品成本、产品销售价格、商品数量、商品折扣的信息。等等

如果您要存储非事实信息,例如订单的获取、交付、付款日期,您可能还需要一个 DimOrderHeader。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多