我的仓库中有三个事实可以是我的关系数据库中的相关事件。他们是 PhoneContact ,约会和捐款。 PhoneContact 可以导致 Appoinment 和/或捐赠。我已经有 Apppointment 和捐赠事实及其相关维度,现在我将 PhoneContact 添加到我的仓库。所有这些事实之间的共同维度是捐赠者维度,其描述了谁接到呼叫并进行了预约和捐赠。
如果 PhoneContact 确实导致了约会和/或捐款,我想加入这些事实,但我的理解是加入事实是一个禁忌。我如何最好地联系这些事实?现在我想不出更好的东西,所以我正在考虑在我的Phonecontacts事实中添加AppointmentID和DonationID字段。
更多信息:每月大约有1.2M PhoneContacts ,但只有大约100k会产生约会或捐款,所以请放在一边从不加入事实,只需每月将1.1M NULL
s放入表中,这样我就可以得到100K其他事件似乎不太好。
答案 0 :(得分:1)
在空间和性能之间似乎需要权衡。似乎加入可以节省空间。另一方面,如果我们使用非规范化表(已连接),则通过需要扫描整个表的查询,我们可能会在复杂的组上获得更好的性能。
请注意,在某些情况下加入会便宜一些:
如果您的表是根据连接键排序的,则连接的开销会更低(因为我们将使用合并连接算法)。
如果您的查询只产生少量的行(例如,向我提供有关John的信息),则可以使用良好的索引来进行连接。
如果您认为用例始终属于上述类别,并且您可以轻松购买更多磁盘空间,则创建已联接的表可以帮助提高查询速度。