似乎根据我的研究,"最佳实践"建议事实表中的一行将包含一个由所有维度度量组成的复合键:例如,如果我在事实表中的度量是" sales"我有四个维度:"位置,销售人员,买家人数,销售额数量"那么,我的复合键将由这4个维度的唯一值组成。但这会引起严重的问题:如果我有两个具有独特维度的措施,该怎么办?
--Example: Fact table row:
Sales Amount: $100, location: US, salesperson: Bob, buyerCat: Young, salesMonth: Feb/2010
Sales Amount: $640, location: US, salesperson: Bob, buyerCat: Young, salesMonth: Feb/2010
此措施将被阻止进入数据集市,因为所有维度成员都被用作复合键。我不正确吗?
答案 0 :(得分:3)
如果您发现这会有问题,那么您可能需要查看数据模型并质疑为什么要加载多个使用完全相同维度的行。
在你给出的例子中,大概是那些实际上不同的销售。如果是这样,它们可能会在不同的日子发生 - 但您只是在月级录制,因此您丢失了这些数据。如果您将确切日期包含在维度中,那么您的重复问题就会消失。或者,如果两个销售可能在同一天,也许可以记录销售中的交易编号并将其用作退化维度 - 再次,您不再拥有使用相同维度的行。
交易事实表应根据事件对事物进行建模 - 在您的示例的情况下,发生销售 - 并且他们应该参考足够的维度来唯一地标识该事件的每个特定事件。
如果您真的不关心将数据保持在最精细的数据中,那么您构建的不是事务事实表,而是可能类似于定期快照事实表。在这种情况下,您应该总结这两行,这样您就可以拥有一行,销售金额为740美元。
但是,我会非常小心以这种方式建立一个仓库,而不是建立最低谷物的交易事实表 - 即使没有人想要报告或分析到现在这个级别,他们可能会我希望以后能够重构你的数据仓库和你的ETL以更低的粮食工作。然而,如果您以尽可能低的粒度创建事务事实表,则始终可以聚合 - 无论您的用户是在SSAS等OLAP工具中执行此操作,还是创建一些聚合表或视图以便于报告。< / p>
答案 1 :(得分:1)
最好避免使用复合键或任何与业务相关的键来唯一标识事实表行。我可以向您保证,您将找到许多共享相同维度密钥的记录。使用Kimball website提供的步骤清楚地定义您的事实表格粒度,您无需担心事实行的唯一性
答案 2 :(得分:0)
除非您将复合键定义为唯一,否则您可以拥有所需的重复项。