避免加入事实表的策略

时间:2013-12-20 00:12:38

标签: sql-server dimensional-modeling fact

我的仓库中有三个事实可以是我的关系数据库中的相关事件。他们是 PhoneContact 约会捐款 PhoneContact 可以导致 Appoinment 和/或捐赠。我已经有 Apppointment 捐赠事实及其相关维度,现在我将 PhoneContact 添加到我的仓库。所有这些事实之间的共同维度是捐赠者维度,其描述了谁接到呼叫并进行了预约和捐赠。

如果 PhoneContact 确实导致了约会和/或捐款,我想加入这些事实,但我的理解是加入事实是一个禁忌。我如何最好地联系这些事实?现在我想不出更好的东西,所以我正在考虑在我的Phonecontacts事实中添加AppointmentID和DonationID字段。

更多信息:每月大约有1.2M PhoneContacts ,但只有大约100k会产生约会捐款,所以请放在一边从不加入事实,只需每月将1.1M NULL s放入表中,这样我就可以得到100K其他事件似乎不太好。

1 个答案:

答案 0 :(得分:1)

在空间和性能之间似乎需要权衡。似乎加入可以节省空间。另一方面,如果我们使用非规范化表(已连接),则通过需要扫描整个表的查询,我们可能会在复杂的组上获得更好的性能。

请注意,在某些情况下加入会便宜一些:

  • 如果您的表是根据连接键排序的,则连接的开销会更低(因为我们将使用合并连接算法)。

  • 如果您的查询只产生少量的行(例如,向我提供有关John的信息),则可以使用良好的索引来进行连接。

如果您认为用例始终属于上述类别,并且您可以轻松购买更多磁盘空间,则创建已联接的表可以帮助提高查询速度。