Sql server 避免加入事实表的策略
我的仓库中有三个事实可以是关系数据库中的相关事件。它们是电话联系、预约和捐赠。电话联系可能导致任命和/或捐赠。我已经有了AppPoint和捐赠事实及其相关维度,现在正在将PhoneContact添加到我的仓库中。所有这些事实之间的共同维度是捐赠者维度,它描述了谁接到了电话,谁进行了预约和捐赠 如果电话联系确实导致约会和/或捐赠,我想加入这些事实,但我的理解是加入事实是不允许的。我如何最好地将这些事实联系起来?现在我想不出更好的了,所以我正在考虑在我的Phonecontacts中添加AppointId和DonationID字段Sql server 避免加入事实表的策略,sql-server,dimensional-modeling,fact,Sql Server,Dimensional Modeling,Fact,我的仓库中有三个事实可以是关系数据库中的相关事件。它们是电话联系、预约和捐赠。电话联系可能导致任命和/或捐赠。我已经有了AppPoint和捐赠事实及其相关维度,现在正在将PhoneContact添加到我的仓库中。所有这些事实之间的共同维度是捐赠者维度,它描述了谁接到了电话,谁进行了预约和捐赠 如果电话联系确实导致约会和/或捐赠,我想加入这些事实,但我的理解是加入事实是不允许的。我如何最好地将这些事实联系起来?现在我想不出更好的了,所以我正在考虑在我的Phonecontacts中添加Appoint
更多信息:每月约有120万个电话联系人,但其中只有约10万个是预约或捐赠的,因此除了不加入facts之外,仅将每月110万次的
NULL
s放入表中,这样我就可以获得10万次其他活动,这似乎不太好。在空间和性能之间似乎存在着权衡。看来加入会节省空间。另一方面,如果我们使用一个非规范化的表(已经连接),我们可能会在需要扫描整个表的复杂group by查询上获得更好的性能
请注意,在某些情况下,加入可以降低成本:
- 如果您的表是基于连接键排序的,那么连接的成本会更低(因为我们将使用合并连接算法)
- 如果您的查询产生的行数很小(例如,告诉我John的信息),那么可以使用漂亮的索引进行连接
如果您认为您的用例始终不属于上述类别,并且您可以轻松购买更多磁盘空间,那么创建一个已加入的表有助于提高查询速度。约会和捐赠表中的行是否总是与
电话联系人
相关?如果是这样的话,考虑一下问题的头绪——创建一个FK栏,从<代码>约会> /代码>和<代码>捐款> /代码>表格。好问题“迈克”。事实并非如此。可以有约会
或捐赠
,而不需要电话联系人
。只要我的两分钱:与任何数据仓库一样,我建议展示一种能够最大限度地减少给最终用户带来惊喜的模型。虽然约会
和捐赠
行有时仅在电话联系人
表中有相应的行,但对于最终用户来说,稀疏FK列可能是最“自然”的解决方案。更规范化的解决方案,如添加多对多表,将消除空值,但它并不真正属于数据仓库。因此,加入事实表可能是你必须选择的较小的弊病。你回答了你自己的问题:你通过捐赠者维度加入它们。无论如何,您应该在业务问题中表述DW的需求。问什么问题需要将所有事实结合起来?