【发布时间】:2023-03-22 08:43:01
【问题描述】:
在服装店的星型模式中,有一个交易事实来捕获所有购买的东西。这通常具有通常的日期、时间、金额维度,但也会有一个人来表明谁购买了它。在某些情况下,您可以让多个人参与同一笔交易。如果外键在 Fact 表上并因此只能指向一个人,那么如何建模?
【问题讨论】:
标签: sql data-warehouse star-schema
在服装店的星型模式中,有一个交易事实来捕获所有购买的东西。这通常具有通常的日期、时间、金额维度,但也会有一个人来表明谁购买了它。在某些情况下,您可以让多个人参与同一笔交易。如果外键在 Fact 表上并因此只能指向一个人,那么如何建模?
【问题讨论】:
标签: sql data-warehouse star-schema
维度建模的标准技术是使用“桥”表。 您会发现典型的例子是拥有账户(或交易)的客户群,以及在医院就诊时有多项诊断的患者。
在您的情况下,这可能如下所示:
表:FactTransaction
PersonGroupKey表:BridgePersonGroup
PersonGroupKeyPersonKey表: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 表的基础知识,但您可以根据自己的情况考虑修改!
【讨论】:
您需要一个连接表TransactionPerson(或类似的东西),其中Person 到TransactionPerson 是1:M 关系,然后TransactionPerson 到Transaction 是M:1 关系。
这样您就可以让多个人间接与一笔交易相关。
【讨论】:
我建议将 Bridge 表与您的事务表和人员表结合使用。例如:
表:fact_transaction
transaction_id(主键)transaction_person_id(外键)表:bridge_transaction_person
transaction_person_idperson_id表:dim_person
person_id(主键)【讨论】: