0

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

如果PhoneContact确实导致了Appointment和/或Donation,我想加入这些事实,但我的理解是加入事实是一个禁忌。我将如何最好地关联这些事实?现在我想不出更好的办法,所以我正在考虑将 AppointmentID 和 DonationID 字段放在我的 Phonecontacts 事实中。

更多信息:每月大约有 120 万个电话联系人,但其中只有大约 10 万个导致约会捐赠,所以除了不加入事实之外,每月只需将 110 万NULL个放入表中,这样我就可以获得 10 万个其他事件不太好。

4

1 回答 1

1

这里似乎在空间和性能之间进行了权衡。似乎加入会节省空间。另一方面,如果我们使用非规范化表(已经加入),我们可能会在需要扫描整个表的复杂 group by 查询中获得更好的性能。

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

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

  • 如果您的查询产生的行数很少(例如,给我有关 John 的信息),那么通过不错的索引加入将是负担得起的。

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

于 2019-12-26T06:00:45.333 回答