Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 避免加入事实表的策略_Sql Server_Dimensional Modeling_Fact - Fatal编程技术网

Sql server 避免加入事实表的策略

Sql server 避免加入事实表的策略,sql-server,dimensional-modeling,fact,Sql Server,Dimensional Modeling,Fact,我的仓库中有三个事实可以是关系数据库中的相关事件。它们是电话联系、预约和捐赠。电话联系可能导致任命和/或捐赠。我已经有了AppPoint和捐赠事实及其相关维度,现在正在将PhoneContact添加到我的仓库中。所有这些事实之间的共同维度是捐赠者维度,它描述了谁接到了电话,谁进行了预约和捐赠 如果电话联系确实导致约会和/或捐赠,我想加入这些事实,但我的理解是加入事实是不允许的。我如何最好地将这些事实联系起来?现在我想不出更好的了,所以我正在考虑在我的Phonecontacts中添加Appoint

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

如果电话联系确实导致约会和/或捐赠,我想加入这些事实,但我的理解是加入事实是不允许的。我如何最好地将这些事实联系起来?现在我想不出更好的了,所以我正在考虑在我的Phonecontacts中添加AppointId和DonationID字段


更多信息:每月约有120万个电话联系人,但其中只有约10万个是预约或捐赠的,因此除了不加入facts之外,仅将每月110万次的
NULL
s放入表中,这样我就可以获得10万次其他活动,这似乎不太好。

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

请注意,在某些情况下,加入可以降低成本:

  • 如果您的表是基于连接键排序的,那么连接的成本会更低(因为我们将使用合并连接算法)

  • 如果您的查询产生的行数很小(例如,告诉我John的信息),那么可以使用漂亮的索引进行连接


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

约会和捐赠表中的行是否总是与
电话联系人
相关?如果是这样的话,考虑一下问题的头绪——创建一个FK栏,从<代码>约会> /代码>和<代码>捐款> /代码>表格。好问题“迈克”。事实并非如此。可以有
约会
捐赠
,而不需要
电话联系人
。只要我的两分钱:与任何数据仓库一样,我建议展示一种能够最大限度地减少给最终用户带来惊喜的模型。虽然
约会
捐赠
行有时仅在
电话联系人
表中有相应的行,但对于最终用户来说,稀疏FK列可能是最“自然”的解决方案。更规范化的解决方案,如添加多对多表,将消除空值,但它并不真正属于数据仓库。因此,加入事实表可能是你必须选择的较小的弊病。你回答了你自己的问题:你通过捐赠者维度加入它们。无论如何,您应该在业务问题中表述DW的需求。问什么问题需要将所有事实结合起来?