具有多个值的Web流的维度模型

时间:2012-11-15 18:51:03

标签: database-design data-warehouse dimensional-modeling

寻找一些帮助来阐明维度模型。我正在研究什么归结为Web事件分析 - 给定Web日志,我想解析并存储URL中存在的变量。诀窍是这些变量并不总是预定义的,有时变量可能包含多个值。

让我们来看一个假设。如果我有一个像

这样的查询字符串

session_id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c

我的目标是能够通过这些键的任意组合来计算聚合。例如,我可能会说“有多少页面命中具有value3a的key3值”,或“有多少页面命中的key1值为value1而key3值为value3b”。为了增加复杂性,最终可能会出现key4和key5等,并且可能没有足够的预警能够在值出现之前进行尺寸模型更改。

一种方法可能是创建3维表,dim_key1dim_key2dim_key3,每个表都包含id字段和value字段。

然后我的事实表可能看起来像

id, session_id, dim_key1, dim_key2, dim_key3, count

这样做的缺点是我需要在事实表中创建3行,以便从查询字符串中正确捕获key3的3个值。此外,对于出现的每个维度,我都需要提前通知,并且需要创建我的新维度表。

另一种更适合dim_key3的方法可能是创建一个像

这样的维度表

id, value3a, value3b, value3c, ...

其中该表中的行由表示这些值组合的1和0组成。因此,例如,上面的查询字符串将有一个类似1, 1, 1, 1, 0, 0, ...的行,而页面命中事实表的dim_key3维度ID为1。

从好的方面来说,每个页面命中只会在事实表中有一个条目,而维度表可以保持稀疏表示,我们只在其中为我们实际看到的组合创建新行(即我们不要不需要所有key3组合的功率集。在缺点方面,key3的每个新值仍然需要添加到该昏暗表中的新列。

最后一点想法,dim_key3会有一个像id, value_list这样的表,其中value_list存储以逗号分隔的值列表。这与“每个值的列”方法类似,但只是保持更紧凑的表示。在这种情况下,我们可能会有一个像1, "value3a,value3b,value3c"这样的维度行。

类似地,这只需要事实表中的一行,并且作为一个额外的优点,当新值出现时不需要新列。缺点是它会在查询中增加一些复杂性,不得不进行全文匹配/正则表达式。 (如果有兴趣的话,我可以进一步了解,但我觉得我已经进行了足够长的时间)。

我查看了几个参考资料,包括Kimball的“数据仓库工具包”,但没有发现任何直接回答我问题的内容。大多数click / web / eventstream分析维模型示例都有一组固定的不变和奇值变量。

我所描述的三种方法中的任何一种方法是否合理,和/或是否有人对我错过的另一种模型有任何建议?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果设计中的事实表包含页面加载和键之间的每个关联的行,那么该怎么做:

RowID, SessionID, PageLoadID, KeyValuePairID, DateKey, etc.

KeyValuePair维度表将具有:

KeyValuePairID, Key, Value

因此,对于您的示例,您将创建维度行

1 key1 value1
2 key2 value2
3 key3 value3a
4 key3 value3b
5 key3 value3c

然后您可以执行相交查询以查找答案

Select Intersect(
    NonEmpty([Session].Members, [KeyValuePair].&[Key1][Value1]),
    NonEmpty([Session].Members, [KeyValuePair].&[Key3][Value3a])) on 0
From myCube