【问题标题】:What if your fact has multiple instances of the dimension?如果您的事实有多个维度实例怎么办?
【发布时间】:2023-03-22 08:43:01
【问题描述】:

在服装店的星型模式中,有一个交易事实来捕获所有购买的东西。这通常具有通常的日期、时间、金额维度,但也会有一个人来表明谁购买了它。在某些情况下,您可以让多个人参与同一笔交易。如果外键在 Fact 表上并因此只能指向一个人,那么如何建模?

【问题讨论】:

    标签: sql data-warehouse star-schema


    【解决方案1】:

    维度建模的标准技术是使用“桥”表。 您会发现典型的例子是拥有账户(或交易)的客户群,以及在医院就诊时有多项诊断的患者。

    在您的情况下,这可能如下所示:

    表:FactTransaction

    • PersonGroupKey
    • 其他 FactTableColumns

    表:BridgePersonGroup

    • PersonGroupKey
    • PersonKey

    表:DimPerson

    • PersonKey
    • 其他人列

    为每一组人创建一个新的 PersonGroupKey 并最终得到如下行:

    PersonGroupKey 1, PersonKey 5
    PersonGroupKey 1, PersonKey 3
    PersonGroupKey 2, PersonKey 1
    PersonGroupKey 3, PersonKey 6
    

    PersonGroupKey 然后代表 Fact 中的人群。

    从逻辑上讲,应该还有一个表 DimPersonGroup,它只列出 PersonGroupKeys,但大多数数据库不需要这个,所以 Kimball 建模师通常会取消它。

    这是 Bridge 表的基础知识,但您可以根据自己的情况考虑修改!

    【讨论】:

    • 除了命名之外,这与我之前发布的答案有何不同?
    • 您昨天的回答在桥接表中有一个事务 ID。我认为值得发布我自己的答案而不是需要您编辑您的答案
    • 很公平,你值得被投赞成票 ;-) 我在更正后投了反对票,不太清楚为什么
    【解决方案2】:

    您需要一个连接表TransactionPerson(或类似的东西),其中PersonTransactionPerson 是1:M 关系,然后TransactionPersonTransaction 是M:1 关系。

    这样您就可以让多个人间接与一笔交易相关。

    【讨论】:

    • 这是有道理的。你有没有显示这种方法的链接,通常我发现的东西在事实和维度之间没有连接表。
    • @MoreThanFive 连接表(也称为映射表)是将多对多 (M:M) 关系规范化为两个一对多 (1:M) 关系的非常常见的解决方案。这种规范化的一个副产品是一个额外的连接表。如果你用谷歌搜索如何规范多对多,几乎所有东西都应该指向这种方法。
    【解决方案3】:

    我建议将 Bridge 表与您的事务表和人员表结合使用。例如:

    表:fact_transaction

    • transaction_id(主键)
    • transaction_person_id(外键)
    • ...

    表:bridge_transaction_person

    • transaction_person_id
    • person_id

    表:dim_person

    • person_id(主键)
    • ...

    【讨论】:

    • 维度建模中的标准桥接表不依赖于桥接表中有关事实的信息(即没有事务 ID)。相反,桥接表将代表人群,而事实表将有一个外键。
    • @Rich 好吧,我不是桥牌专家,在这种情况下,我将删除我的最后一条评论并调整解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多