0

我正在为联系历史事实表设计数据仓库事实表。我当前的架构看起来像这样:

[FK] DateKey INT
[FK] TimeKey INT
[NK] CustomerNK INT
[NK] CustomerPhoneNK INT
[FK] ContactTypeKey INT
[FK] ContactResultKey INT
[BK] ContactRefBK INT
     ContactTS DATETIME
     Counter INT (=1)

我的应用程序要求之一是为维度ContactResult上的选择列表找到最新的。ContactTypeContactType维度具有一个ContactClass属性,该属性将用于标识要作为过滤依据的值范围。

上述结构让我可以通过 获取ContactType选择的所有联系信息ContactClass,并且我可以处理该列表以获取最新值。

问题是,任何人都可以建议对上述内容进行修改,以便更轻松地获取特定的最近联系事件ContactClass吗?目前这是一个事务性事实表,但如果它可以提高可用性,我很乐意对其进行更改。

此操作将针对广泛的客户 (200K+) 相当频繁地运行,因此性能很重要。该操作将在 Web 界面上以 C# 代码完成,因此在这种情况下,特定于 BI 工具的解决方案对我没有用处。

到目前为止,我想出的唯一想法是一个累积事实表,它只记录每个ContactClass. 对此选项的任何改进将不胜感激。

4

2 回答 2

0

如果性能很重要,并且可以选择批处理,那么您可以预先计算并将“最新联系人”属性保存在事实或 ContactType 维度中。

这两种操作都需要您更新历史事实记录以将它们设置为“不再是最新联系人”,但如果您预先计算此属性,您将获得更好的性能。

我倾向于将此属性添加到维度,并更新历史 SK 以反映不是“最新联系人”的维度成员。

经过一番思考,可能有一种聪明的方法来进行此更新。

于 2013-10-03T01:39:45.070 回答
0

如果性能是关键,那么我认为最新联系人的附加事实表就可以了。毕竟,这就是数据集市的用途——预先聚合数据以获得快速性能。它不是一个累积的快照,它通常有几个时间维度的外键,以测量事件之间的时间跨度。

看起来 200k+ 并不是一个非常大的数字,因此您可以通过视图以更简单的方式实现相同的目标。我可能有错误的列,但是这样的事情在索引到位的情况下会非常快:

SELECT ContactTypeKey, MAX(ContactTs) FROM factContact GROUP BY ContactTypeKey

然后,该视图可用于通过 ContactTypeKey 和 ContactTs 连接回事实表以返回 ContactResult。这假设您的表名称是 factContact,并且 ContactTs 确定最近的等等。实际上,您可能需要加入日期维度来计算最近的,并且您可能需要按更多维度进行分组,或者可能加入到contactType 维度和按 ContactClass 分组。我有时会使用这种策略,但很难说它在这里应用得有多好。

于 2014-12-12T15:04:12.627 回答